commit cf218090520fd8ebb362c78814592b75b9857015 Author: Nathan Freitas nathan@freitas.net Date: Mon Nov 17 23:28:33 2014 -0500
improves in start/stop logic for background service --- src/org/torproject/android/Orbot.java | 31 +++-- src/org/torproject/android/service/TorService.java | 120 ++++++++++---------- .../android/service/TorServiceConstants.java | 11 ++ .../android/service/TorServiceUtils.java | 2 +- 4 files changed, 92 insertions(+), 72 deletions(-)
diff --git a/src/org/torproject/android/Orbot.java b/src/org/torproject/android/Orbot.java index d8e1f6b..d1c111a 100644 --- a/src/org/torproject/android/Orbot.java +++ b/src/org/torproject/android/Orbot.java @@ -106,7 +106,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("log"));
- startService("init"); + startService(TorServiceConstants.CMD_INIT); } // Our handler for received Intents. This will be called whenever an Intent @@ -154,7 +154,14 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic torService.setAction(action); startService(torService); - + } + + private void stopService () + { + + Intent torService = new Intent(this, TorService.class); + stopService(torService); + } private void doLayout () @@ -412,7 +419,9 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic { if (mItemOnOff != null) mItemOnOff.setTitle(R.string.menu_start); + stopTor(); + stopService ();
}
@@ -472,7 +481,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic //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 (); //onDestroy();
@@ -855,7 +864,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic } else if (request == REQUEST_VPN && response == RESULT_OK) { - startService("vpn"); + startService(TorServiceConstants.CMD_VPN); } } @@ -871,21 +880,21 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic } else { - startService("vpn"); + startService(TorServiceConstants.CMD_VPN);
} }
private boolean flushTransProxy () { - startService("flush"); + startService(TorServiceConstants.CMD_FLUSH); return true; }
private boolean updateSettings () { //todo send service command - startService("update"); + startService(TorServiceConstants.CMD_UPDATE); return true; }
@@ -1022,7 +1031,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic {
- startService ("start"); + startService (TorServiceConstants.CMD_START); torStatus = TorServiceConstants.STATUS_CONNECTING; mTxtOrbotLog.setText(""); @@ -1050,7 +1059,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic private void stopTor () throws RemoteException { - startService ("stop"); + startService (TorServiceConstants.CMD_STOP); torStatus = TorServiceConstants.STATUS_OFF;
// mService.setProfile(TorServiceConstants.STATUS_OFF); @@ -1058,6 +1067,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic mHandler.sendMessage(msg);
+ }
/* @@ -1080,6 +1090,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic { stopTor(); + stopService (); } @@ -1303,7 +1314,7 @@ public class Orbot extends ActionBarActivity implements TorConstants, OnLongClic
public void spinOrbot (float direction) { - startService ("newnym"); + startService (TorServiceConstants.CMD_NEWNYM); //mService.newIdentity(); //request a new identity //TODO trigger newnym diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java index aeca556..adb6fcf 100644 --- a/src/org/torproject/android/service/TorService.java +++ b/src/org/torproject/android/service/TorService.java @@ -377,31 +377,31 @@ public class TorService extends Service implements TorServiceConstants, TorConst if (action!=null) { - if(action.equals(Intent.ACTION_BOOT_COMPLETED)||action.equals("start")) + if(action.equals(Intent.ACTION_BOOT_COMPLETED)||action.equals(CMD_START)) { setTorProfile(STATUS_ON); } - else if (action.equals("stop")) + else if (action.equals(CMD_STOP)) { setTorProfile(STATUS_OFF); } - else if (action.equals("init")) + else if (action.equals(CMD_INIT)) { sendCallbackStatus(mCurrentStatus); } - else if (action.equals("newnym")) + else if (action.equals(CMD_NEWNYM)) { newIdentity(); } - else if (action.equals("flush")) + else if (action.equals(CMD_FLUSH)) { flushTransparentProxyRules(); } - else if (action.equals("update")) + else if (action.equals(CMD_UPDATE)) { processSettings(); } - else if (action.equals("vpn")) + else if (action.equals(CMD_VPN)) { startVpnService(); } @@ -774,7 +774,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst }
- public void startTor () throws Exception + private void startTor () throws Exception { mCurrentStatus = STATUS_CONNECTING; @@ -1074,6 +1074,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst int attempt = 0; + + logNotice( "Waiting for control port..."); + while (conn == null && attempt++ < maxTries) { try @@ -1098,13 +1101,13 @@ public class TorService extends Service implements TorServiceConstants, TorConst catch (Exception ce) { conn = null; - logException( "Error connecting to Tor local control port: " + ce.getMessage(),ce); + // logException( "Error connecting to Tor local control port: " + ce.getMessage(),ce); } try { - logNotice("waiting..."); + // logNotice("waiting..."); Thread.sleep(1000); } catch (Exception e){} @@ -1264,7 +1267,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst { if (fileControlPort.exists()) { - logNotice("Reading control port config file: " + fileControlPort.getCanonicalPath()); + debug("Reading control port config file: " + fileControlPort.getCanonicalPath()); BufferedReader bufferedReader = new BufferedReader(new FileReader(fileControlPort)); String line = bufferedReader.readLine(); @@ -1284,7 +1287,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst } else { - logNotice("Control Port config file does not yet exist (waiting for tor): " + fileControlPort.getCanonicalPath()); + debug("Control Port config file does not yet exist (waiting for tor): " + fileControlPort.getCanonicalPath()); } @@ -1292,11 +1295,11 @@ public class TorService extends Service implements TorServiceConstants, TorConst } catch (FileNotFoundException e) { - logNotice("unable to get control port; file not found"); + debug("unable to get control port; file not found"); } catch (Exception e) { - logNotice("unable to read control port config file"); + debug("unable to read control port config file"); }
return result; @@ -1376,37 +1379,53 @@ public class TorService extends Service implements TorServiceConstants, TorConst }
- public void setTorProfile(int profile) { + public void setTorProfile(int newState) { - if (profile == STATUS_ON && mCurrentStatus != STATUS_ON) + if (newState == STATUS_ON) { - sendCallbackLogMessage (getString(R.string.status_starting_up)); - - try - { - startTor(); - - } - catch (Exception e) - { - - logException("Unable to start Tor: " + e.toString(),e); - mCurrentStatus = STATUS_OFF; - sendCallbackStatus(mCurrentStatus); - - showToolbarNotification(getString(R.string.unable_to_start_tor) + ": " + e.getMessage(), ERROR_NOTIFY_ID, R.drawable.ic_stat_notifyerr); - stopTor(); - } + if (mCurrentStatus == STATUS_OFF) + { + sendCallbackLogMessage (getString(R.string.status_starting_up)); + + + try + { + + boolean found = findExistingProc (); + + if (!found) + { + killProcess(fileTor); + killProcess(filePolipo); + + startTor(); + } + } + catch (Exception e) + { + + logException("Unable to start Tor: " + e.toString(),e); + mCurrentStatus = STATUS_OFF; + sendCallbackStatus(mCurrentStatus); + + showToolbarNotification(getString(R.string.unable_to_start_tor) + ": " + e.getMessage(), ERROR_NOTIFY_ID, R.drawable.ic_stat_notifyerr); + stopTor(); + } + + } } - else if (profile == STATUS_OFF && mCurrentStatus != STATUS_OFF) + else if (newState == STATUS_OFF) { - sendCallbackLogMessage (getString(R.string.status_shutting_down)); - - stopTor(); - - mCurrentStatus = STATUS_OFF; - sendCallbackStatus(mCurrentStatus); + if (mCurrentStatus == STATUS_ON) + { + sendCallbackLogMessage (getString(R.string.status_shutting_down)); + + stopTor(); + + mCurrentStatus = STATUS_OFF; + sendCallbackStatus(mCurrentStatus); + } } } @@ -1733,27 +1752,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst }
- - public boolean checkAndInitImpl () - { - if (fileTor != null) - { - try { - if (TorServiceUtils.findProcessId(fileTor.getCanonicalPath()) != -1) - { - initialize(); - return true; - } - } catch (IOException e) { - logException("error init Tor", e); - } - - } - - return false; - } - -
public void processSettings () { diff --git a/src/org/torproject/android/service/TorServiceConstants.java b/src/org/torproject/android/service/TorServiceConstants.java index 0b64856..d979ac4 100644 --- a/src/org/torproject/android/service/TorServiceConstants.java +++ b/src/org/torproject/android/service/TorServiceConstants.java @@ -76,6 +76,17 @@ public interface TorServiceConstants { public static final int DISABLE_TOR_MSG = 3; 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_INIT = "init"; + public static final String CMD_VPN = "vpn"; + public static final String CMD_UPDATE = "update"; + + + + public static final String BINARY_TOR_VERSION = "0.2.5.10-openssl1.0.1i-nonPIE-polipofix"; public static final String PREF_BINARY_TOR_VERSION_INSTALLED = "BINARY_TOR_VERSION_INSTALLED";
diff --git a/src/org/torproject/android/service/TorServiceUtils.java b/src/org/torproject/android/service/TorServiceUtils.java index 0038a5c..a22b328 100644 --- a/src/org/torproject/android/service/TorServiceUtils.java +++ b/src/org/torproject/android/service/TorServiceUtils.java @@ -108,7 +108,7 @@ public class TorServiceUtils implements TorServiceConstants { } }
- procPs.destroy(); + try { procPs.destroy(); } catch (Exception e) {} // try to destroy just to make sure we clean it up
return procId;
tor-commits@lists.torproject.org