Move stylus tail button gesture detection to PhoneWindowManager
Instead of having custom gesture detection logic in SystemUI for the
stylus tail button, we add a single key gesture detector in
PhoneWindowManager for KEYCODE_STYLUS_BUTTON_TAIL.
We then use the KeyGestureEventHandler in SysUI to listen to
the two shortcuts for opening notes, which includes the stylus tail
button.
This will make it easy to add additional behavior to other gestures for
the stylus tail button, such as long press and double press.
Bug: 293591411
Bug: 358569822
Test: atest KeyGestureEventTests
Test: atest NoteTaskInitializerTest
Flag: com.android.hardware.input.use_key_gesture_event_handler
Change-Id: I753229a2c48bd3e6ac8652de378491f3fc66bfa8
diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java
index 0cabc4c..bdbec55 100644
--- a/core/java/android/hardware/input/KeyGestureEvent.java
+++ b/core/java/android/hardware/input/KeyGestureEvent.java
@@ -22,8 +22,6 @@
import android.view.Display;
import android.view.KeyCharacterMap;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.AnnotationValidations;
import com.android.internal.util.FrameworkStatsLog;
import java.lang.annotation.Retention;
@@ -171,6 +169,14 @@
}
/**
+ * Tests whether this keyboard shortcut event has the given modifiers (i.e. all of the given
+ * modifiers were pressed when this shortcut was triggered).
+ */
+ public boolean hasModifiers(int modifiers) {
+ return (getModifierState() & modifiers) == modifiers;
+ }
+
+ /**
* Key gesture event builder used to create a KeyGestureEvent for tests in Java.
*
* @hide
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt
index 44460ed..eff5fc0 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskInitializer.kt
@@ -75,7 +75,9 @@
* [NoteTaskController], ensure custom actions can be triggered (i.e., keyboard shortcut).
*/
private fun initializeHandleSystemKey() {
- commandQueue.addCallback(callbacks)
+ if (!useKeyGestureEventHandler()) {
+ commandQueue.addCallback(callbacks)
+ }
}
/**
@@ -130,6 +132,11 @@
InputManager.KeyGestureEventHandler {
override fun handleSystemKey(key: KeyEvent) {
+ if (useKeyGestureEventHandler()) {
+ throw IllegalStateException(
+ "handleSystemKey must not be used when KeyGestureEventHandler is used"
+ )
+ }
key.toNoteTaskEntryPointOrNull()?.let(controller::showNoteTask)
}
@@ -151,13 +158,13 @@
override fun handleKeyGestureEvent(
event: KeyGestureEvent,
- focusedToken: IBinder?
+ focusedToken: IBinder?,
): Boolean {
return [email protected](event)
}
override fun isKeyGestureSupported(gestureType: Int): Boolean {
- return [email protected](gestureType);
+ return [email protected](gestureType)
}
}
@@ -209,8 +216,20 @@
"handleKeyGestureEvent: Received OPEN_NOTES gesture event from keycodes: " +
event.keycodes.contentToString()
}
- backgroundExecutor.execute { controller.showNoteTask(KEYBOARD_SHORTCUT) }
- return true
+ if (
+ event.keycodes.contains(KEYCODE_N) &&
+ event.hasModifiers(KeyEvent.META_CTRL_ON or KeyEvent.META_META_ON)
+ ) {
+ debugLog { "Note task triggered by keyboard shortcut" }
+ backgroundExecutor.execute { controller.showNoteTask(KEYBOARD_SHORTCUT) }
+ return true
+ }
+ if (event.keycodes.size == 1 && event.keycodes[0] == KEYCODE_STYLUS_BUTTON_TAIL) {
+ debugLog { "Note task triggered by stylus tail button" }
+ backgroundExecutor.execute { controller.showNoteTask(TAIL_BUTTON) }
+ return true
+ }
+ return false
}
private fun isKeyGestureSupported(gestureType: Int): Boolean {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
index b86d571..ab846f1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskInitializerTest.kt
@@ -21,6 +21,7 @@
import android.hardware.input.KeyGestureEvent
import android.os.UserHandle
import android.os.UserManager
+import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
import android.view.KeyEvent
@@ -32,6 +33,8 @@
import androidx.test.filters.SmallTest
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.SysuiTestCase
+import com.android.systemui.notetask.NoteTaskEntryPoint.KEYBOARD_SHORTCUT
+import com.android.systemui.notetask.NoteTaskEntryPoint.TAIL_BUTTON
import com.android.systemui.settings.FakeUserTracker
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.util.concurrency.FakeExecutor
@@ -62,8 +65,7 @@
@RunWith(AndroidJUnit4::class)
internal class NoteTaskInitializerTest : SysuiTestCase() {
- @get:Rule
- val setFlagsRule = SetFlagsRule()
+ @get:Rule val setFlagsRule = SetFlagsRule()
@Mock lateinit var commandQueue: CommandQueue
@Mock lateinit var inputManager: InputManager
@@ -83,10 +85,7 @@
whenever(keyguardMonitor.isUserUnlocked(userTracker.userId)).thenReturn(true)
}
- private fun createUnderTest(
- isEnabled: Boolean,
- bubbles: Bubbles?,
- ): NoteTaskInitializer =
+ private fun createUnderTest(isEnabled: Boolean, bubbles: Bubbles?): NoteTaskInitializer =
NoteTaskInitializer(
controller = controller,
commandQueue = commandQueue,
@@ -104,7 +103,7 @@
code: Int,
downTime: Long = 0L,
eventTime: Long = 0L,
- metaState: Int = 0
+ metaState: Int = 0,
): KeyEvent = KeyEvent(downTime, eventTime, action, code, 0 /*repeat*/, metaState)
@Test
@@ -113,7 +112,6 @@
createUnderTest(isEnabled = true, bubbles = bubbles).initialize()
- verify(commandQueue).addCallback(any())
verify(roleManager).addOnRoleHoldersChangedListenerAsUser(any(), any(), any())
verify(controller).updateNoteTaskForCurrentUserAndManagedProfiles()
verify(keyguardMonitor).registerCallback(any())
@@ -125,7 +123,6 @@
createUnderTest(isEnabled = true, bubbles = bubbles).initialize()
- verify(commandQueue).addCallback(any())
verify(roleManager).addOnRoleHoldersChangedListenerAsUser(any(), any(), any())
verify(controller, never()).setNoteTaskShortcutEnabled(any(), any())
verify(keyguardMonitor).registerCallback(any())
@@ -165,12 +162,13 @@
}
@Test
+ @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
fun initialize_handleSystemKey() {
val expectedKeyEvent =
createKeyEvent(
ACTION_DOWN,
KEYCODE_N,
- metaState = KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON
+ metaState = KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON,
)
val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
underTest.initialize()
@@ -183,22 +181,66 @@
@Test
@EnableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
- fun initialize_handleKeyGestureEvent() {
- val gestureEvent = KeyGestureEvent.Builder()
- .setKeycodes(intArrayOf(KeyEvent.KEYCODE_N))
- .setModifierState(KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON)
- .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES)
- .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
- .build()
+ fun handlesShortcut_metaCtrlN() {
+ val gestureEvent =
+ KeyGestureEvent.Builder()
+ .setKeycodes(intArrayOf(KeyEvent.KEYCODE_N))
+ .setModifierState(KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON)
+ .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES)
+ .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+ .build()
val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
underTest.initialize()
- val callback =
- withArgCaptor { verify(inputManager).registerKeyGestureEventHandler(capture()) }
+ val callback = withArgCaptor {
+ verify(inputManager).registerKeyGestureEventHandler(capture())
+ }
assertThat(callback.handleKeyGestureEvent(gestureEvent, null)).isTrue()
executor.runAllReady()
- verify(controller).showNoteTask(any())
+ verify(controller).showNoteTask(eq(KEYBOARD_SHORTCUT))
+ }
+
+ @Test
+ @EnableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
+ fun handlesShortcut_stylusTailButton() {
+ val gestureEvent =
+ KeyGestureEvent.Builder()
+ .setKeycodes(intArrayOf(KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL))
+ .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES)
+ .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+ .build()
+ val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
+ underTest.initialize()
+ val callback = withArgCaptor {
+ verify(inputManager).registerKeyGestureEventHandler(capture())
+ }
+
+ assertThat(callback.handleKeyGestureEvent(gestureEvent, null)).isTrue()
+
+ executor.runAllReady()
+ verify(controller).showNoteTask(eq(TAIL_BUTTON))
+ }
+
+ @Test
+ @EnableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
+ fun ignoresUnrelatedShortcuts() {
+ val gestureEvent =
+ KeyGestureEvent.Builder()
+ .setKeycodes(intArrayOf(KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL))
+ .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_HOME)
+ .setAction(KeyGestureEvent.ACTION_GESTURE_COMPLETE)
+ .build()
+ val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
+ underTest.initialize()
+ val callback = withArgCaptor {
+ verify(inputManager).registerKeyGestureEventHandler(capture())
+ }
+
+ assertThat(callback.handleKeyGestureEvent(gestureEvent, null)).isFalse()
+
+ executor.runAllReady()
+ verify(controller, never()).showNoteTask(any())
}
@Test
@@ -249,6 +291,7 @@
}
@Test
+ @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
fun tailButtonGestureDetection_singlePress_shouldShowNoteTaskOnUp() {
val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
underTest.initialize()
@@ -267,6 +310,7 @@
}
@Test
+ @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
fun tailButtonGestureDetection_doublePress_shouldNotShowNoteTaskTwice() {
val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
underTest.initialize()
@@ -289,6 +333,7 @@
}
@Test
+ @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
fun tailButtonGestureDetection_longPress_shouldNotShowNoteTask() {
val underTest = createUnderTest(isEnabled = true, bubbles = bubbles)
underTest.initialize()
diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java
index 73f18d1..9281267 100644
--- a/services/core/java/com/android/server/input/InputManagerInternal.java
+++ b/services/core/java/com/android/server/input/InputManagerInternal.java
@@ -232,6 +232,9 @@
/**
* Notify key gesture was completed by the user.
*
+ * NOTE: This is a temporary API added to assist in a long-term refactor, and is not meant for
+ * general use by system services.
+ *
* @param deviceId the device ID of the keyboard using which the event was completed
* @param keycodes the keys pressed for the event
* @param modifierState the modifier state
@@ -240,4 +243,20 @@
*/
public abstract void notifyKeyGestureCompleted(int deviceId, int[] keycodes, int modifierState,
@KeyGestureEvent.KeyGestureType int event);
+
+ /**
+ * Notify that a key gesture was detected by another system component, and it should be handled
+ * appropriately by KeyGestureController.
+ *
+ * NOTE: This is a temporary API added to assist in a long-term refactor, and is not meant for
+ * general use by system services.
+ *
+ * @param deviceId the device ID of the keyboard using which the event was completed
+ * @param keycodes the keys pressed for the event
+ * @param modifierState the modifier state
+ * @param event the gesture event that was completed
+ *
+ */
+ public abstract void handleKeyGestureInKeyGestureController(int deviceId, int[] keycodes,
+ int modifierState, @KeyGestureEvent.KeyGestureType int event);
}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 65adaba..fd7479e 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -3408,6 +3408,12 @@
mKeyGestureController.notifyKeyGestureCompleted(deviceId, keycodes, modifierState,
gestureType);
}
+
+ @Override
+ public void handleKeyGestureInKeyGestureController(int deviceId, int[] keycodes,
+ int modifierState, @KeyGestureEvent.KeyGestureType int gestureType) {
+ mKeyGestureController.handleKeyGesture(deviceId, keycodes, modifierState, gestureType);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java
index 7fe7891..4538b49 100644
--- a/services/core/java/com/android/server/input/KeyGestureController.java
+++ b/services/core/java/com/android/server/input/KeyGestureController.java
@@ -24,7 +24,6 @@
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
-
import android.hardware.input.AidlKeyGestureEvent;
import android.hardware.input.IKeyGestureEventListener;
import android.hardware.input.IKeyGestureHandler;
@@ -582,8 +581,11 @@
boolean handleKeyGesture(int deviceId, int[] keycodes, int modifierState,
@KeyGestureEvent.KeyGestureType int gestureType, int action, int displayId,
IBinder focusedToken, int flags) {
- AidlKeyGestureEvent event = createKeyGestureEvent(deviceId, keycodes,
- modifierState, gestureType, action, displayId, flags);
+ return handleKeyGesture(createKeyGestureEvent(deviceId, keycodes,
+ modifierState, gestureType, action, displayId, flags), focusedToken);
+ }
+
+ private boolean handleKeyGesture(AidlKeyGestureEvent event, @Nullable IBinder focusedToken) {
synchronized (mKeyGestureHandlerRecords) {
for (KeyGestureHandlerRecord handler : mKeyGestureHandlerRecords.values()) {
if (handler.handleKeyGesture(event, focusedToken)) {
@@ -616,6 +618,13 @@
mHandler.obtainMessage(MSG_NOTIFY_KEY_GESTURE_EVENT, event).sendToTarget();
}
+ public void handleKeyGesture(int deviceId, int[] keycodes, int modifierState,
+ @KeyGestureEvent.KeyGestureType int gestureType) {
+ AidlKeyGestureEvent event = createKeyGestureEvent(deviceId, keycodes, modifierState,
+ gestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE, Display.DEFAULT_DISPLAY, 0);
+ handleKeyGesture(event, null /*focusedToken*/);
+ }
+
@MainThread
private void notifyKeyGestureEvent(AidlKeyGestureEvent event) {
InputDevice device = getInputDevice(event.deviceId);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 02c02b0..63491e8 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -47,6 +47,7 @@
import static android.view.KeyEvent.KEYCODE_HOME;
import static android.view.KeyEvent.KEYCODE_POWER;
import static android.view.KeyEvent.KEYCODE_STEM_PRIMARY;
+import static android.view.KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL;
import static android.view.KeyEvent.KEYCODE_UNKNOWN;
import static android.view.KeyEvent.KEYCODE_VOLUME_DOWN;
import static android.view.KeyEvent.KEYCODE_VOLUME_UP;
@@ -2643,7 +2644,7 @@
}
@Override
- void onKeyUp(long eventTime, int count, int displayId) {
+ void onKeyUp(long eventTime, int count, int displayId, int deviceId, int metaState) {
if (mShouldEarlyShortPressOnPower && count == 1) {
powerPress(eventTime, 1 /*pressCount*/, displayId);
}
@@ -2763,7 +2764,7 @@
}
@Override
- void onKeyUp(long eventTime, int count, int unusedDisplayId) {
+ void onKeyUp(long eventTime, int count, int displayId, int deviceId, int metaState) {
if (count == 1) {
// Save info about the most recent task on the first press of the stem key. This
// may be used later to switch to the most recent app using double press gesture.
@@ -2816,6 +2817,33 @@
}
}
+ // TODO(b/358569822): Move to KeyGestureController.
+ private final class StylusTailButtonRule extends SingleKeyGestureDetector.SingleKeyRule {
+ StylusTailButtonRule() {
+ super(KEYCODE_STYLUS_BUTTON_TAIL);
+ }
+
+ @Override
+ int getMaxMultiPressCount() {
+ return 2;
+ }
+
+ @Override
+ void onPress(long downTime, int displayId) {
+
+ }
+
+ @Override
+ void onKeyUp(long eventTime, int pressCount, int displayId, int deviceId, int metaState) {
+ if (pressCount != 1) {
+ return;
+ }
+ // Single press on tail button triggers the open notes gesture.
+ handleKeyGestureInKeyGestureController(KeyGestureEvent.KEY_GESTURE_TYPE_OPEN_NOTES,
+ deviceId, KEYCODE_STYLUS_BUTTON_TAIL, metaState);
+ }
+ }
+
private void initSingleKeyGestureRules(Looper looper) {
mSingleKeyGestureDetector = SingleKeyGestureDetector.get(mContext, looper);
mSingleKeyGestureDetector.addRule(new PowerKeyRule());
@@ -2825,6 +2853,7 @@
if (hasStemPrimaryBehavior()) {
mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule());
}
+ mSingleKeyGestureDetector.addRule(new StylusTailButtonRule());
}
/**
@@ -3314,6 +3343,16 @@
new int[]{event.getKeyCode()}, event.getMetaState(), gestureType);
}
+ private void handleKeyGestureInKeyGestureController(
+ @KeyGestureEvent.KeyGestureType int gestureType, int deviceId, int keyCode,
+ int metaState) {
+ if (gestureType == KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED) {
+ return;
+ }
+ mInputManagerInternal.handleKeyGestureInKeyGestureController(deviceId, new int[]{keyCode},
+ metaState, gestureType);
+ }
+
@Override
public KeyboardShortcutGroup getApplicationLaunchKeyboardShortcuts(int deviceId) {
return mModifierShortcutManager.getApplicationLaunchKeyboardShortcuts(deviceId);
diff --git a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java
index a060f50..441d3ea 100644
--- a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java
+++ b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java
@@ -105,9 +105,9 @@
/**
* Maximum count of multi presses.
- * Return 1 will trigger onPress immediately when {@link KeyEvent.ACTION_UP}.
+ * Return 1 will trigger onPress immediately when {@link KeyEvent#ACTION_UP}.
* Otherwise trigger onMultiPress immediately when reach max count when
- * {@link KeyEvent.ACTION_DOWN}.
+ * {@link KeyEvent#ACTION_DOWN}.
*/
int getMaxMultiPressCount() {
return 1;
@@ -153,8 +153,10 @@
* @param eventTime the timestamp of this event
* @param pressCount the number of presses detected leading up to this key up event
* @param displayId the display ID of the event
+ * @param deviceId the ID of the input device that generated this event
+ * @param metaState the state of the modifiers when this gesture was detected
*/
- void onKeyUp(long eventTime, int pressCount, int displayId) {}
+ void onKeyUp(long eventTime, int pressCount, int displayId, int deviceId, int metaState) {}
@Override
public String toString() {
@@ -183,7 +185,11 @@
}
private record MessageObject(SingleKeyRule activeRule, int keyCode, int pressCount,
- int displayId) {
+ int displayId, int metaState, int deviceId) {
+ MessageObject(SingleKeyRule activeRule, int keyCode, int pressCount, KeyEvent event) {
+ this(activeRule, keyCode, pressCount, event.getDisplayId(), event.getMetaState(),
+ event.getDeviceId());
+ }
}
static SingleKeyGestureDetector get(Context context, Looper looper) {
@@ -236,7 +242,7 @@
mHandler.removeMessages(MSG_KEY_LONG_PRESS);
mHandler.removeMessages(MSG_KEY_VERY_LONG_PRESS);
MessageObject object = new MessageObject(mActiveRule, keyCode, /* pressCount= */ 1,
- event.getDisplayId());
+ event);
final Message msg = mHandler.obtainMessage(MSG_KEY_LONG_PRESS, object);
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
@@ -284,7 +290,7 @@
if (mKeyPressCounter == 1) {
if (mActiveRule.supportLongPress()) {
MessageObject object = new MessageObject(mActiveRule, keyCode, mKeyPressCounter,
- event.getDisplayId());
+ event);
final Message msg = mHandler.obtainMessage(MSG_KEY_LONG_PRESS, object);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg, mActiveRule.getLongPressTimeoutMs());
@@ -292,7 +298,7 @@
if (mActiveRule.supportVeryLongPress()) {
MessageObject object = new MessageObject(mActiveRule, keyCode, mKeyPressCounter,
- event.getDisplayId());
+ event);
final Message msg = mHandler.obtainMessage(MSG_KEY_VERY_LONG_PRESS, object);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg, mActiveRule.getVeryLongPressTimeoutMs());
@@ -310,7 +316,7 @@
+ " reached the max count " + mKeyPressCounter);
}
MessageObject object = new MessageObject(mActiveRule, keyCode, mKeyPressCounter,
- event.getDisplayId());
+ event);
final Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, object);
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
@@ -351,7 +357,7 @@
if (event.getKeyCode() == mActiveRule.mKeyCode) {
// key-up action should always be triggered if not processed by long press.
MessageObject object = new MessageObject(mActiveRule, mActiveRule.mKeyCode,
- mKeyPressCounter, event.getDisplayId());
+ mKeyPressCounter, event);
Message msgKeyUp = mHandler.obtainMessage(MSG_KEY_UP, object);
msgKeyUp.setAsynchronous(true);
mHandler.sendMessage(msgKeyUp);
@@ -362,7 +368,7 @@
Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode()));
}
object = new MessageObject(mActiveRule, mActiveRule.mKeyCode,
- /* pressCount= */ 1, event.getDisplayId());
+ /* pressCount= */ 1, event);
Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, object);
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
@@ -373,7 +379,7 @@
// This could be a multi-press. Wait a little bit longer to confirm.
if (mKeyPressCounter < mActiveRule.getMaxMultiPressCount()) {
object = new MessageObject(mActiveRule, mActiveRule.mKeyCode,
- mKeyPressCounter, event.getDisplayId());
+ mKeyPressCounter, event);
Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, object);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg, MULTI_PRESS_TIMEOUT);
@@ -452,7 +458,8 @@
Log.i(TAG, "Detect key up " + KeyEvent.keyCodeToString(keyCode)
+ " on display " + displayId);
}
- rule.onKeyUp(mLastDownTime, pressCount, displayId);
+ rule.onKeyUp(mLastDownTime, pressCount, displayId, object.deviceId,
+ object.metaState);
break;
case MSG_KEY_LONG_PRESS:
if (DEBUG) {
diff --git a/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java
index 7ea5010..ff8b6d3 100644
--- a/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java
@@ -141,7 +141,8 @@
}
@Override
- void onKeyUp(long eventTime, int multiPressCount, int displayId) {
+ void onKeyUp(long eventTime, int multiPressCount, int displayId, int deviceId,
+ int metaState) {
mKeyUpQueue.add(new KeyUpData(KEYCODE_POWER, multiPressCount));
}
});
@@ -177,7 +178,8 @@
}
@Override
- void onKeyUp(long eventTime, int multiPressCount, int displayId) {
+ void onKeyUp(long eventTime, int multiPressCount, int displayId, int deviceId,
+ int metaState) {
mKeyUpQueue.add(new KeyUpData(KEYCODE_BACK, multiPressCount));
}