diff options
Diffstat (limited to 'src/org')
-rw-r--r-- | src/org/connectbot/ConsoleActivity.java | 81 | ||||
-rw-r--r-- | src/org/connectbot/GeneratePubkeyActivity.java | 7 | ||||
-rw-r--r-- | src/org/connectbot/HostListActivity.java | 2 | ||||
-rw-r--r-- | src/org/connectbot/service/KeyEventUtil.java | 149 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalKeyListener.java | 12 | ||||
-rw-r--r-- | src/org/connectbot/util/PreferenceConstants.java | 1 |
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"; |