diff options
-rw-r--r-- | app/src/main/AndroidManifest.xml | 1 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/ConsoleActivity.java | 33 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/service/ConnectionNotifier.java | 12 |
3 files changed, 46 insertions, 0 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 406f3b9..2bfc525 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,6 +78,7 @@ android:launchMode="singleTop" android:hardwareAccelerated="false"> <intent-filter> <action android:name="android.intent.action.VIEW" /> + <action android:name="org.connectbot.action.DISCONNECT" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="ssh" /> diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java index e7a8f7d..4c7fa38 100644 --- a/app/src/main/java/org/connectbot/ConsoleActivity.java +++ b/app/src/main/java/org/connectbot/ConsoleActivity.java @@ -18,6 +18,8 @@ package org.connectbot; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.connectbot.bean.SelectionArea; @@ -80,6 +82,7 @@ import de.mud.terminal.vt320; public class ConsoleActivity extends Activity { public final static String TAG = "CB.ConsoleActivity"; + public static final String DISCONNECT_ACTION = "org.connectbot.action.DISCONNECT"; protected static final int REQUEST_EDIT = 1; @@ -139,6 +142,8 @@ public class ConsoleActivity extends Activity { private boolean inActionBarMenu = false; private boolean titleBarHide; + private boolean waitingForDisconnectAll = false; + private ServiceConnection connection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { bound = ((TerminalManager.TerminalBinder) service).getService(); @@ -176,6 +181,13 @@ public class ConsoleActivity extends Activity { } setDisplayedTerminal(requestedIndex); + + // This needs to happen after the views are constructed in order to + // know when it's safe to kill this activity. + if (waitingForDisconnectAll) { + waitingForDisconnectAll = false; + disconnectAll(); + } } public void onServiceDisconnected(ComponentName className) { @@ -908,6 +920,11 @@ public class ConsoleActivity extends Activity { if (forcedOrientation && bound != null) bound.setResizeAllowed(true); + + if (getIntent().getAction() == DISCONNECT_ACTION) { + Log.d(TAG, "Got disconnect request"); + disconnectAll(); + } } /* (non-Javadoc) @@ -918,6 +935,7 @@ public class ConsoleActivity extends Activity { super.onNewIntent(intent); Log.d(TAG, "onNewIntent called"); + setIntent(intent); requested = intent.getData(); @@ -1115,6 +1133,21 @@ public class ConsoleActivity extends Activity { } /** + * Disconnects and closes all open terminals. + */ + private void disconnectAll() { + // TODO(jklein24): Show a confirm dialog before actually disconnecting. + if (bound == null) { + waitingForDisconnectAll = true; + return; + } + // Copy the bridges list because bridges are removed from the array when disconnected. + for (TerminalBridge bridge : new ArrayList<TerminalBridge>(bound.bridges)) { + bridge.dispatchDisconnect(true); + } + } + + /** * Adds a new TerminalBridge to the current set of views in our ViewFlipper. * * @param bridge TerminalBridge to add to our ViewFlipper diff --git a/app/src/main/java/org/connectbot/service/ConnectionNotifier.java b/app/src/main/java/org/connectbot/service/ConnectionNotifier.java index c480143..38b911b 100644 --- a/app/src/main/java/org/connectbot/service/ConnectionNotifier.java +++ b/app/src/main/java/org/connectbot/service/ConnectionNotifier.java @@ -45,6 +45,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 +117,17 @@ public abstract class ConnectionNotifier { builder.setContentTitle(res.getString(R.string.app_name)); builder.setContentText(res.getString(R.string.app_is_running)); + Intent notificationIntent = new Intent(context, ConsoleActivity.class); + notificationIntent.setAction(ConsoleActivity.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, + notificationIntent, + 0)); + return builder.build(); } |