From d02684c7146ebf411bd3fc0573692cbe27e6de23 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Fri, 1 Aug 2014 12:28:12 +0200 Subject: [PATCH] Add support for using the keyboard. This patch adds a menu entry to display the keyboard in the mousepad plugin and allow the user to send keystrokes. Dead keys are not yet supported, and behavior is unknown if entered. REVIEW: 119255 --- .../MousePadPlugin/MousePadActivity.java | 61 +++++++++++++++++++ .../MousePadPlugin/MousePadPlugin.java | 7 +++ src/main/res/menu/menu_mousepad.xml | 6 +- src/main/res/values/strings.xml | 1 + 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java b/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java index 31985083..610e6ca5 100644 --- a/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java +++ b/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java @@ -1,8 +1,11 @@ package org.kde.kdeconnect.Plugins.MousePadPlugin; import android.app.Activity; +import android.content.Context; import android.os.Bundle; import android.view.GestureDetector; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -56,6 +59,9 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest case R.id.menu_middle_click: sendMiddleClick(); return true; + case R.id.menu_show_keyboard: + showKeyboard(); + return true; default: return super.onOptionsItemSelected(item); } @@ -205,6 +211,56 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest return true; } + @Override + public boolean onKeyDown(int keyCode, final KeyEvent event) { + String character = new String(new char[] {(char) event.getUnicodeChar(0)}); + int modifier = 0; + if (keyCode == KeyEvent.KEYCODE_DEL) { + modifier = 1; + } else if (keyCode == KeyEvent.KEYCODE_ENTER) { + modifier = 1 << 1; + } else if (keyCode == KeyEvent.KEYCODE_TAB) { + modifier = 1 << 1 | 1; + } + // Add space for Home, End, Page Up, and Page Down + + if (event.isShiftPressed()) { + modifier |= 1 << 3; + } + if (android.os.Build.VERSION.SDK_INT >= 11) { + if (event.isCtrlPressed()) { + modifier |= 1 << 4; + } + } + if (character.charAt(0) == 0 && modifier == 0) { + return super.onKeyDown(keyCode, event); + } + final String characterToSend; + if (character.charAt(0) == 0) { + characterToSend = ""; + } else { + characterToSend = character; + } + BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { + @Override + public void onServiceStart(BackgroundService service) { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = (MousePadPlugin)device.getPlugin("plugin_mousepad"); + if (mousePadPlugin == null) return; + mousePadPlugin.sendKey(characterToSend, 0); + } + }); + return true; + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (event.getUnicodeChar() == 0) { + return super.onKeyDown(keyCode, event); + } + return true; + } + private void sendMiddleClick() { BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { @Override @@ -228,4 +284,9 @@ public class MousePadActivity extends Activity implements GestureDetector.OnGest } }); } + + private void showKeyboard() { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); + } } diff --git a/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadPlugin.java b/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadPlugin.java index 756e5e09..21c548a2 100644 --- a/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadPlugin.java +++ b/src/main/java/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadPlugin.java @@ -95,6 +95,13 @@ public class MousePadPlugin extends Plugin { device.sendPackage(np); } + public void sendKey(String key, int modifier) { + NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_MOUSEPAD); + np.set("key", key); + np.set("modifier", modifier); + device.sendPackage(np); + } + @Override public Button getInterfaceButton(final Activity activity) { Button button = new Button(activity); diff --git a/src/main/res/menu/menu_mousepad.xml b/src/main/res/menu/menu_mousepad.xml index 294eba4b..ce472768 100644 --- a/src/main/res/menu/menu_mousepad.xml +++ b/src/main/res/menu/menu_mousepad.xml @@ -9,4 +9,8 @@ xmlns:kdeconnect="http://schemas.android.com/apk/res-auto/android"> - \ No newline at end of file + + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 4ca395b8..bec4a221 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -57,6 +57,7 @@ Reconnect Send Right Click Send Middle Click + Show Keyboard Device not paired Request pairing Accept