From 39a9114332262e3febd8d2ea7f05c7317744019a Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Fri, 7 Aug 2015 11:13:28 -0700 Subject: Add tabs when there's more than one terminal active. --- app/build.gradle | 4 +++- app/src/main/AndroidManifest.xml | 2 +- .../main/java/org/connectbot/ConsoleActivity.java | 20 +++++++++++++++--- app/src/main/res/layout/act_console.xml | 24 ++++++++++++++++++---- app/src/main/res/values-v11/styles.xml | 2 +- app/src/main/res/values-v14/styles.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- 7 files changed, 44 insertions(+), 12 deletions(-) (limited to 'app') diff --git a/app/build.gradle b/app/build.gradle index 0913b4e..67e6c01 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { defaultConfig { applicationId "org.connectbot" - minSdkVersion 4 + minSdkVersion 8 targetSdkVersion 22 ndk { @@ -64,6 +64,8 @@ android { dependencies { compile "com.android.support:support-v4:22.2.1" + compile "com.android.support:appcompat-v7:22.2.1" + compile "com.android.support:design:22.2.0" } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4bbe055..718b91e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,7 @@ android:versionCode="375" android:installLocation="auto"> - + diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java index 214f878..15fd135 100644 --- a/app/src/main/java/org/connectbot/ConsoleActivity.java +++ b/app/src/main/java/org/connectbot/ConsoleActivity.java @@ -50,9 +50,11 @@ import android.os.Message; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; +import android.support.design.widget.TabLayout; import android.support.v4.view.MotionEventCompat; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; +import android.support.v7.widget.Toolbar; import android.text.ClipboardManager; import android.util.Log; import android.view.ContextMenu; @@ -98,6 +100,8 @@ public class ConsoleActivity extends Activity { private static final int KEYBOARD_DISPLAY_TIME = 1500; protected ViewPager pager = null; + protected TabLayout tabs = null; + protected Toolbar toolbar = null; @Nullable protected TerminalManager bound = null; protected TerminalPagerAdapter adapter = null; @@ -362,6 +366,7 @@ public class ConsoleActivity extends Activity { inflater = LayoutInflater.from(this); + toolbar = (Toolbar) findViewById(R.id.toolbar); pager = (ViewPager) findViewById(R.id.console_flip); registerForContextMenu(pager); pager.addOnPageChangeListener( @@ -371,6 +376,8 @@ public class ConsoleActivity extends Activity { onTerminalChanged(); } }); + adapter = new TerminalPagerAdapter(); + pager.setAdapter(adapter); empty = (TextView) findViewById(android.R.id.empty); @@ -464,6 +471,9 @@ public class ConsoleActivity extends Activity { } }); + tabs = (TabLayout) findViewById(R.id.tabs); + tabs.setupWithViewPager(pager); + // detect fling gestures to switch between terminals final GestureDetector detect = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { private float totalY = 0; @@ -635,9 +645,6 @@ public class ConsoleActivity extends Activity { } }); - - adapter = new TerminalPagerAdapter(); - pager.setAdapter(adapter); } /** @@ -1225,6 +1232,13 @@ public class ConsoleActivity extends Activity { return bridges.get(position); } + @Override + public void notifyDataSetChanged() { + super.notifyDataSetChanged(); + toolbar.setVisibility(this.getCount() > 1 ? View.VISIBLE : View.GONE); + tabs.setTabsFromPagerAdapter(this); + } + @Override public boolean isViewFromObject(View view, Object object) { return view == object; diff --git a/app/src/main/res/layout/act_console.xml b/app/src/main/res/layout/act_console.xml index b2c0d08..a2a8327 100644 --- a/app/src/main/res/layout/act_console.xml +++ b/app/src/main/res/layout/act_console.xml @@ -18,11 +18,26 @@ */ --> - + android:background="#ff000000"> + + + + + android:layout_below="@id/toolbar"/> - diff --git a/app/src/main/res/values-v14/styles.xml b/app/src/main/res/values-v14/styles.xml index 3969010..f831811 100644 --- a/app/src/main/res/values-v14/styles.xml +++ b/app/src/main/res/values-v14/styles.xml @@ -18,7 +18,7 @@ */ --> - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 22e830b..f0cd073 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -18,7 +18,7 @@ */ --> - -- cgit v1.2.3 From 5b96ac07b94c4f2c8e4ffa6862b2c5693965a96d Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Mon, 10 Aug 2015 15:33:05 -0700 Subject: When handling a disconnect, notify dataset changes in a synchronize block on pager. --- .../main/java/org/connectbot/ConsoleActivity.java | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'app') diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java index 15fd135..0f1de27 100644 --- a/app/src/main/java/org/connectbot/ConsoleActivity.java +++ b/app/src/main/java/org/connectbot/ConsoleActivity.java @@ -199,15 +199,17 @@ public class ConsoleActivity extends Activity { protected Handler disconnectHandler = new Handler() { @Override public void handleMessage(Message msg) { - Log.d(TAG, "Someone sending HANDLE_DISCONNECT to parentHandler"); + synchronized (pager) { + Log.d(TAG, "Someone sending HANDLE_DISCONNECT to parentHandler"); - // someone below us requested to display a password dialog - // they are sending nickname and requested - TerminalBridge bridge = (TerminalBridge) msg.obj; + // someone below us requested to display a password dialog + // they are sending nickname and requested + TerminalBridge bridge = (TerminalBridge) msg.obj; - adapter.notifyDataSetChanged(); - if (bridge.isAwaitingClose()) { - closeBridge(bridge); + adapter.notifyDataSetChanged(); + if (bridge.isAwaitingClose()) { + closeBridge(bridge); + } } } }; @@ -266,14 +268,12 @@ public class ConsoleActivity extends Activity { * @param bridge */ private void closeBridge(final TerminalBridge bridge) { - synchronized (pager) { - updateEmptyVisible(); - updatePromptVisible(); + updateEmptyVisible(); + updatePromptVisible(); - // If we just closed the last bridge, go back to the previous activity. - if (pager.getChildCount() == 0) { - finish(); - } + // If we just closed the last bridge, go back to the previous activity. + if (pager.getChildCount() == 0) { + finish(); } } -- cgit v1.2.3 From b067b78b004f8dd2607fe1acea0e7ec47e108212 Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Thu, 13 Aug 2015 15:01:22 -0700 Subject: Call the bridge disconnect listener sychronously on the main thread. This resolves an issue with the adapter count changing without notifyDataSetChanged being called before layout. --- .../main/java/org/connectbot/ConsoleActivity.java | 26 +++++++++------------- .../org/connectbot/service/TerminalBridge.java | 15 +++++++++++-- .../org/connectbot/service/TerminalManager.java | 13 +++++------ 3 files changed, 29 insertions(+), 25 deletions(-) (limited to 'app') diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java index 0f1de27..46c4f08 100644 --- a/app/src/main/java/org/connectbot/ConsoleActivity.java +++ b/app/src/main/java/org/connectbot/ConsoleActivity.java @@ -23,6 +23,7 @@ import java.util.List; import org.connectbot.bean.HostBean; import org.connectbot.bean.SelectionArea; +import org.connectbot.service.BridgeDisconnectedListener; import org.connectbot.service.PromptHelper; import org.connectbot.service.TerminalBridge; import org.connectbot.service.TerminalKeyListener; @@ -90,7 +91,7 @@ import android.widget.TextView; import android.widget.Toast; import de.mud.terminal.vt320; -public class ConsoleActivity extends Activity { +public class ConsoleActivity extends Activity implements BridgeDisconnectedListener { public final static String TAG = "CB.ConsoleActivity"; protected static final int REQUEST_EDIT = 1; @@ -156,7 +157,7 @@ public class ConsoleActivity extends Activity { bound = ((TerminalManager.TerminalBinder) service).getService(); // let manager know about our event handling services - bound.disconnectHandler = disconnectHandler; + bound.disconnectListener = ConsoleActivity.this; bound.setResizeAllowed(true); final String requestedNickname = (requested != null) ? requested.getFragment() : null; @@ -196,23 +197,16 @@ public class ConsoleActivity extends Activity { } }; - protected Handler disconnectHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - synchronized (pager) { - Log.d(TAG, "Someone sending HANDLE_DISCONNECT to parentHandler"); - - // someone below us requested to display a password dialog - // they are sending nickname and requested - TerminalBridge bridge = (TerminalBridge) msg.obj; + public void onDisconnected(TerminalBridge bridge) { + synchronized (adapter) { + adapter.notifyDataSetChanged(); + Log.d(TAG, "Someone sending HANDLE_DISCONNECT to parentHandler"); - adapter.notifyDataSetChanged(); - if (bridge.isAwaitingClose()) { - closeBridge(bridge); - } + if (bridge.isAwaitingClose()) { + closeBridge(bridge); } } - }; + } protected OnClickListener emulatedKeysListener = new OnClickListener() { @Override diff --git a/app/src/main/java/org/connectbot/service/TerminalBridge.java b/app/src/main/java/org/connectbot/service/TerminalBridge.java index 6333c17..f7be0ae 100644 --- a/app/src/main/java/org/connectbot/service/TerminalBridge.java +++ b/app/src/main/java/org/connectbot/service/TerminalBridge.java @@ -456,8 +456,19 @@ public class TerminalBridge implements VDUDisplay { awaitingClose = true; // Tell the TerminalManager that we can be destroyed now. - if (disconnectListener != null) - disconnectListener.onDisconnected(TerminalBridge.this); + 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); + } + } } } }); diff --git a/app/src/main/java/org/connectbot/service/TerminalManager.java b/app/src/main/java/org/connectbot/service/TerminalManager.java index 8001561..a15dff0 100644 --- a/app/src/main/java/org/connectbot/service/TerminalManager.java +++ b/app/src/main/java/org/connectbot/service/TerminalManager.java @@ -54,9 +54,7 @@ import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.net.Uri; import android.os.Binder; -import android.os.Handler; import android.os.IBinder; -import android.os.Message; import android.os.Vibrator; import android.preference.PreferenceManager; import android.util.Log; @@ -81,7 +79,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen public List disconnected = new LinkedList(); - public Handler disconnectHandler = null; + public BridgeDisconnectedListener disconnectListener = null; public Map loadedKeypairs = new HashMap(); @@ -329,6 +327,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen */ public void onDisconnected(TerminalBridge bridge) { boolean shouldHideRunningNotification = false; + Log.d(TAG, "Bridge Disconnected. Removing it."); synchronized (bridges) { // remove this bridge from our list @@ -345,6 +344,10 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen mPendingReconnect.size() == 0) { shouldHideRunningNotification = true; } + + // pass notification back up to gui + if (disconnectListener != null) + disconnectListener.onDisconnected(bridge); } synchronized (disconnected) { @@ -354,10 +357,6 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen if (shouldHideRunningNotification) { ConnectionNotifier.getInstance().hideRunningNotification(this); } - - // pass notification back up to gui - if (disconnectHandler != null) - Message.obtain(disconnectHandler, -1, bridge).sendToTarget(); } public boolean isKeyLoaded(String nickname) { -- cgit v1.2.3 From 64f59c9c98b7b827f1475e8e98cb3929ba0c4d93 Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Thu, 13 Aug 2015 15:43:51 -0700 Subject: Only show tabs on large screens --- .../main/java/org/connectbot/ConsoleActivity.java | 9 +- app/src/main/res/layout-large/act_console.xml | 296 +++++++++++++++++++++ app/src/main/res/layout/act_console.xml | 18 +- 3 files changed, 303 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/layout-large/act_console.xml (limited to 'app') diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java index 46c4f08..d6ee629 100644 --- a/app/src/main/java/org/connectbot/ConsoleActivity.java +++ b/app/src/main/java/org/connectbot/ConsoleActivity.java @@ -466,7 +466,8 @@ public class ConsoleActivity extends Activity implements BridgeDisconnectedListe }); tabs = (TabLayout) findViewById(R.id.tabs); - tabs.setupWithViewPager(pager); + if (tabs != null) + tabs.setupWithViewPager(pager); // detect fling gestures to switch between terminals final GestureDetector detect = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @@ -1229,8 +1230,10 @@ public class ConsoleActivity extends Activity implements BridgeDisconnectedListe @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); - toolbar.setVisibility(this.getCount() > 1 ? View.VISIBLE : View.GONE); - tabs.setTabsFromPagerAdapter(this); + if (tabs != null) { + toolbar.setVisibility(this.getCount() > 1 ? View.VISIBLE : View.GONE); + tabs.setTabsFromPagerAdapter(this); + } } @Override diff --git a/app/src/main/res/layout-large/act_console.xml b/app/src/main/res/layout-large/act_console.xml new file mode 100644 index 0000000..d735333 --- /dev/null +++ b/app/src/main/res/layout-large/act_console.xml @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +