Skip to content

Commit 9f25b7f

Browse files
author
Jeff Brown
committed
Request key maps from input manager service.
Instead of each application loading the KeyCharacterMap from the file system, get them from the input manager service as part of the InputDevice object. Refactored InputManager to be a proper singleton instead of having a bunch of static methods. InputManager now maintains a cache of all InputDevice objects that it has loaded. Currently we never invalidate the cache which can cause InputDevice to return stale motion ranges if the device is reconfigured. This will be fixed in a future change. Added a fake InputDevice with ID -1 to represent the virtual keyboard. Change-Id: If7a695839ad0972317a5aab89e9d1e42ace28eb7
1 parent 54ae147 commit 9f25b7f

39 files changed

+1433
-892
lines changed

api/current.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ package android {
102102
field public static final java.lang.String SET_ALWAYS_FINISH = "android.permission.SET_ALWAYS_FINISH";
103103
field public static final java.lang.String SET_ANIMATION_SCALE = "android.permission.SET_ANIMATION_SCALE";
104104
field public static final java.lang.String SET_DEBUG_APP = "android.permission.SET_DEBUG_APP";
105+
field public static final java.lang.String SET_KEYBOARD_LAYOUT = "android.permission.SET_KEYBOARD_LAYOUT";
105106
field public static final java.lang.String SET_ORIENTATION = "android.permission.SET_ORIENTATION";
106107
field public static final java.lang.String SET_POINTER_SPEED = "android.permission.SET_POINTER_SPEED";
107108
field public static final deprecated java.lang.String SET_PREFERRED_APPLICATIONS = "android.permission.SET_PREFERRED_APPLICATIONS";
@@ -22268,6 +22269,7 @@ package android.view {
2226822269
method public java.util.List<android.view.InputDevice.MotionRange> getMotionRanges();
2226922270
method public java.lang.String getName();
2227022271
method public int getSources();
22272+
method public boolean isVirtual();
2227122273
method public void writeToParcel(android.os.Parcel, int);
2227222274
field public static final android.os.Parcelable.Creator CREATOR;
2227322275
field public static final int KEYBOARD_TYPE_ALPHABETIC = 2; // 0x2
@@ -22327,7 +22329,8 @@ package android.view {
2232722329
method public abstract void onInputQueueDestroyed(android.view.InputQueue);
2232822330
}
2232922331

22330-
public class KeyCharacterMap {
22332+
public class KeyCharacterMap implements android.os.Parcelable {
22333+
method public int describeContents();
2233122334
method public static boolean deviceHasKey(int);
2233222335
method public static boolean[] deviceHasKeys(int[]);
2233322336
method public int get(int, int);
@@ -22342,10 +22345,12 @@ package android.view {
2234222345
method public char getNumber(int);
2234322346
method public boolean isPrintingKey(int);
2234422347
method public static android.view.KeyCharacterMap load(int);
22348+
method public void writeToParcel(android.os.Parcel, int);
2234522349
field public static final int ALPHA = 3; // 0x3
2234622350
field public static final deprecated int BUILT_IN_KEYBOARD = 0; // 0x0
2234722351
field public static final int COMBINING_ACCENT = -2147483648; // 0x80000000
2234822352
field public static final int COMBINING_ACCENT_MASK = 2147483647; // 0x7fffffff
22353+
field public static final android.os.Parcelable.Creator CREATOR;
2234922354
field public static final int FULL = 4; // 0x4
2235022355
field public static final char HEX_INPUT = 61184; // 0xef00 '\uef00'
2235122356
field public static final int MODIFIER_BEHAVIOR_CHORDED = 0; // 0x0

cmds/input/src/com/android/commands/input/Input.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,15 @@ private void sendSwipe(float x1, float y1, float x2, float y2) {
145145

146146
private void injectKeyEvent(KeyEvent event) {
147147
Log.i(TAG, "InjectKeyEvent: " + event);
148-
InputManager.injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
148+
InputManager.getInstance().injectInputEvent(event,
149+
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
149150
}
150151

151152
private void injectPointerEvent(MotionEvent event) {
152153
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
153154
Log.i("Input", "InjectPointerEvent: " + event);
154-
InputManager.injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
155+
InputManager.getInstance().injectInputEvent(event,
156+
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
155157
}
156158

157159
private static final float lerp(float a, float b, float alpha) {

core/java/android/app/ContextImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,9 @@ public Object createStaticService() {
325325
return createDropBoxManager();
326326
}});
327327

328-
registerService(INPUT_SERVICE, new ServiceFetcher() {
329-
public Object createService(ContextImpl ctx) {
330-
return new InputManager(ctx);
328+
registerService(INPUT_SERVICE, new StaticServiceFetcher() {
329+
public Object createStaticService() {
330+
return InputManager.getInstance();
331331
}});
332332

333333
registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {

core/java/android/app/Instrumentation.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ public void sendKeySync(KeyEvent event) {
883883
}
884884
KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
885885
deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
886-
InputManager.injectInputEvent(newEvent,
886+
InputManager.getInstance().injectInputEvent(newEvent,
887887
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
888888
}
889889

@@ -926,7 +926,8 @@ public void sendPointerSync(MotionEvent event) {
926926
if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
927927
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
928928
}
929-
InputManager.injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
929+
InputManager.getInstance().injectInputEvent(event,
930+
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
930931
}
931932

932933
/**
@@ -945,7 +946,8 @@ public void sendTrackballEventSync(MotionEvent event) {
945946
if ((event.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) {
946947
event.setSource(InputDevice.SOURCE_TRACKBALL);
947948
}
948-
InputManager.injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
949+
InputManager.getInstance().injectInputEvent(event,
950+
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
949951
}
950952

951953
/**

core/java/android/hardware/input/IInputManager.aidl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package android.hardware.input;
1818

19+
import android.hardware.input.KeyboardLayout;
1920
import android.view.InputDevice;
2021
import android.view.InputEvent;
2122

@@ -34,4 +35,11 @@ interface IInputManager {
3435
// Injects an input event into the system. To inject into windows owned by other
3536
// applications, the caller must have the INJECT_EVENTS permission.
3637
boolean injectInputEvent(in InputEvent ev, int mode);
38+
39+
// Keyboard layouts configuration.
40+
KeyboardLayout[] getKeyboardLayouts();
41+
KeyboardLayout getKeyboardLayout(String keyboardLayoutDescriptor);
42+
String getKeyboardLayoutForInputDevice(String inputDeviceDescriptor);
43+
void setKeyboardLayoutForInputDevice(String inputDeviceDescriptor,
44+
String keyboardLayoutDescriptor);
3745
}

0 commit comments

Comments
 (0)