void sendKey(int code, boolean down, boolean resetModifiers) { long time = System.currentTimeMillis(); if (time - lastWake > 5000) { wakeLock.acquire(); wakeLock.release(); lastWake = time; } InputConnection conn = getCurrentInputConnection(); if (conn == null) { // Debug.d("connection closed"); return; } if (code < 0) { if (down == false) return; switch (code) { case KEY_HOME: keyHome(conn); break; case KEY_END: keyEnd(conn); break; case KEY_DEL: keyDel(conn); break; } return; } if (pressedKeys.contains(KEY_CONTROL)) { switch (code) { case KeyEvent.KEYCODE_DPAD_LEFT: if (!down) return; wordLeft(conn); return; case KeyEvent.KEYCODE_DPAD_RIGHT: if (!down) return; wordRight(conn); return; case KeyEvent.KEYCODE_DEL: if (!down) return; deleteWordLeft(conn); return; case KeyEvent.KEYCODE_FORWARD_DEL: deleteWordRight(conn); return; case KeyEvent.KEYCODE_DPAD_CENTER: if (!down) return; copy(conn); return; } } if (pressedKeys.contains(KeyEvent.KEYCODE_SHIFT_LEFT)) { switch (code) { case KeyEvent.KEYCODE_DPAD_CENTER: if (!down) return; paste(conn); return; } } if (code == KeyEvent.KEYCODE_ENTER) { if (shouldSend()) { if (!down) return; Log.d("ivan", "sending submit action"); conn.performEditorAction(EditorInfo.IME_ACTION_SEND); return; } } // if (pressedKeys.contains(KEY_CONTROL)) { // if (down == false) return; // switch (code) { // case KeyEvent.KEYCODE_A: selectAll(conn); break; // case KeyEvent.KEYCODE_X: cut(conn); break; // case KeyEvent.KEYCODE_C: copy(conn); break; // case KeyEvent.KEYCODE_V: paste(conn); break; // } // return; // } conn.sendKeyEvent( new KeyEvent( android.os.SystemClock.uptimeMillis(), android.os.SystemClock.uptimeMillis(), down ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP, code, 0, (pressedKeys.contains(KeyEvent.KEYCODE_SHIFT_LEFT) ? KeyEvent.META_SHIFT_LEFT_ON : 0) + (pressedKeys.contains(KEY_CONTROL) ? KeyEvent.META_CTRL_ON : 0) + (pressedKeys.contains(KeyEvent.KEYCODE_ALT_LEFT) ? KeyEvent.META_ALT_LEFT_ON : 0))); if (resetModifiers) { conn.clearMetaKeyStates(KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON | KeyEvent.META_SYM_ON); } }