aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2015-07-29 14:44:22 -0700
committerKenny Root <kenny@the-b.org>2015-07-29 14:44:22 -0700
commita50c117765c8795346187a950b1407fe827f3f11 (patch)
tree5cc7c75a940b842fe01408e4881aa5b15594b3ff
parent1a47c5ed12da8893fb2595ae1a99d4082ec36bd7 (diff)
parentf68f157c37890744acea3423b9d4a86394cb2bba (diff)
downloadconnectbot-a50c117765c8795346187a950b1407fe827f3f11.tar.gz
connectbot-a50c117765c8795346187a950b1407fe827f3f11.tar.bz2
connectbot-a50c117765c8795346187a950b1407fe827f3f11.zip
Merge pull request #103 from jklein24/master
Add a disconnect button to the active connection notification
-rw-r--r--app/src/main/AndroidManifest.xml2
-rw-r--r--app/src/main/java/org/connectbot/HostListActivity.java81
-rw-r--r--app/src/main/java/org/connectbot/service/ConnectionNotifier.java13
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalManager.java2
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) {