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();  	} | 
