use context.stopService() to shutdown TorService instead of custom message

Since running stopService() automatically triggers Service.onDestroy(),
there is a nice way to hook in and run the shutdown procedure.  This
provides an obvious point of entry as well as simplifying the shutdown
procedure.
This commit is contained in:
Hans-Christoph Steiner 2015-06-09 14:01:01 -04:00
parent bfb0a80a18
commit 6ac9a2cee6
4 changed files with 38 additions and 105 deletions

View File

@ -11,7 +11,7 @@
<string name="status_starting_up">Orbot is starting&#8230;</string>
<string name="status_activated">Connected to the Tor network</string>
<string name="status_disabled">Orbot is deactivated</string>
<string name="status_shutting_down">Orbot is shutting down</string>
<string name="status_shutting_down">TorService is shutting down</string>
<string name="tor_process_starting">Starting Tor client&#8230;</string>
<string name="tor_process_complete">complete.</string>
<string name="tor_process_waiting">waiting.</string>

View File

@ -121,22 +121,16 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
torService.setAction(action);
startService(torService);
}
private void stopService ()
{
Intent torService = new Intent(this, TorService.class);
stopService(torService);
}
private void stopTor() {
Intent torService = new Intent(this, TorService.class);
stopService(torService);
}
// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get extra data included in the Intent
@ -425,34 +419,21 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
}
/**
* This is our attempt to REALLY exit Orbot, and stop the background service
* However, Android doesn't like people "quitting" apps, and/or our code may not
* be quite right b/c no matter what we do, it seems like the TorService still exists
**/
private void doExit ()
{
try {
//one of the confusing things about all of this code is the multiple
//places where things like "stopTor" are called, both in the Activity and the Service
//not something to tackle in your first iteration, but i thin we can talk about fixing
//terminology but also making sure there are clear distinctions in control
stopTor();
stopService ();
} catch (RemoteException e) {
Log.w(TAG, e);
}
//Kill all the wizard activities
setResult(RESULT_CLOSE_ALL);
finish();
}
/**
* This is our attempt to REALLY exit Orbot, and stop the background service
* However, Android doesn't like people "quitting" apps, and/or our code may
* not be quite right b/c no matter what we do, it seems like the TorService
* still exists
**/
private void doExit() {
stopTor();
// Kill all the wizard activities
setResult(RESULT_CLOSE_ALL);
finish();
}
protected void onPause() {
try
{
@ -1223,49 +1204,20 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
msg.getData().putString(HANDLER_TOR_MSG, getString(R.string.status_starting_up));
mStatusUpdateHandler.sendMessage(msg);
}
//now we stop Tor! amazing!
private void stopTor () throws RemoteException
{
sendIntentToService (TorServiceConstants.CMD_STOP);
torStatus = TorServiceConstants.STATUS_OFF;
Message msg = mStatusUpdateHandler.obtainMessage(TorServiceConstants.DISABLE_TOR_MSG);
mStatusUpdateHandler.sendMessage(msg);
}
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
public boolean onLongClick(View view) {
try
{
if (torStatus == TorServiceConstants.STATUS_OFF)
{
startTor();
}
else
{
stopTor();
stopService ();
}
return true;
public boolean onLongClick(View view) {
try {
if (torStatus == TorServiceConstants.STATUS_OFF) {
startTor();
} else {
stopTor();
}
catch (Exception e)
{
Log.d(TAG,"error onclick",e);
}
return false;
return true;
} catch (RemoteException e) {
Log.d(TAG, "error onclick", e);
}
return false;
}
// this is what takes messages or values from the callback threads or other non-mainUI threads
//and passes them back into the main UI thread for display to the user

View File

@ -343,8 +343,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (action != null) {
if (action.equals(CMD_START)) {
startTor();
} else if (action.equals(CMD_STOP)) {
stopTor();
// stopTor() is called when the Service is destroyed
} else if (action.equals(CMD_NEWNYM)) {
newIdentity();
} else if (action.equals(CMD_FLUSH)) {
@ -371,20 +370,9 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
@Override
public boolean stopService(Intent name) {
logNotice("TorService is being stopped: " + name);
return super.stopService(name);
}
@Override
public void onDestroy ()
{
Log.i("TorService", "onDestroy");
String msg = ("TorService is being DESTROYED... shutting down!");
Log.d(TAG, msg);
sendCallbackLogMessage(msg);
public void onDestroy() {
stopTor();
unregisterReceiver(mNetworkStateReceiver);
clearNotifications ();
super.onDestroy();
}
@ -392,9 +380,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
Log.i("TorService", "stopTor");
try {
sendCallbackStatus(STATUS_STOPPING);
sendCallbackLogMessage(getString(R.string.status_shutting_down));
Log.d(TAG,"Tor is stopping NOW");
killAllDaemons();
@ -408,13 +394,10 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
shellRoot.close();
}
clearNotifications();
sendCallbackLogMessage(getString(R.string.status_disabled));
}
catch (CannotKillException e)
{
Log.d(TAG, "An error occured stopping Tor", e);
logNotice("An error occured stopping Tor: " + e.getMessage());
sendCallbackLogMessage(getString(R.string.unable_to_reset_tor));
showToolbarNotification(getString(R.string.unable_to_reset_tor),
@ -422,11 +405,10 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
catch (Exception e)
{
Log.d(TAG, "An error occured stopping Tor",e);
logNotice("An error occured stopping Tor: " + e.getMessage());
sendCallbackLogMessage(getString(R.string.something_bad_happened));
}
clearNotifications();
sendCallbackStatus(STATUS_OFF);
}

View File

@ -84,7 +84,6 @@ public interface TorServiceConstants {
public static final int LOG_MSG = 4;
public static final String CMD_START = "start";
public static final String CMD_STOP = "stop";
public static final String CMD_FLUSH = "flush";
public static final String CMD_NEWNYM = "newnym";
public static final String CMD_VPN = "vpn";