summary refs log tree commit diff
path: root/android/app/src/main/java/com/classicube/CCView.java
diff options
context:
space:
mode:
Diffstat (limited to 'android/app/src/main/java/com/classicube/CCView.java')
-rw-r--r--android/app/src/main/java/com/classicube/CCView.java108
1 files changed, 108 insertions, 0 deletions
diff --git a/android/app/src/main/java/com/classicube/CCView.java b/android/app/src/main/java/com/classicube/CCView.java
new file mode 100644
index 0000000..b42d924
--- /dev/null
+++ b/android/app/src/main/java/com/classicube/CCView.java
@@ -0,0 +1,108 @@
+package com.classicube;
+import android.text.Editable;
+import android.text.Selection;
+import android.text.SpannableStringBuilder;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SurfaceView;
+import android.view.inputmethod.BaseInputConnection;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+
+public class CCView extends SurfaceView {
+    SpannableStringBuilder kbText;
+    MainActivity activity;
+
+    public CCView(MainActivity activity) {
+        // setFocusable, setFocusableInTouchMode - API level 1
+        super(activity);
+        this.activity = activity;
+        setFocusable(true);
+        setFocusableInTouchMode(true);
+    }
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        return activity.handleTouchEvent(ev) || super.dispatchTouchEvent(ev);
+    }
+
+    @Override
+    public InputConnection onCreateInputConnection(EditorInfo attrs) {
+        // BaseInputConnection, IME_ACTION_GO, IME_FLAG_NO_EXTRACT_UI - API level 3
+        attrs.actionLabel = null;
+        attrs.inputType   = MainActivity.calcKeyboardType(activity.keyboardType);
+        attrs.imeOptions  = MainActivity.calcKeyboardOptions(activity.keyboardType);
+
+        kbText = new SpannableStringBuilder(activity.keyboardText);
+
+        InputConnection ic = new BaseInputConnection(this, true) {
+            boolean inited;
+
+            void updateText() {
+                activity.pushCmd(MainActivity.CMD_KEY_TEXT, kbText.toString());
+            }
+
+            @Override
+            public Editable getEditable() {
+                if (!inited) {
+                    // needed to set selection, otherwise random crashes later with backspacing
+                    // set selection to end, so backspacing after opening keyboard with text still works
+                    Selection.setSelection(kbText, kbText.toString().length());
+                    inited = true;
+                }
+                return kbText;
+            }
+
+            @Override
+            public boolean setComposingText(CharSequence text, int newCursorPosition) {
+                boolean success = super.setComposingText(text, newCursorPosition);
+                updateText();
+                return success;
+            }
+
+            @Override
+            public boolean deleteSurroundingText(int beforeLength, int afterLength) {
+                boolean success = super.deleteSurroundingText(beforeLength, afterLength);
+                updateText();
+                return success;
+            }
+
+            @Override
+            public boolean commitText(CharSequence text, int newCursorPosition) {
+                boolean success = super.commitText(text, newCursorPosition);
+                updateText();
+                return success;
+            }
+
+            @Override
+            public boolean sendKeyEvent(KeyEvent ev) {
+                // getSelectionStart - API level 1
+                if (ev.getAction() != KeyEvent.ACTION_DOWN) return super.sendKeyEvent(ev);
+                int code = ev.getKeyCode();
+                int uni = ev.getUnicodeChar();
+
+                // start is -1 sometimes, and trying to insert/delete there crashes
+                int start = Selection.getSelectionStart(kbText);
+                if (start == -1) start = kbText.toString().length();
+
+                if (code == KeyEvent.KEYCODE_ENTER) {
+                    // enter maps to \n but that should not be intercepted
+                } else if (code == KeyEvent.KEYCODE_DEL) {
+                    if (start <= 0) return false;
+                    kbText.delete(start - 1, start);
+                    updateText();
+                    return false;
+                } else if (uni != 0) {
+                    kbText.insert(start, String.valueOf((char) uni));
+                    updateText();
+                    return false;
+                }
+                return super.sendKeyEvent(ev);
+            }
+
+        };
+        //String text = MainActivity.this.keyboardText;
+        //if (text != null) ic.setComposingText(text, 0);
+        return ic;
+    }
+}