Keyboard Shortcuts Helper: Find device with KeyCharacterMap

In some cases, the helper can be invoked without a device id. This
change solves the issue by querying all existing devices and falling
back to the Virtual keyboard.

Bug: 27828117
Change-Id: I39a1763324137da0ef69cfbad351334911c96200
This commit is contained in:
Clara Bayarri
2016-04-06 10:59:52 +01:00
parent eb3c2d3e63
commit 03f19554b0

View File

@@ -244,10 +244,7 @@ public final class KeyboardShortcuts {
}
public void toggleKeyboardShortcuts(int deviceId) {
InputDevice inputDevice = InputManager.getInstance().getInputDevice(deviceId);
if (inputDevice != null) {
mKeyCharacterMap = inputDevice.getKeyCharacterMap();
}
retrieveKeyCharacterMap(deviceId);
if (mKeyboardShortcutsDialog == null) {
Recents.getSystemServices().requestKeyboardShortcuts(mContext,
new KeyboardShortcutsReceiver() {
@@ -324,6 +321,35 @@ public final class KeyboardShortcuts {
}
}
/**
* Retrieves a {@link KeyCharacterMap} and assigns it to mKeyCharacterMap. If the given id is an
* existing device, that device's map is used. Otherwise, it checks first all available devices
* and if there is a full keyboard it uses that map, otherwise falls back to the Virtual
* Keyboard with its default map.
*/
private void retrieveKeyCharacterMap(int deviceId) {
final InputManager inputManager = InputManager.getInstance();
if (deviceId != -1) {
final InputDevice inputDevice = inputManager.getInputDevice(deviceId);
if (inputDevice != null) {
mKeyCharacterMap = inputDevice.getKeyCharacterMap();
return;
}
}
final int[] deviceIds = inputManager.getInputDeviceIds();
for (int i = 0; i < deviceIds.length; ++i) {
final InputDevice inputDevice = inputManager.getInputDevice(deviceIds[i]);
// -1 is the Virtual Keyboard, with the default key map. Use that one only as last
// resort.
if (inputDevice.getId() != -1 && inputDevice.isFullKeyboard()) {
mKeyCharacterMap = inputDevice.getKeyCharacterMap();
return;
}
}
final InputDevice inputDevice = inputManager.getInputDevice(-1);
mKeyCharacterMap = inputDevice.getKeyCharacterMap();
}
public void dismissKeyboardShortcutsDialog() {
if (mKeyboardShortcutsDialog != null) {
mKeyboardShortcutsDialog.dismiss();
@@ -380,12 +406,6 @@ public final class KeyboardShortcuts {
final int itemsSize = group.getItems().size();
for (int j = 0; j < itemsSize; j++) {
KeyboardShortcutInfo info = group.getItems().get(j);
if (info.getKeycode() != KeyEvent.KEYCODE_UNKNOWN
&& !KeyCharacterMap.deviceHasKey(info.getKeycode())) {
// The user can't achieve this shortcut, so skipping.
Log.w(TAG, "Keyboard Shortcut contains key not on device, skipping.");
continue;
}
List<StringOrDrawable> shortcutKeys = getHumanReadableShortcutKeys(info);
if (shortcutKeys == null) {
// Ignore shortcuts we can't display keys for.
@@ -463,9 +483,7 @@ public final class KeyboardShortcuts {
if (info.getKeycode() == KeyEvent.KEYCODE_UNKNOWN) {
return shortcutKeys;
}
// TODO: Have a generic map for when we don't have the device's.
char displayLabel = mKeyCharacterMap == null
? 0 : mKeyCharacterMap.getDisplayLabel(info.getKeycode());
char displayLabel = mKeyCharacterMap.getDisplayLabel(info.getKeycode());
if (displayLabel != 0) {
displayLabelString = String.valueOf(displayLabel);
} else {