aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/main/AndroidManifest.xml2
-rw-r--r--app/src/main/java/org/connectbot/ConsoleActivity.java53
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalBridge.java15
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalManager.java13
-rw-r--r--app/src/main/res/layout-large/act_console.xml296
-rw-r--r--app/src/main/res/layout/act_console.xml10
-rw-r--r--app/src/main/res/values-v11/styles.xml2
-rw-r--r--app/src/main/res/values-v14/styles.xml2
-rw-r--r--app/src/main/res/values/styles.xml2
10 files changed, 359 insertions, 40 deletions
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 a1b6501..7358c88 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,7 +21,7 @@
android:versionCode="375"
android:installLocation="auto">
- <uses-sdk android:targetSdkVersion="22" android:minSdkVersion="4" />
+ <uses-sdk android:targetSdkVersion="22" android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java
index 214f878..d6ee629 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;
@@ -50,9 +51,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;
@@ -88,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;
@@ -98,6 +101,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;
@@ -152,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;
@@ -192,21 +197,16 @@ public class ConsoleActivity extends Activity {
}
};
- protected Handler disconnectHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
+ public void onDisconnected(TerminalBridge bridge) {
+ synchronized (adapter) {
+ adapter.notifyDataSetChanged();
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;
-
- adapter.notifyDataSetChanged();
if (bridge.isAwaitingClose()) {
closeBridge(bridge);
}
}
- };
+ }
protected OnClickListener emulatedKeysListener = new OnClickListener() {
@Override
@@ -262,14 +262,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();
}
}
@@ -362,6 +360,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 +370,8 @@ public class ConsoleActivity extends Activity {
onTerminalChanged();
}
});
+ adapter = new TerminalPagerAdapter();
+ pager.setAdapter(adapter);
empty = (TextView) findViewById(android.R.id.empty);
@@ -464,6 +465,10 @@ public class ConsoleActivity extends Activity {
}
});
+ tabs = (TabLayout) findViewById(R.id.tabs);
+ if (tabs != null)
+ 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 +640,6 @@ public class ConsoleActivity extends Activity {
}
});
-
- adapter = new TerminalPagerAdapter();
- pager.setAdapter(adapter);
}
/**
@@ -1226,6 +1228,15 @@ public class ConsoleActivity extends Activity {
}
@Override
+ public void notifyDataSetChanged() {
+ super.notifyDataSetChanged();
+ if (tabs != null) {
+ 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/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<HostBean> disconnected = new LinkedList<HostBean>();
- public Handler disconnectHandler = null;
+ public BridgeDisconnectedListener disconnectListener = null;
public Map<String, KeyHolder> loadedKeypairs = new HashMap<String, KeyHolder>();
@@ -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) {
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="#ff000000">
+
+ <android.support.v7.widget.Toolbar
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/toolbar"
+ android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
+
+ <android.support.design.widget.TabLayout
+ android:id="@+id/tabs"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ app:tabIndicatorColor="@android:color/white"
+ android:background="#222222"/>
+
+ <TextView
+ android:id="@android:id/empty"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:text="@string/terminal_no_hosts_connected"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="center"
+ android:layout_below="@id/toolbar"/>
+
+ <android.support.v4.view.ViewPager
+ android:id="@+id/console_flip"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_below="@id/toolbar"
+ />
+
+ <RelativeLayout
+ android:id="@+id/console_password_group"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:padding="5dip"
+ android:background="#80000000"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="25dip"
+ android:visibility="gone"
+ >
+
+ <TextView
+ android:id="@+id/console_password_instructions"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="fill_parent"
+ android:visibility="gone"
+ android:layout_marginBottom="5dip"
+ />
+
+ <EditText
+ android:id="@+id/console_password"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:password="true"
+ android:singleLine="true"
+ android:layout_below="@+id/console_password_instructions"
+ />
+
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/console_boolean_group"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:padding="5dip"
+ android:background="#80000000"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="25dip"
+ android:visibility="gone"
+ >
+
+ <TextView
+ android:id="@+id/console_prompt"
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <Button
+ android:id="@+id/console_prompt_no"
+ android:text="@string/button_no"
+ android:paddingTop="5dip"
+ android:paddingBottom="10dip"
+ android:paddingLeft="40dip"
+ android:paddingRight="40dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+ android:layout_below="@+id/console_prompt"
+ android:clickable="false"
+ />
+
+ <Button
+ android:id="@+id/console_prompt_yes"
+ android:text="@string/button_yes"
+ android:paddingTop="5dip"
+ android:paddingBottom="10dip"
+ android:paddingLeft="40dip"
+ android:paddingRight="40dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@+id/console_prompt_no"
+ android:layout_below="@+id/console_prompt"
+ />
+
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/keyboard_group"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:background="#55000000"
+ android:padding="0dip"
+ android:visibility="gone">
+
+ <Button
+ android:id="@+id/button_ctrl"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_toggle_control_character"
+ android:padding="0dp"
+ android:text="@string/button_key_ctrl"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <Button
+ android:id="@+id/button_esc"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_send_escape_character"
+ android:padding="0dp"
+ android:text="@string/button_key_esc"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <Button
+ android:id="@+id/button_tab"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_send_tab_character"
+ android:padding="0dp"
+ android:text="@string/button_key_tab"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <Button
+ android:id="@+id/button_up"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_up"
+ android:padding="0dp"
+ android:text="@string/button_key_up"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <Button
+ android:id="@+id/button_down"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_down"
+ android:padding="0dp"
+ android:text="@string/button_key_down"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <Button
+ android:id="@+id/button_left"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_left"
+ android:padding="0dp"
+ android:text="@string/button_key_left"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <Button
+ android:id="@+id/button_right"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:background="#55f0f0f0"
+ android:contentDescription="@string/image_description_right"
+ android:padding="0dp"
+ android:text="@string/button_key_right"
+ android:textSize="10dip"
+ />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#90000000"
+ />
+
+ <ImageView
+ android:id="@+id/button_keyboard"
+ android:layout_width="0px"
+ android:layout_weight="1"
+ android:layout_height="30dip"
+ android:layout_margin="0dp"
+ android:contentDescription="@string/image_description_show_keyboard"
+ android:padding="0dp"
+ android:src="@drawable/button_keyboard"
+ android:background="#55f0f0f0"
+ android:textSize="10dip"
+ />
+
+ </LinearLayout>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/act_console.xml b/app/src/main/res/layout/act_console.xml
index b2c0d08..5cdd7d1 100644
--- a/app/src/main/res/layout/act_console.xml
+++ b/app/src/main/res/layout/act_console.xml
@@ -18,11 +18,12 @@
*/
-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:background="#ff000000"
- >
+ android:background="#ff000000">
<TextView
android:id="@android:id/empty"
@@ -30,8 +31,7 @@
android:layout_height="fill_parent"
android:text="@string/terminal_no_hosts_connected"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center"
- />
+ android:gravity="center"/>
<android.support.v4.view.ViewPager
android:id="@+id/console_flip"
diff --git a/app/src/main/res/values-v11/styles.xml b/app/src/main/res/values-v11/styles.xml
index 9a0c22b..f831811 100644
--- a/app/src/main/res/values-v11/styles.xml
+++ b/app/src/main/res/values-v11/styles.xml
@@ -18,7 +18,7 @@
*/
-->
<resources>
- <style name="NoTitle" parent="android:Theme.Holo">
+ <style name="NoTitle" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:windowContentOverlay">@null</item>
<item name="android:actionBarStyle">@style/SolidActionBar</item>
</style>
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 @@
*/
-->
<resources>
- <style name="NoTitle" parent="android:Theme.DeviceDefault">
+ <style name="NoTitle" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:windowContentOverlay">@null</item>
<item name="android:actionBarStyle">@style/SolidActionBar</item>
</style>
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 @@
*/
-->
<resources>
- <style name="NoTitle" parent="android:Theme">
+ <style name="NoTitle" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>