mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-31 22:25:08 +00:00
Use full keyboard handling rather than key events to get UTF-8 support
Use Androids InputConnection mechanism to get data from they keyboard, rather than handling keys individually. This fixes UTF-8. As a side effect, using "Google Voice Keyboard" to enter text will automatically work. Special keys and modifiers are still handled by the key event handler. BUG: 350437
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
package org.kde.kdeconnect.Plugins.MousePadPlugin;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.BaseInputConnection;
|
||||||
|
import android.view.inputmethod.CorrectionInfo;
|
||||||
|
import android.view.inputmethod.InputConnection;
|
||||||
|
|
||||||
|
public class KeyInputConnection extends BaseInputConnection {
|
||||||
|
private KeyListenerView view;
|
||||||
|
|
||||||
|
public KeyInputConnection(KeyListenerView targetView, boolean fullEditor) {
|
||||||
|
super(targetView, fullEditor);
|
||||||
|
view = targetView;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean commitText(CharSequence text, int newCursorPosition) {
|
||||||
|
view.sendChars(text);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -92,7 +92,7 @@ public class KeyListenerView extends View {
|
|||||||
if (android.os.Build.VERSION.SDK_INT >= 11) {
|
if (android.os.Build.VERSION.SDK_INT >= 11) {
|
||||||
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN;
|
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN;
|
||||||
}
|
}
|
||||||
return null;
|
return new KeyInputConnection(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -100,10 +100,27 @@ public class KeyListenerView extends View {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendChars(CharSequence chars) {
|
||||||
|
final NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_MOUSEPAD);
|
||||||
|
np.set("key", chars.toString());
|
||||||
|
sendKeyPressPackage(np);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendKeyPressPackage(final NetworkPackage np) {
|
||||||
|
BackgroundService.RunCommand(getContext(), new BackgroundService.InstanceCallback() {
|
||||||
|
@Override
|
||||||
|
public void onServiceStart(BackgroundService service) {
|
||||||
|
Device device = service.getDevice(deviceId);
|
||||||
|
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
||||||
|
if (mousePadPlugin == null) return;
|
||||||
|
mousePadPlugin.sendKeyboardPacket(np);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||||
|
|
||||||
|
|
||||||
/* NOTE: Some keyboards, and specifically the Android default keyboard when
|
/* NOTE: Some keyboards, and specifically the Android default keyboard when
|
||||||
* entering non-ascii characters, will not trigger KeyEvent events as documented
|
* entering non-ascii characters, will not trigger KeyEvent events as documented
|
||||||
* here: http://developer.android.com/reference/android/view/KeyEvent.html
|
* here: http://developer.android.com/reference/android/view/KeyEvent.html
|
||||||
@@ -120,6 +137,7 @@ public class KeyListenerView extends View {
|
|||||||
np.set("alt", true);
|
np.set("alt", true);
|
||||||
modifier = true;
|
modifier = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 11) {
|
if (Build.VERSION.SDK_INT >= 11) {
|
||||||
if (event.isCtrlPressed()) {
|
if (event.isCtrlPressed()) {
|
||||||
np.set("ctrl", true);
|
np.set("ctrl", true);
|
||||||
@@ -127,62 +145,24 @@ public class KeyListenerView extends View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modifier) {
|
if (event.isShiftPressed()) {
|
||||||
|
np.set("shift", true);
|
||||||
//Only send shift in combination with other modifiers or special keys. Otherwise let it modify the letter itself and get the final result in utf.
|
|
||||||
if (event.isShiftPressed()) {
|
|
||||||
np.set("shift", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
int specialKey = SpecialKeysMap.get(keyCode, -1);
|
|
||||||
if (specialKey != -1) {
|
|
||||||
np.set("specialKey", specialKey);
|
|
||||||
} else if (event.getDisplayLabel() != 0) {
|
|
||||||
//Alt will change the utf symbol to non-ascii characters, we want the plain original letter
|
|
||||||
//Since getDisplayLabel will always have a value, we have to check for special keys before
|
|
||||||
char keyCharacter = event.getDisplayLabel();
|
|
||||||
np.set("key", new String(new char[]{keyCharacter}).toLowerCase());
|
|
||||||
} else {
|
|
||||||
return false; //We don't know what to send, better send nothing. Probably this is the modifier key itself.
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
//If it's not a modifier+key combination, we want the fancy (potentially utf) version of the key pressed
|
|
||||||
char utfChar = (char) event.getUnicodeChar();
|
|
||||||
|
|
||||||
//Workaround to send enter and tab as special keys instead of characters
|
|
||||||
if (utfChar == 9 || utfChar == 10) utfChar = 0;
|
|
||||||
|
|
||||||
if (utfChar != 0) {
|
|
||||||
String utfString = new String(new char[]{utfChar});
|
|
||||||
np.set("key", utfString);
|
|
||||||
} else {
|
|
||||||
int specialKey = SpecialKeysMap.get(keyCode, -1);
|
|
||||||
if (specialKey != -1) {
|
|
||||||
//Only send shift in combination with other modifiers or special keys. Otherwise let it modify the letter itself and get the final result in utf.
|
|
||||||
if (event.isShiftPressed()) {
|
|
||||||
np.set("shift", true);
|
|
||||||
}
|
|
||||||
//If it was not a displayable character, check if it was a special key
|
|
||||||
np.set("specialKey", specialKey);
|
|
||||||
} else {
|
|
||||||
return false; //We don't know what to send, better send nothing. Probably this is an unhandled special key.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BackgroundService.RunCommand(getContext(), new BackgroundService.InstanceCallback() {
|
int specialKey = SpecialKeysMap.get(keyCode, -1);
|
||||||
@Override
|
|
||||||
public void onServiceStart(BackgroundService service) {
|
|
||||||
Device device = service.getDevice(deviceId);
|
|
||||||
MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class);
|
|
||||||
if (mousePadPlugin == null) return;
|
|
||||||
mousePadPlugin.sendKeyboardPacket(np);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
if (specialKey != -1) {
|
||||||
|
np.set("specialKey", specialKey);
|
||||||
|
} else if (event.getDisplayLabel() != 0 && modifier) {
|
||||||
|
//Alt will change the utf symbol to non-ascii characters, we want the plain original letter
|
||||||
|
//Since getDisplayLabel will always have a value, we have to check for special keys before
|
||||||
|
char keyCharacter = event.getDisplayLabel();
|
||||||
|
np.set("key", new String(new char[]{keyCharacter}).toLowerCase());
|
||||||
|
} else {
|
||||||
|
return false; //normal keys will be handled by KeyInputConnection
|
||||||
|
}
|
||||||
|
|
||||||
|
sendKeyPressPackage(np);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user