aboutsummaryrefslogtreecommitdiffstats
path: root/src/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/org')
-rw-r--r--src/org/connectbot/ConsoleActivity.java81
-rw-r--r--src/org/connectbot/GeneratePubkeyActivity.java7
-rw-r--r--src/org/connectbot/HostListActivity.java2
-rw-r--r--src/org/connectbot/service/KeyEventUtil.java149
-rw-r--r--src/org/connectbot/service/TerminalKeyListener.java12
-rw-r--r--src/org/connectbot/util/PreferenceConstants.java1
6 files changed, 220 insertions, 32 deletions
diff --git a/src/org/connectbot/ConsoleActivity.java b/src/org/connectbot/ConsoleActivity.java
index 5e34dc6..7aca08c 100644
--- a/src/org/connectbot/ConsoleActivity.java
+++ b/src/org/connectbot/ConsoleActivity.java
@@ -55,6 +55,7 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
+import android.view.Window;
import android.view.WindowManager;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View.OnClickListener;
@@ -111,6 +112,9 @@ public class ConsoleActivity extends Activity {
private TextView booleanPrompt;
private Button booleanYes, booleanNo;
+ private RelativeLayout keyboardGroup;
+ private Runnable keyboardGroupHider;
+
private TextView empty;
private Animation slide_left_in, slide_left_out, slide_right_in, slide_right_out, fade_stay_hidden, fade_out_delayed;
@@ -133,6 +137,7 @@ public class ConsoleActivity extends Activity {
private ActionBarWrapper actionBar;
private boolean inActionBarMenu = false;
+ private boolean titleBarHide;
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
@@ -260,6 +265,38 @@ public class ConsoleActivity extends Activity {
booleanPromptGroup.setVisibility(View.GONE);
}
+ private void showEmulatedKeys() {
+ keyboardGroup.startAnimation(keyboard_fade_in);
+ keyboardGroup.setVisibility(View.VISIBLE);
+ actionBar.show();
+
+ if (keyboardGroupHider != null)
+ handler.removeCallbacks(keyboardGroupHider);
+ keyboardGroupHider = new Runnable() {
+ public void run() {
+ if (keyboardGroup.getVisibility() == View.GONE || inActionBarMenu)
+ return;
+
+ keyboardGroup.startAnimation(keyboard_fade_out);
+ keyboardGroup.setVisibility(View.GONE);
+ if (titleBarHide) {
+ actionBar.hide();
+ }
+ keyboardGroupHider = null;
+ }
+ };
+ handler.postDelayed(keyboardGroupHider, KEYBOARD_DISPLAY_TIME);
+ }
+
+ private void hideEmulatedKeys() {
+ if (keyboardGroupHider != null)
+ handler.removeCallbacks(keyboardGroupHider);
+ keyboardGroup.setVisibility(View.GONE);
+ if (titleBarHide) {
+ actionBar.hide();
+ }
+ }
+
// more like configureLaxMode -- enable network IO on UI thread
private void configureStrictMode() {
try {
@@ -275,11 +312,16 @@ public class ConsoleActivity extends Activity {
hardKeyboard = getResources().getConfiguration().keyboard ==
Configuration.KEYBOARD_QWERTY;
- this.setContentView(R.layout.act_console);
-
clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ titleBarHide = prefs.getBoolean(PreferenceConstants.TITLEBARHIDE, false);
+ if (titleBarHide) {
+ getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
+ }
+
+ this.setContentView(R.layout.act_console);
+
// hide status bar if requested by user
if (prefs.getBoolean(PreferenceConstants.FULLSCREEN, false)) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
@@ -358,7 +400,7 @@ public class ConsoleActivity extends Activity {
inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- final RelativeLayout keyboardGroup = (RelativeLayout) findViewById(R.id.keyboard_group);
+ keyboardGroup = (RelativeLayout) findViewById(R.id.keyboard_group);
mKeyboardButton = (ImageView) findViewById(R.id.button_keyboard);
mKeyboardButton.setOnClickListener(new OnClickListener() {
@@ -368,8 +410,7 @@ public class ConsoleActivity extends Activity {
return;
inputManager.showSoftInput(flip, InputMethodManager.SHOW_FORCED);
- keyboardGroup.setVisibility(View.GONE);
- actionBar.hide();
+ hideEmulatedKeys();
}
});
@@ -382,9 +423,7 @@ public class ConsoleActivity extends Activity {
TerminalKeyListener handler = terminal.bridge.getKeyHandler();
handler.metaPress(TerminalKeyListener.OUR_CTRL_ON);
-
- keyboardGroup.setVisibility(View.GONE);
- actionBar.hide();
+ hideEmulatedKeys();
}
});
@@ -397,21 +436,20 @@ public class ConsoleActivity extends Activity {
TerminalKeyListener handler = terminal.bridge.getKeyHandler();
handler.sendEscape();
-
- keyboardGroup.setVisibility(View.GONE);
- actionBar.hide();
+ hideEmulatedKeys();
}
});
actionBar = ActionBarWrapper.getActionBar(this);
actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.hide();
+ if (titleBarHide) {
+ actionBar.hide();
+ }
actionBar.addOnMenuVisibilityListener(new ActionBarWrapper.OnMenuVisibilityListener() {
public void onMenuVisibilityChanged(boolean isVisible) {
inActionBarMenu = isVisible;
if (isVisible == false) {
- keyboardGroup.setVisibility(View.GONE);
- actionBar.hide();
+ hideEmulatedKeys();
}
}
});
@@ -580,20 +618,7 @@ public class ConsoleActivity extends Activity {
&& event.getEventTime() - event.getDownTime() < CLICK_TIME
&& Math.abs(event.getX() - lastX) < MAX_CLICK_DISTANCE
&& Math.abs(event.getY() - lastY) < MAX_CLICK_DISTANCE) {
- keyboardGroup.startAnimation(keyboard_fade_in);
- keyboardGroup.setVisibility(View.VISIBLE);
- actionBar.show();
-
- handler.postDelayed(new Runnable() {
- public void run() {
- if (keyboardGroup.getVisibility() == View.GONE || inActionBarMenu)
- return;
-
- keyboardGroup.startAnimation(keyboard_fade_out);
- keyboardGroup.setVisibility(View.GONE);
- actionBar.hide();
- }
- }, KEYBOARD_DISPLAY_TIME);
+ showEmulatedKeys();
}
// pass any touch events back to detector
diff --git a/src/org/connectbot/GeneratePubkeyActivity.java b/src/org/connectbot/GeneratePubkeyActivity.java
index 3a438c5..1b8995f 100644
--- a/src/org/connectbot/GeneratePubkeyActivity.java
+++ b/src/org/connectbot/GeneratePubkeyActivity.java
@@ -22,6 +22,7 @@ import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
+import java.security.Security;
import org.connectbot.bean.PubkeyBean;
import org.connectbot.util.EntropyDialog;
@@ -44,6 +45,7 @@ import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
+import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.SeekBar;
@@ -113,6 +115,11 @@ public class GeneratePubkeyActivity extends Activity implements OnEntropyGathere
password1.addTextChangedListener(textChecker);
password2.addTextChangedListener(textChecker);
+ // TODO add BC to provide EC for devices that don't have it.
+ if (Security.getProviders("KeyPairGenerator.EC") == null) {
+ ((RadioButton) findViewById(R.id.ec)).setEnabled(false);
+ }
+
keyTypeGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
diff --git a/src/org/connectbot/HostListActivity.java b/src/org/connectbot/HostListActivity.java
index 5fa09a9..648b705 100644
--- a/src/org/connectbot/HostListActivity.java
+++ b/src/org/connectbot/HostListActivity.java
@@ -303,7 +303,7 @@ public class HostListActivity extends ListActivity {
keys.setIcon(android.R.drawable.ic_lock_lock);
keys.setIntent(new Intent(HostListActivity.this, PubkeyListActivity.class));
- MenuItem colors = menu.add("Colors");
+ MenuItem colors = menu.add(R.string.title_colors);
colors.setIcon(android.R.drawable.ic_menu_slideshow);
colors.setIntent(new Intent(HostListActivity.this, ColorsActivity.class));
diff --git a/src/org/connectbot/service/KeyEventUtil.java b/src/org/connectbot/service/KeyEventUtil.java
new file mode 100644
index 0000000..1362afa
--- /dev/null
+++ b/src/org/connectbot/service/KeyEventUtil.java
@@ -0,0 +1,149 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2014 Torne Wuff
+ *
+ * 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.
+ */
+package org.connectbot.service;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.KeyEvent;
+
+public class KeyEventUtil {
+ static final char CONTROL_LIMIT = ' ';
+ static final char PRINTABLE_LIMIT = '\u007e';
+ static final char[] HEX_DIGITS = new char[] {
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+ };
+
+ static String printableRepresentation(String source) {
+ if (source == null)
+ return null;
+
+ final StringBuilder sb = new StringBuilder();
+ final int limit = source.length();
+ char[] hexbuf = null;
+ int pointer = 0;
+
+ sb.append('"');
+ while (pointer < limit) {
+ int ch = source.charAt(pointer++);
+ switch (ch) {
+ case '\0':
+ sb.append("\\0");
+ break;
+ case '\t':
+ sb.append("\\t");
+ break;
+ case '\n':
+ sb.append("\\n");
+ break;
+ case '\r':
+ sb.append("\\r");
+ break;
+ case '\"':
+ sb.append("\\\"");
+ break;
+ case '\\':
+ sb.append("\\\\");
+ break;
+ default:
+ if (CONTROL_LIMIT <= ch && ch <= PRINTABLE_LIMIT) {
+ sb.append((char) ch);
+ } else {
+ sb.append("\\u");
+ if (hexbuf == null)
+ hexbuf = new char[4];
+ for (int offs = 4; offs > 0; ) {
+ hexbuf[--offs] = HEX_DIGITS[ch & 0xf];
+ ch >>>= 4;
+ }
+ sb.append(hexbuf, 0, 4);
+ }
+ }
+ }
+ return sb.append('"').toString();
+ }
+
+ private static class ClassCompat {
+ private static final ClassCompat INSTANCE;
+ static {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+ INSTANCE = new HCMR2AndNewer();
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
+ INSTANCE = new HCMR1AndNewer();
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
+ INSTANCE = new GingerbreadAndNewer();
+ } else {
+ INSTANCE = new ClassCompat();
+ }
+ }
+
+ private ClassCompat() {
+ }
+
+ public static void appendExtras(StringBuilder d, int keyCode, KeyEvent event) {
+ INSTANCE.appendForApi(d, keyCode, event);
+ }
+
+ protected void appendForApi(StringBuilder d, int keyCode, KeyEvent event) {
+ }
+
+ @TargetApi(9)
+ private static class GingerbreadAndNewer extends ClassCompat {
+ @Override
+ protected void appendForApi(StringBuilder d, int keyCode, KeyEvent event) {
+ super.appendForApi(d, keyCode, event);
+ d.append(", source=").append(event.getSource());
+
+ }
+ }
+ @TargetApi(12)
+ private static class HCMR1AndNewer extends GingerbreadAndNewer {
+ protected void appendForApi(StringBuilder d, int keyCode, KeyEvent event) {
+ super.appendForApi(d, keyCode, event);
+ d.append(", keyCodeToString=").append(KeyEvent.keyCodeToString(keyCode));
+ }
+ }
+
+ @TargetApi(13)
+ private static class HCMR2AndNewer extends HCMR1AndNewer {
+ @Override
+ protected void appendForApi(StringBuilder d, int keyCode, KeyEvent event) {
+ super.appendForApi(d, keyCode, event);
+ d.append(", modifiers=").append(Integer.toHexString(event.getModifiers()));
+ }
+ }
+ }
+
+ public static String describeKeyEvent(int keyCode, KeyEvent event) {
+ StringBuilder d = new StringBuilder();
+ d.append("keyCode=").append(keyCode);
+ d.append(", event.toString=").append(event.toString());
+ d.append(", action=").append(event.getAction());
+ d.append(", characters=").append(printableRepresentation(event.getCharacters()));
+ d.append(", deviceId=").append(event.getDeviceId());
+ d.append(", displayLabel=").append((int) event.getDisplayLabel());
+ d.append(", flags=0x").append(Integer.toHexString(event.getFlags()));
+ d.append(", printingKey=").append(event.isPrintingKey());
+ d.append(", keyCode=").append(event.getKeyCode());
+ d.append(", metaState=0x").append(Integer.toHexString(event.getMetaState()));
+ d.append(", number=").append((int) event.getNumber());
+ d.append(", scanCode=").append(event.getScanCode());
+ d.append(", unicodeChar=").append(event.getUnicodeChar());
+ ClassCompat.appendExtras(d, keyCode, event);
+ return d.toString();
+ }
+}
diff --git a/src/org/connectbot/service/TerminalKeyListener.java b/src/org/connectbot/service/TerminalKeyListener.java
index 3f82259..7ff21df 100644
--- a/src/org/connectbot/service/TerminalKeyListener.java
+++ b/src/org/connectbot/service/TerminalKeyListener.java
@@ -64,7 +64,11 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
// backport constants from api level 11
private final static int KEYCODE_ESCAPE = 111;
- private final static int HC_META_CTRL_ON = 4096;
+ private final static int HC_META_CTRL_ON = 0x1000;
+ private final static int HC_META_CTRL_LEFT_ON = 0x2000;
+ private final static int HC_META_CTRL_RIGHT_ON = 0x4000;
+ private final static int HC_META_CTRL_MASK = HC_META_CTRL_ON | HC_META_CTRL_RIGHT_ON
+ | HC_META_CTRL_LEFT_ON;
private final static int HC_META_ALT_MASK = KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON
| KeyEvent.META_ALT_RIGHT_ON;
@@ -164,6 +168,8 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
return false;
}
+ //Log.i("CBKeyDebug", KeyEventUtil.describeKeyEvent(keyCode, event));
+
if (volumeKeysChangeFontSize) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
bridge.increaseFontSize();
@@ -283,9 +289,9 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
// Ask the system to use the keymap to give us the unicode character for this key,
// with our derived modifier state applied.
- int uchar = event.getUnicodeChar(derivedMetaState & ~HC_META_CTRL_ON);
+ int uchar = event.getUnicodeChar(derivedMetaState & ~HC_META_CTRL_MASK);
int ucharWithoutAlt = event.getUnicodeChar(
- derivedMetaState & ~(HC_META_ALT_MASK | HC_META_CTRL_ON));
+ derivedMetaState & ~(HC_META_ALT_MASK | HC_META_CTRL_MASK));
if (uchar != ucharWithoutAlt) {
// The alt key was used to modify the character returned; therefore, drop the alt
// modifier from the state so we don't end up sending alt+key.
diff --git a/src/org/connectbot/util/PreferenceConstants.java b/src/org/connectbot/util/PreferenceConstants.java
index e9fb06c..ad29c39 100644
--- a/src/org/connectbot/util/PreferenceConstants.java
+++ b/src/org/connectbot/util/PreferenceConstants.java
@@ -50,6 +50,7 @@ public class PreferenceConstants {
public static final String ROTATION_AUTOMATIC = "Automatic";
public static final String FULLSCREEN = "fullscreen";
+ public static final String TITLEBARHIDE = "titlebarhide";
public static final String KEYMODE = "keymode";