diff options
Diffstat (limited to 'app')
4 files changed, 85 insertions, 13 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 406f3b9..61bace5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ android:backupAgent=".service.BackupAgent" android:killAfterRestore="true"> - <activity android:name=".HostListActivity" > + <activity android:name=".HostListActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> diff --git a/app/src/main/java/org/connectbot/HostListActivity.java b/app/src/main/java/org/connectbot/HostListActivity.java index 2fd9560..f0fdf16 100644 --- a/app/src/main/java/org/connectbot/HostListActivity.java +++ b/app/src/main/java/org/connectbot/HostListActivity.java @@ -65,6 +65,9 @@ import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; public class HostListActivity extends ListActivity { + public final static String TAG = "CB.HostListActivity"; + public static final String DISCONNECT_ACTION = "org.connectbot.action.DISCONNECT"; + public final static int REQUEST_EDIT = 1; public final static int REQUEST_EULA = 2; @@ -88,6 +91,14 @@ public class HostListActivity extends ListActivity { protected boolean makingShortcut = false; + private boolean waitingForDisconnectAll = false; + + /** + * Whether to close the activity when disconnectAll is called. True if this activity was + * only brought to the foreground via the notification button to disconnect all hosts. + */ + private boolean closeOnDisconnectAll = true; + protected Handler updateHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -101,6 +112,10 @@ public class HostListActivity extends ListActivity { // update our listview binder to find the service HostListActivity.this.updateList(); + + if (waitingForDisconnectAll) { + disconnectAll(); + } } public void onServiceDisconnected(ComponentName className) { @@ -129,11 +144,33 @@ public class HostListActivity extends ListActivity { this.hostdb.close(); this.hostdb = null; } + + closeOnDisconnectAll = true; } @Override public void onResume() { super.onResume(); + + // Must disconnectAll before setting closeOnDisconnectAll to know whether to keep the + // activity open after disconnecting. + if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0 && + DISCONNECT_ACTION.equals(getIntent().getAction())) { + Log.d(TAG, "Got disconnect all request"); + disconnectAll(); + } + + // Still close on disconnect if waiting for a disconnect. + closeOnDisconnectAll = waitingForDisconnectAll && closeOnDisconnectAll; + } + + /* (non-Javadoc) + * @see android.app.Activity#onNewIntent(android.content.Intent) + */ + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); } @Override @@ -384,23 +421,45 @@ public class HostListActivity extends ListActivity { public boolean onMenuItemClick(MenuItem item) { // prompt user to make sure they really want this new AlertDialog.Builder(HostListActivity.this) - .setMessage(getString(R.string.delete_message, host.getNickname())) - .setPositiveButton(R.string.delete_pos, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - // make sure we disconnect - if (bridge != null) - bridge.dispatchDisconnect(true); - - hostdb.deleteHost(host); - updateHandler.sendEmptyMessage(-1); - } + .setMessage(getString(R.string.delete_message, host.getNickname())) + .setPositiveButton(R.string.delete_pos, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // make sure we disconnect + if (bridge != null) + bridge.dispatchDisconnect(true); + + hostdb.deleteHost(host); + updateHandler.sendEmptyMessage(-1); + } }) - .setNegativeButton(R.string.delete_neg, null).create().show(); + .setNegativeButton(R.string.delete_neg, null).create().show(); return true; } }); } + /** + * Disconnects all active connections and closes the activity if appropriate. + */ + private void disconnectAll() { + // TODO(jklein24): Show a confirm dialog before actually disconnecting. + if (bound == null) { + waitingForDisconnectAll = true; + return; + } + + bound.disconnectAll(true, false); + updateHandler.sendEmptyMessage(-1); + waitingForDisconnectAll = false; + + if (closeOnDisconnectAll) { + // Clear the intent so that the activity can be relaunched without closing. + // TODO(jlklein): Find a better way to do this. + setIntent(new Intent()); + finish(); + } + } + /** * @param text diff --git a/app/src/main/java/org/connectbot/service/ConnectionNotifier.java b/app/src/main/java/org/connectbot/service/ConnectionNotifier.java index c480143..a68fffc 100644 --- a/app/src/main/java/org/connectbot/service/ConnectionNotifier.java +++ b/app/src/main/java/org/connectbot/service/ConnectionNotifier.java @@ -21,6 +21,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.connectbot.ConsoleActivity; +import org.connectbot.HostListActivity; import org.connectbot.R; import org.connectbot.bean.HostBean; import org.connectbot.util.HostDatabase; @@ -45,6 +46,7 @@ import android.support.v4.app.NotificationCompat; public abstract class ConnectionNotifier { private static final int ONLINE_NOTIFICATION = 1; private static final int ACTIVITY_NOTIFICATION = 2; + private static final int ONLINE_DISCONNECT_NOTIFICATION = 3; public static ConnectionNotifier getInstance() { if (PreferenceConstants.PRE_ECLAIR) @@ -116,6 +118,17 @@ public abstract class ConnectionNotifier { builder.setContentTitle(res.getString(R.string.app_name)); builder.setContentText(res.getString(R.string.app_is_running)); + Intent disconnectIntent = new Intent(context, HostListActivity.class); + disconnectIntent.setAction(HostListActivity.DISCONNECT_ACTION); + builder.addAction( + android.R.drawable.ic_menu_close_clear_cancel, + res.getString(R.string.list_host_disconnect), + PendingIntent.getActivity( + context, + ONLINE_DISCONNECT_NOTIFICATION, + disconnectIntent, + 0)); + return builder.build(); } diff --git a/app/src/main/java/org/connectbot/service/TerminalManager.java b/app/src/main/java/org/connectbot/service/TerminalManager.java index 1688d2a..b5d891d 100644 --- a/app/src/main/java/org/connectbot/service/TerminalManager.java +++ b/app/src/main/java/org/connectbot/service/TerminalManager.java @@ -199,7 +199,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen /** * Disconnect all currently connected bridges. */ - private void disconnectAll(final boolean immediate, final boolean excludeLocal) { + public void disconnectAll(final boolean immediate, final boolean excludeLocal) { TerminalBridge[] tmpBridges = null; synchronized (bridges) { |