commit e132a79a610deb730713b203299ce783533e3aaa Author: Nathan Freitas nathan@freitas.net Date: Mon Jun 22 12:25:37 2015 -0400
improve status request/callback interaction and status UI layout --- res/layout/layout_main.xml | 80 +++++++---- src/org/torproject/android/OrbotMainActivity.java | 149 +++++++++++++------- src/org/torproject/android/service/TorService.java | 53 ++++--- .../android/service/TorServiceConstants.java | 4 +- 4 files changed, 180 insertions(+), 106 deletions(-)
diff --git a/res/layout/layout_main.xml b/res/layout/layout_main.xml index 1b46e55..a0fc1a6 100644 --- a/res/layout/layout_main.xml +++ b/res/layout/layout_main.xml @@ -4,6 +4,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/panel_background_main" + >
<android.support.v7.widget.Toolbar @@ -123,45 +125,58 @@ </RelativeLayout> </LinearLayout> - <FrameLayout + + <ProgressBar + android:id="@+id/pbConnecting" + style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="60dp" + android:visibility="gone" + +android:layout_gravity="center_horizontal|center_vertical"/> + + <LinearLayout android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - - android:background="@color/panel_background_main" - > - <org.torproject.android.ui.ImageProgressView - android:id="@+id/imgStatus" - android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="5dp" - android:padding="0dp" - - android:src="@drawable/toroff" - android:layout_gravity="center_horizontal|center_vertical" /> - - <TextView - android:id="@+id/lblStatus" - android:textColor="@android:color/white" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="16sp" - android:gravity="center_vertical" - android:fontFamily="sans-serif-light" - android:text="" - android:layout_gravity="center_horizontal|bottom" - android:layout_margin="10dp" - - /> + android:id="@+id/frameMain" + android:visibility="visible" + android:orientation="vertical" + android:layout_gravity="center_horizontal|center_vertical" + > + <org.torproject.android.ui.ImageProgressView + android:id="@+id/imgStatus" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight=".8" + + android:padding="0dp" + android:layout_margin="0dp" + android:src="@drawable/toroff" /> + + <TextView + android:id="@+id/lblStatus" + android:textColor="@android:color/white" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="14sp" + android:gravity="center_horizontal" + android:fontFamily="sans-serif-light" + android:text="" + android:lines="2" + android:maxLines="2" + android:layout_gravity="center_horizontal" + android:layout_margin="0dp" + android:layout_marginLeft="5dp" + android:layout_marginRight="5dp" + /> - </FrameLayout> - <LinearLayout android:gravity="center_horizontal" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:background="@color/panel_background_dark" - + android:layout_gravity="bottom" > <Button @@ -203,8 +218,11 @@ /> </LinearLayout> + </LinearLayout> + </LinearLayout> </LinearLayout> + <LinearLayout android:layout_width="320dp" android:layout_height="match_parent" diff --git a/src/org/torproject/android/OrbotMainActivity.java b/src/org/torproject/android/OrbotMainActivity.java index e13f55d..54fe5f1 100644 --- a/src/org/torproject/android/OrbotMainActivity.java +++ b/src/org/torproject/android/OrbotMainActivity.java @@ -54,6 +54,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.View.OnTouchListener; +import android.view.Window; import android.view.animation.AccelerateInterpolator; import android.widget.Button; import android.widget.TextView; @@ -84,7 +85,7 @@ public class OrbotMainActivity extends Activity private Toolbar mToolbar; /* Some tracking bits */ - private String torStatus = TorServiceConstants.STATUS_OFF; //latest status reported from the tor service + private String torStatus = null; //latest status reported from the tor service private Intent lastStatusIntent; // the last ACTION_STATUS Intent received
private SharedPreferences mPrefs = null; @@ -102,7 +103,7 @@ public class OrbotMainActivity extends Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
- mPrefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); + mPrefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
/* Create the widgets before registering for broadcasts to guarantee * that the widgets exist when the status updates try to update them */ @@ -149,6 +150,7 @@ public class OrbotMainActivity extends Activity if (action.equals(TorServiceConstants.LOCAL_ACTION_LOG)) { Message msg = mStatusUpdateHandler.obtainMessage(STATUS_UPDATE); msg.obj = intent.getStringExtra(TorServiceConstants.LOCAL_EXTRA_LOG); + msg.getData().putString("status", intent.getStringExtra(TorServiceConstants.EXTRA_STATUS)); mStatusUpdateHandler.sendMessage(msg);
} else if (action.equals(TorServiceConstants.LOCAL_ACTION_BANDWIDTH)) { @@ -162,13 +164,16 @@ public class OrbotMainActivity extends Activity msg.getData().putLong("upload", upload); msg.getData().putLong("readTotal", read); msg.getData().putLong("writeTotal", written); + msg.getData().putString("status", intent.getStringExtra(TorServiceConstants.EXTRA_STATUS)); + mStatusUpdateHandler.sendMessage(msg);
} else if (action.equals(TorServiceConstants.ACTION_STATUS)) { lastStatusIntent = intent; - torStatus = intent.getStringExtra(TorServiceConstants.EXTRA_STATUS); + Message msg = mStatusUpdateHandler.obtainMessage(STATUS_UPDATE); - msg.obj = ""; + msg.getData().putString("status", intent.getStringExtra(TorServiceConstants.EXTRA_STATUS)); + mStatusUpdateHandler.sendMessage(msg); } } @@ -506,9 +511,9 @@ public class OrbotMainActivity extends Activity // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); - Log.e(TAG, "handleIntents " + action); + Log.d(TAG, "handleIntents " + action);
- String type = intent.getType(); + //String type = intent.getType(); if (action == null) return; @@ -556,21 +561,19 @@ public class OrbotMainActivity extends Activity else if (action.equals("org.torproject.android.START_TOR")) { autoStartFromIntent = true; - try { - startTor(); + + startTor();
- Intent resultIntent; - if (lastStatusIntent == null) { - resultIntent = new Intent(intent); - } else { - resultIntent = lastStatusIntent; - } - resultIntent.putExtra(TorServiceConstants.EXTRA_STATUS, torStatus); - setResult(RESULT_OK, resultIntent); - finish(); - } catch (RemoteException e) { - e.printStackTrace(); + Intent resultIntent; + if (lastStatusIntent == null) { + resultIntent = new Intent(intent); + } else { + resultIntent = lastStatusIntent; } + resultIntent.putExtra(TorServiceConstants.EXTRA_STATUS, torStatus); + setResult(RESULT_OK, resultIntent); + finish(); + } else if (action.equals(Intent.ACTION_VIEW)) { @@ -590,7 +593,7 @@ public class OrbotMainActivity extends Activity } } - updateStatus(""); + updateStatus(null); setIntent(null); @@ -1003,18 +1006,10 @@ public class OrbotMainActivity extends Activity mBtnBridges.setChecked(Prefs.bridgesEnabled()); }
- mStatusUpdateHandler.postDelayed(new Runnable () - { - public void run () - { - - handleIntents(); + requestTorStatus();
- } - } - , 500); - - + updateStatus(null); + }
AlertDialog aDialog = null; @@ -1059,13 +1054,23 @@ public class OrbotMainActivity extends Activity */ private void updateStatus(String torServiceMsg) {
+ if (torStatus == null) + return; //UI not init'd yet + if (torStatus == TorServiceConstants.STATUS_ON) { + imgStatus.setImageResource(R.drawable.toron);
mBtnBrowser.setEnabled(true);
- // everything is running, clear the status message - lblStatus.setText(""); + if (torServiceMsg != null) + { + if (torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_HEADER)) + lblStatus.setText(torServiceMsg); + } + else + lblStatus.setText(getString(R.string.status_activated)); +
boolean showFirstTime = mPrefs.getBoolean("connect_first_time", true);
@@ -1082,23 +1087,30 @@ public class OrbotMainActivity extends Activity { autoStartFromIntent = false; finish(); - Log.e(TAG, "autoStartFromIntent finish"); + Log.d(TAG, "autoStartFromIntent finish"); } + +
} else if (torStatus == TorServiceConstants.STATUS_STARTING) {
imgStatus.setImageResource(R.drawable.torstarting);
- // only show Tor daemon's percentage complete messages - if (torServiceMsg.indexOf('%') != -1) { - lblStatus.setText(torServiceMsg); - } else if (torServiceMsg.contains("tart")) { // Start and start - lblStatus.setText(torServiceMsg); + if (torServiceMsg != null) + { + if (torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_BOOTSTRAPPED)) + lblStatus.setText(torServiceMsg); } + else + lblStatus.setText(getString(R.string.status_starting_up)); + mBtnBrowser.setEnabled(false);
} else if (torStatus == TorServiceConstants.STATUS_STOPPING) {
+ if (torServiceMsg != null && torServiceMsg.contains(TorServiceConstants.LOG_NOTICE_HEADER)) + lblStatus.setText(torServiceMsg); + imgStatus.setImageResource(R.drawable.torstarting); lblStatus.setText(torServiceMsg); mBtnBrowser.setEnabled(false); @@ -1121,22 +1133,32 @@ public class OrbotMainActivity extends Activity * {@link TorServiceConstants#ACTION_START} {@link Intent} to * {@link TorService} */ - private void startTor() throws RemoteException { + private void startTor() { sendIntentToService(TorServiceConstants.ACTION_START); } + + /** + * Request tor status without starting it + * {@link TorServiceConstants#ACTION_START} {@link Intent} to + * {@link TorService} + */ + private void requestTorStatus() { + sendIntentToService(TorServiceConstants.ACTION_STATUS); + }
public boolean onLongClick(View view) { - try { - if (torStatus == TorServiceConstants.STATUS_OFF) { - startTor(); - } else { - stopTor(); - } - return true; - } catch (RemoteException e) { - Log.d(TAG, "error onclick", e); + + if (torStatus == TorServiceConstants.STATUS_OFF) { + lblStatus.setText(getString(R.string.status_starting_up)); + startTor(); + } else { + lblStatus.setText(getString(R.string.status_shutting_down)); + + stopTor(); } - return false; + + return true; + }
// this is what takes messages or values from the callback threads or other non-mainUI threads @@ -1145,11 +1167,30 @@ public class OrbotMainActivity extends Activity
@Override public void handleMessage(final Message msg) { + + String newTorStatus = msg.getData().getString("status"); + String log = (String)msg.obj; + + if (torStatus == null && newTorStatus != null) //first time status + { + torStatus = newTorStatus; + findViewById(R.id.pbConnecting).setVisibility(View.GONE); + findViewById(R.id.frameMain).setVisibility(View.VISIBLE); + updateStatus(log); + + //now you can handle the intents properly + handleIntents(); + + } + else if (newTorStatus != null && !torStatus.equals(newTorStatus)) //status changed + { + torStatus = newTorStatus; + updateStatus(log); + } + else if (log != null) //it is just a log + updateStatus(log); + switch (msg.what) { - case STATUS_UPDATE: - updateStatus((String) msg.obj); - break; - case MESSAGE_TRAFFIC_COUNT:
Bundle data = msg.getData(); diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java index f5fe6e1..bf065c3 100644 --- a/src/org/torproject/android/service/TorService.java +++ b/src/org/torproject/android/service/TorService.java @@ -346,7 +346,11 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon replyWithStatus(mIntent); startTor(); // stopTor() is called when the Service is destroyed - } else if (action.equals(CMD_SIGNAL_HUP)) { + } + else if (action.equals(ACTION_STATUS)) { + replyWithStatus(mIntent); + } + else if (action.equals(CMD_SIGNAL_HUP)) { requestTorRereadConfig(); } else if (action.equals(CMD_NEWNYM)) { newIdentity(); @@ -609,10 +613,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon public void onCreate() { super.onCreate();
- sendCallbackStatus(STATUS_STARTING); - sendCallbackLogMessage(getString(R.string.status_starting_up)); - logNotice(getString(R.string.status_starting_up)); - try { mNumberFormat = NumberFormat.getInstance(Locale.getDefault()); //localized numbers! @@ -760,9 +760,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon */ private void replyWithStatus(Intent startRequest) { String packageName = startRequest.getStringExtra(EXTRA_PACKAGE_NAME); - if (TextUtils.isEmpty(packageName)) { - return; - } + Intent reply = new Intent(ACTION_STATUS); reply.putExtra(EXTRA_STATUS, mCurrentStatus); reply.putExtra(EXTRA_SOCKS_PROXY, "socks://127.0.0.1:" + mPortSOCKS); @@ -771,8 +769,18 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon reply.putExtra(EXTRA_HTTP_PROXY, "http://127.0.0.1" + mPortHTTP); reply.putExtra(EXTRA_HTTP_PROXY_HOST, "127.0.0.1"); reply.putExtra(EXTRA_HTTP_PROXY_PORT, mPortHTTP); - reply.setPackage(packageName); - sendBroadcast(reply); + + if (packageName != null) + { + reply.setPackage(packageName); + sendBroadcast(reply); + } + else + { + LocalBroadcastManager.getInstance(this).sendBroadcast(reply); + + } + }
/** @@ -784,18 +792,20 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon // these states should probably be handled better sendCallbackLogMessage("Ignoring start request, currently " + mCurrentStatus); return; - } else if (mCurrentStatus == STATUS_ON) { + } else if (mCurrentStatus == STATUS_ON && findExistingTorDaemon()) { + sendCallbackLogMessage("Ignoring start request, already started."); + return; - } - - if (findExistingTorDaemon()) { - return; // an old tor is already running, nothing to do - } - + } + // make sure there are no stray daemons running killAllDaemons();
+ sendCallbackStatus(STATUS_STARTING); + sendCallbackLogMessage(getString(R.string.status_starting_up)); + logNotice(getString(R.string.status_starting_up)); + try { if (fileTor == null) initBinariesAndDirectories(); @@ -1882,9 +1892,10 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon Intent intent = new Intent(LOCAL_ACTION_BANDWIDTH);
intent.putExtra("up",upload); - intent.putExtra("down",download); - intent.putExtra("written",written); - intent.putExtra("read",read); + intent.putExtra("down",download); + intent.putExtra("written",written); + intent.putExtra("read",read); + intent.putExtra(EXTRA_STATUS, mCurrentStatus);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } @@ -1895,6 +1906,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon Intent intent = new Intent(LOCAL_ACTION_LOG); // You can also include some extra data. intent.putExtra(LOCAL_EXTRA_LOG, logMessage); + intent.putExtra(EXTRA_STATUS, mCurrentStatus); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} diff --git a/src/org/torproject/android/service/TorServiceConstants.java b/src/org/torproject/android/service/TorServiceConstants.java index adaa674..3d34deb 100644 --- a/src/org/torproject/android/service/TorServiceConstants.java +++ b/src/org/torproject/android/service/TorServiceConstants.java @@ -64,7 +64,9 @@ public interface TorServiceConstants {
//control port public final static String TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE = "Bootstrapped 100%"; - + public final static String LOG_NOTICE_HEADER = "NOTICE"; + public final static String LOG_NOTICE_BOOTSTRAPPED = "Bootstrapped"; + /** * A request to Orbot to transparently start Tor services */
tor-commits@lists.torproject.org