From da1606001352b56711eb1eeefe6c3006a37fec48 Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Mon, 17 Aug 2015 11:36:14 -0700 Subject: Ensure that immediate disconnection listeners are handled on the UI thread. This will resolve a crash when disconnecting hosts with "close on disconnect" set to true. See https://github.com/connectbot/connectbot/issues/135. --- .../org/connectbot/service/TerminalBridge.java | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'app/src/main/java/org/connectbot/service/TerminalBridge.java') diff --git a/app/src/main/java/org/connectbot/service/TerminalBridge.java b/app/src/main/java/org/connectbot/service/TerminalBridge.java index f7be0ae..6d47f96 100644 --- a/app/src/main/java/org/connectbot/service/TerminalBridge.java +++ b/app/src/main/java/org/connectbot/service/TerminalBridge.java @@ -437,8 +437,7 @@ public class TerminalBridge implements VDUDisplay { if (immediate || (host.getQuickDisconnect() && !host.getStayConnected())) { awaitingClose = true; - if (disconnectListener != null) - disconnectListener.onDisconnected(TerminalBridge.this); + triggerDisconnectListener(); } else { { final String line = manager.res.getString(R.string.alert_disconnect_msg); @@ -454,21 +453,7 @@ public class TerminalBridge implements VDUDisplay { manager.res.getString(R.string.prompt_host_disconnected)); if (result == null || result.booleanValue()) { awaitingClose = true; - - // Tell the TerminalManager that we can be destroyed now. - if (disconnectListener != null) { - // The disconnect listener should be run on the main thread if possible. - if (parent != null) { - parent.post(new Runnable() { - @Override - public void run() { - disconnectListener.onDisconnected(TerminalBridge.this); - } - }); - } else { - disconnectListener.onDisconnected(TerminalBridge.this); - } - } + triggerDisconnectListener(); } } }); @@ -478,6 +463,25 @@ public class TerminalBridge implements VDUDisplay { } } + /** + * Tells the TerminalManager that we can be destroyed now. + */ + private void triggerDisconnectListener() { + if (disconnectListener != null) { + // The disconnect listener should be run on the main thread if possible. + if (parent != null) { + parent.post(new Runnable() { + @Override + public void run() { + disconnectListener.onDisconnected(TerminalBridge.this); + } + }); + } else { + disconnectListener.onDisconnected(TerminalBridge.this); + } + } + } + public void setSelectingForCopy(boolean selectingForCopy) { this.selectingForCopy = selectingForCopy; } -- cgit v1.2.3