summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Wright <michaelwr@google.com>2013-02-25 20:56:53 -0800
committerMichael Wright <michaelwr@google.com>2013-02-25 20:56:53 -0800
commit26c9bb3a573b236f009654903461e496410a4147 (patch)
treeba1f6d08b7e10560275aa9ecb8c697dc6b656b0b
parent007efde8867b52cd5f3648173adb1a12069b6e0d (diff)
downloadandroid_packages_apps_Terminal-26c9bb3a573b236f009654903461e496410a4147.tar.gz
android_packages_apps_Terminal-26c9bb3a573b236f009654903461e496410a4147.tar.bz2
android_packages_apps_Terminal-26c9bb3a573b236f009654903461e496410a4147.zip
Start hooking up keyboard input to view
Change-Id: I37fb55f8fadd79bf4f32f55bee83f879d4d90680
-rw-r--r--src/com/android/terminal/TerminalKeys.java46
-rw-r--r--src/com/android/terminal/TerminalView.java49
2 files changed, 91 insertions, 4 deletions
diff --git a/src/com/android/terminal/TerminalKeys.java b/src/com/android/terminal/TerminalKeys.java
index 5e88a20..e77085a 100644
--- a/src/com/android/terminal/TerminalKeys.java
+++ b/src/com/android/terminal/TerminalKeys.java
@@ -19,9 +19,11 @@ package com.android.terminal;
import android.util.Log;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
+import android.view.View;
-public class TerminalKeys {
+public class TerminalKeys implements View.OnKeyListener {
private static final String TAG = "TerminalKeys";
+ private static final boolean DEBUG = true;
// Taken from vterm_input.h
// TODO: Consider setting these via jni
public static final int VTERM_KEY_NONE = 0;
@@ -67,7 +69,9 @@ public class TerminalKeys {
public static final int VTERM_MOD_ALT = 0x02;
public static final int VTERM_MOD_CTRL = 0x04;
- public static int getModifier(KeyEvent event) {
+ private Terminal mTerm;
+
+ public static int getModifiers(KeyEvent event) {
int mod = 0;
if (event.isCtrlPressed()) {
mod |= VTERM_MOD_CTRL;
@@ -153,13 +157,47 @@ public class TerminalKeys {
}
}
- public static int getCharacter(KeyEvent event) {
+ public int getCharacter(KeyEvent event) {
int c = event.getUnicodeChar();
// TODO: Actually support dead keys
if ((c & KeyCharacterMap.COMBINING_ACCENT) != 0) {
Log.w(TAG, "Received dead key, ignoring");
- return VTERM_KEY_NONE;
+ return 0;
}
return c;
}
+
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (mTerm == null) return false;
+
+ int modifiers = getModifiers(event);
+
+ int c = getKey(event);
+ if (c != 0) {
+ mTerm.dispatchKey(modifiers, c);
+ if (DEBUG) {
+ Log.d(TAG, "dispatched key event: " +
+ "mod=" + modifiers + ", " +
+ "keys=" + getKeyName(keyCode));
+ }
+ return true;
+ }
+
+ c = getCharacter(event);
+ if (c != 0) {
+ mTerm.dispatchKey(modifiers, c);
+ if (DEBUG) {
+ Log.d(TAG, "dispatched key event: " +
+ "mod=" + modifiers + ", " +
+ "character='" + new String(Character.toChars(c)) + "'");
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ public void setTerminal(Terminal term) {
+ mTerm = term;
+ }
}
diff --git a/src/com/android/terminal/TerminalView.java b/src/com/android/terminal/TerminalView.java
index 64aeabd..4764183 100644
--- a/src/com/android/terminal/TerminalView.java
+++ b/src/com/android/terminal/TerminalView.java
@@ -25,6 +25,10 @@ import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.SystemClock;
import android.util.Log;
+import android.view.inputmethod.BaseInputConnection;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.view.KeyEvent;
import android.view.View;
import com.android.terminal.Terminal.CellRun;
@@ -51,6 +55,8 @@ public class TerminalView extends View {
private Terminal mTerm;
+ private TerminalKeys mTermKeys;
+
private int mCharTop;
private int mCharWidth;
private int mCharHeight;
@@ -107,8 +113,17 @@ public class TerminalView extends View {
@Override
public void onClick(View v) {
v.invalidate();
+ v.requestFocus();
}
});
+
+ // Set view properties
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+ setScrollContainer(true);
+
+ mTermKeys = new TerminalKeys();
+ setOnKeyListener(mTermKeys);
}
public void setTerminal(Terminal term) {
@@ -119,6 +134,7 @@ public class TerminalView extends View {
mTerm = term;
if (term != null) {
term.setClient(mClient);
+ mTermKeys.setTerminal(term);
}
updateTerminalSize();
}
@@ -235,4 +251,37 @@ public class TerminalView extends View {
final long delta = SystemClock.elapsedRealtime() - start;
if (LOGD) Log.d(TAG, "onDraw() took " + delta + "ms");
}
+
+ @Override
+ public boolean onCheckIsTextEditor() {
+ return true;
+ }
+
+ @Override
+ public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+ outAttrs.imeOptions |=
+ EditorInfo.IME_FLAG_NO_EXTRACT_UI |
+ EditorInfo.IME_FLAG_NO_ENTER_ACTION |
+ EditorInfo.IME_ACTION_NONE;
+ outAttrs.inputType = EditorInfo.TYPE_NULL;
+ return new BaseInputConnection(this, false) {
+ @Override
+ public boolean deleteSurroundingText (int leftLength, int rightLength) {
+ KeyEvent k;
+ if (rightLength == 0 && leftLength == 0) {
+ k = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
+ return this.sendKeyEvent(k);
+ }
+ for (int i = 0; i < leftLength; i++) {
+ k = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
+ this.sendKeyEvent(k);
+ }
+ for (int i = 0; i < rightLength; i++) {
+ k = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_FORWARD_DEL);
+ this.sendKeyEvent(k);
+ }
+ return true;
+ }
+ };
+ }
}