diff options
Diffstat (limited to 'app/src')
-rw-r--r-- | app/src/main/AndroidManifest.xml | 2 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/ConsoleActivity.java | 53 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/service/TerminalBridge.java | 15 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/service/TerminalManager.java | 13 | ||||
-rw-r--r-- | app/src/main/res/layout-large/act_console.xml | 296 | ||||
-rw-r--r-- | app/src/main/res/layout/act_console.xml | 10 | ||||
-rw-r--r-- | app/src/main/res/values-v11/styles.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/values-v14/styles.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/values/styles.xml | 2 |
9 files changed, 356 insertions, 39 deletions
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> |