WindowManager: Communicate with input system by WindowTokens.
Once we switch to a model of passing InputWindowInfo through
SurfaceFlinger, the handles will be parcelled and we will
no longer receive the same literal object back from "interceptKeyBeforeQueueing"
or other input callbacks. This means the approach of saddling a WindowState
on to the object for later retreival will no longer work. Instead we pass
the IBinder WindowState#mClient in when registering the input channel, and modify the
input system to pass it back to us as a sort of UUID.
Bug: 80101428
Bug: 113136004
Bug: 111440400
Test: Home button still works.
Change-Id: I0f41e0d08b034aa037518c3a8fb21be1453565da
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 80b1893..3a31c9c 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -199,7 +199,7 @@
private static native boolean nativeHasKeys(long ptr,
int deviceId, int sourceMask, int[] keyCodes, boolean[] keyExists);
private static native void nativeRegisterInputChannel(long ptr, InputChannel inputChannel,
- InputWindowHandle inputWindowHandle, int displayId);
+ int displayId);
private static native void nativeUnregisterInputChannel(long ptr, InputChannel inputChannel);
private static native void nativeSetInputFilterEnabled(long ptr, boolean enable);
private static native int nativeInjectInputEvent(long ptr, InputEvent event,
@@ -488,8 +488,7 @@
}
InputChannel[] inputChannels = InputChannel.openInputChannelPair(inputChannelName);
- // Register channel for monitor.
- nativeRegisterInputChannel(mPtr, inputChannels[0], null, displayId);
+ nativeRegisterInputChannel(mPtr, inputChannels[0], displayId);
inputChannels[0].dispose(); // don't need to retain the Java object reference
return inputChannels[1];
}
@@ -500,14 +499,17 @@
* @param inputWindowHandle The handle of the input window associated with the
* input channel, or null if none.
*/
- public void registerInputChannel(InputChannel inputChannel,
- InputWindowHandle inputWindowHandle) {
+ public void registerInputChannel(InputChannel inputChannel, IBinder token) {
if (inputChannel == null) {
throw new IllegalArgumentException("inputChannel must not be null.");
}
- // Register channel for normal.
- nativeRegisterInputChannel(mPtr, inputChannel, inputWindowHandle, Display.INVALID_DISPLAY);
+ if (token == null) {
+ token = new Binder();
+ }
+ inputChannel.setToken(token);
+
+ nativeRegisterInputChannel(mPtr, inputChannel, Display.INVALID_DISPLAY);
}
/**
@@ -1793,15 +1795,15 @@
}
// Native callback.
- private void notifyInputChannelBroken(InputWindowHandle inputWindowHandle) {
- mWindowManagerCallbacks.notifyInputChannelBroken(inputWindowHandle);
+ private void notifyInputChannelBroken(IBinder token) {
+ mWindowManagerCallbacks.notifyInputChannelBroken(token);
}
// Native callback.
private long notifyANR(InputApplicationHandle inputApplicationHandle,
- InputWindowHandle inputWindowHandle, String reason) {
+ IBinder token, String reason) {
return mWindowManagerCallbacks.notifyANR(
- inputApplicationHandle, inputWindowHandle, reason);
+ inputApplicationHandle, token, reason);
}
// Native callback.
@@ -1832,13 +1834,13 @@
}
// Native callback.
- private long interceptKeyBeforeDispatching(InputWindowHandle focus,
+ private long interceptKeyBeforeDispatching(IBinder focus,
KeyEvent event, int policyFlags) {
return mWindowManagerCallbacks.interceptKeyBeforeDispatching(focus, event, policyFlags);
}
// Native callback.
- private KeyEvent dispatchUnhandledKey(InputWindowHandle focus,
+ private KeyEvent dispatchUnhandledKey(IBinder focus,
KeyEvent event, int policyFlags) {
return mWindowManagerCallbacks.dispatchUnhandledKey(focus, event, policyFlags);
}
@@ -1989,19 +1991,19 @@
public void notifyCameraLensCoverSwitchChanged(long whenNanos, boolean lensCovered);
- public void notifyInputChannelBroken(InputWindowHandle inputWindowHandle);
+ public void notifyInputChannelBroken(IBinder token);
public long notifyANR(InputApplicationHandle inputApplicationHandle,
- InputWindowHandle inputWindowHandle, String reason);
+ IBinder token, String reason);
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags);
public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags);
- public long interceptKeyBeforeDispatching(InputWindowHandle focus,
+ public long interceptKeyBeforeDispatching(IBinder token,
KeyEvent event, int policyFlags);
- public KeyEvent dispatchUnhandledKey(InputWindowHandle focus,
+ public KeyEvent dispatchUnhandledKey(IBinder token,
KeyEvent event, int policyFlags);
public int getPointerLayer();