Loading services/core/java/com/android/server/policy/KeyCombinationManager.java +12 −2 Original line number Diff line number Diff line Loading @@ -18,11 +18,13 @@ package com.android.server.policy; import static android.view.KeyEvent.KEYCODE_POWER; import android.os.SystemClock; import android.util.Log; import android.util.SparseLongArray; import android.view.KeyEvent; import com.android.internal.util.ToBooleanFunction; import java.io.PrintWriter; import java.util.ArrayList; import java.util.function.Consumer; Loading Loading @@ -89,8 +91,8 @@ public class KeyCombinationManager { @Override public String toString() { return "KeyCode1 = " + KeyEvent.keyCodeToString(mKeyCode1) + ", KeyCode2 = " + KeyEvent.keyCodeToString(mKeyCode2); return KeyEvent.keyCodeToString(mKeyCode1) + " + " + KeyEvent.keyCodeToString(mKeyCode2); } } Loading Loading @@ -151,6 +153,7 @@ public class KeyCombinationManager { if (!rule.shouldInterceptKeys(mDownTimes)) { return false; } Log.v(TAG, "Performing combination rule : " + rule); rule.execute(); mTriggeredRule = rule; return true; Loading Loading @@ -230,4 +233,11 @@ public class KeyCombinationManager { } return false; } void dump(String prefix, PrintWriter pw) { pw.println(prefix + "KeyCombination rules:"); forAllRules(mRules, (rule)-> { pw.println(prefix + " " + rule); }); } } services/core/java/com/android/server/policy/PhoneWindowManager.java +23 −22 Original line number Diff line number Diff line Loading @@ -434,7 +434,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // to hold wakelocks during dispatch and eliminating the critical path. volatile boolean mPowerKeyHandled; volatile boolean mBackKeyHandled; volatile boolean mBeganFromNonInteractive; volatile boolean mEndCallKeyHandled; volatile boolean mCameraGestureTriggeredDuringGoingToSleep; Loading Loading @@ -876,16 +875,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (!mPowerKeyHandled) { if (!interactive) { wakeUpFromPowerKey(event.getDownTime()); if (mSupportLongPressPowerWhenNonInteractive && hasLongPressOnPowerBehavior()) { mBeganFromNonInteractive = true; } else { final int maxCount = getMaxMultiPressPowerCount(); if (maxCount <= 1) { mPowerKeyHandled = true; } else { mBeganFromNonInteractive = true; } } } } else { // handled by another power key policy. Loading @@ -895,7 +884,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) { private void interceptPowerKeyUp(KeyEvent event, boolean canceled) { final boolean handled = canceled || mPowerKeyHandled; if (!handled) { Loading @@ -906,33 +895,36 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else { // handled by single key or another power key policy. mSingleKeyGestureDetector.reset(); finishPowerKeyPress(); } finishPowerKeyPress(); } private void finishPowerKeyPress() { mBeganFromNonInteractive = false; mPowerKeyHandled = false; if (mPowerKeyWakeLock.isHeld()) { mPowerKeyWakeLock.release(); } } private void powerPress(long eventTime, boolean interactive, int count) { private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) { Slog.i(TAG, "Suppressed redundant power key press while " + "already in the process of turning the screen on."); return; } final boolean interactive = Display.isOnState(mDefaultDisplay.getState()); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + mBeganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); if (count == 2) { powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); } else if (count == 3) { powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior); } else if (interactive && !mBeganFromNonInteractive) { } else if (interactive && !beganFromNonInteractive) { switch (mShortPressOnPowerBehavior) { case SHORT_PRESS_POWER_NOTHING: break; Loading Loading @@ -1906,12 +1898,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onPress(long downTime) { powerPress(downTime, true, 1 /*count*/); powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); finishPowerKeyPress(); } @Override void onLongPress(long eventTime) { if (mSingleKeyGestureDetector.beganFromNonInteractive() && !mSupportLongPressPowerWhenNonInteractive) { Slog.v(TAG, "Not support long press power when device is not interactive."); return; } powerLongPress(eventTime); } Loading @@ -1923,7 +1922,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onMultiPress(long downTime, int count) { powerPress(downTime, true, count); powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); finishPowerKeyPress(); } } Loading Loading @@ -3562,7 +3561,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (down) { interceptPowerKeyDown(event, interactiveAndOn); } else { interceptPowerKeyUp(event, interactiveAndOn, canceled); interceptPowerKeyUp(event, canceled); } break; } Loading Loading @@ -3752,7 +3751,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mSingleKeyGestureDetector.interceptKey(event); mSingleKeyGestureDetector.interceptKey(event, interactive); } // The camera gesture will be detected by GestureLauncherService. Loading Loading @@ -5230,6 +5229,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive); mGlobalKeyManager.dump(prefix, pw); mKeyCombinationManager.dump(prefix, pw); mSingleKeyGestureDetector.dump(prefix, pw); if (mWakeGestureListener != null) { mWakeGestureListener.dump(pw, prefix); Loading services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +25 −8 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.Log; import android.view.KeyEvent; import android.view.ViewConfiguration; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; Loading @@ -37,7 +38,7 @@ import java.util.ArrayList; public final class SingleKeyGestureDetector { private static final String TAG = "SingleKeyGesture"; private static final boolean DEBUG = false; private static final boolean DEBUG = PhoneWindowManager.DEBUG_INPUT; private static final int MSG_KEY_LONG_PRESS = 0; private static final int MSG_KEY_VERY_LONG_PRESS = 1; Loading @@ -47,6 +48,7 @@ public final class SingleKeyGestureDetector { private final long mVeryLongPressTimeout; private volatile int mKeyPressCounter; private boolean mBeganFromNonInteractive = false; private final ArrayList<SingleKeyRule> mRules = new ArrayList(); private SingleKeyRule mActiveRule = null; Loading @@ -57,7 +59,6 @@ public final class SingleKeyGestureDetector { private final Handler mHandler; private static final long MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); /** Supported gesture flags */ public static final int KEY_LONGPRESS = 1 << 1; public static final int KEY_VERYLONGPRESS = 1 << 2; Loading Loading @@ -144,9 +145,9 @@ public final class SingleKeyGestureDetector { @Override public String toString() { return "KeyCode=" + KeyEvent.keyCodeToString(mKeyCode) + ", long press : " + supportLongPress() + ", very Long press : " + supportVeryLongPress() + ", max multi press count : " + getMaxMultiPressCount(); + ", LongPress=" + supportLongPress() + ", VeryLongPress=" + supportVeryLongPress() + ", MaxMultiPressCount=" + getMaxMultiPressCount(); } } Loading @@ -161,8 +162,12 @@ public final class SingleKeyGestureDetector { mRules.add(rule); } void interceptKey(KeyEvent event) { void interceptKey(KeyEvent event, boolean interactive) { if (event.getAction() == KeyEvent.ACTION_DOWN) { // Store the non interactive state when first down. if (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) { mBeganFromNonInteractive = !interactive; } interceptKeyDown(event); } else { interceptKeyUp(event); Loading Loading @@ -268,6 +273,7 @@ public final class SingleKeyGestureDetector { Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode())); } mActiveRule.onPress(downTime); reset(); return true; } Loading Loading @@ -316,6 +322,17 @@ public final class SingleKeyGestureDetector { return false; } boolean beganFromNonInteractive() { return mBeganFromNonInteractive; } void dump(String prefix, PrintWriter pw) { pw.println(prefix + "SingleKey rules:"); for (SingleKeyRule rule : mRules) { pw.println(prefix + " " + rule); } } private class KeyHandler extends Handler { KeyHandler() { super(Looper.getMainLooper()); Loading Loading @@ -354,7 +371,7 @@ public final class SingleKeyGestureDetector { } else { mActiveRule.onMultiPress(eventTime, mKeyPressCounter); } mKeyPressCounter = 0; reset(); break; } } Loading services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +34 −2 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static com.android.server.policy.SingleKeyGestureDetector.KEY_LONGPRESS; import static com.android.server.policy.SingleKeyGestureDetector.KEY_VERYLONGPRESS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.app.Instrumentation; Loading Loading @@ -62,6 +63,10 @@ public class SingleKeyGestureTests { private long mLongPressTime; private long mVeryLongPressTime; // Allow press from non interactive mode. private boolean mAllowNonInteractiveForPress = true; private boolean mAllowNonInteractiveForLongPress = true; @Before public void setUp() { mDetector = new SingleKeyGestureDetector(mContext); Loading @@ -81,11 +86,17 @@ public class SingleKeyGestureTests { } @Override public void onPress(long downTime) { if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForPress) { return; } mShortPressed.countDown(); } @Override void onLongPress(long downTime) { if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForLongPress) { return; } mLongPressed.countDown(); } Loading @@ -96,6 +107,9 @@ public class SingleKeyGestureTests { @Override void onMultiPress(long downTime, int count) { if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForPress) { return; } mMultiPressed.countDown(); assertEquals(mMaxMultiPressPowerCount, count); } Loading @@ -103,9 +117,13 @@ public class SingleKeyGestureTests { } private void pressKey(long eventTime, int keyCode, long pressTime) { pressKey(eventTime, keyCode, pressTime, true /* interactive */); } private void pressKey(long eventTime, int keyCode, long pressTime, boolean interactive) { final KeyEvent keyDown = new KeyEvent(eventTime, eventTime, ACTION_DOWN, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyDown); mDetector.interceptKey(keyDown, interactive); // keep press down. try { Loading @@ -118,7 +136,7 @@ public class SingleKeyGestureTests { final KeyEvent keyUp = new KeyEvent(eventTime, eventTime, ACTION_UP, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyUp); mDetector.interceptKey(keyUp, interactive); } @Test Loading Loading @@ -149,4 +167,18 @@ public class SingleKeyGestureTests { pressKey(eventTime, KEYCODE_POWER, 0 /* pressTime */); assertTrue(mMultiPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } @Test public void testNonInteractive() throws InterruptedException { long eventTime = SystemClock.uptimeMillis(); // Disallow short press behavior from non interactive. mAllowNonInteractiveForPress = false; pressKey(eventTime, KEYCODE_POWER, 0 /* pressTime */, false /* interactive */); assertFalse(mShortPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); // Allow long press behavior from non interactive. eventTime = SystemClock.uptimeMillis(); pressKey(eventTime, KEYCODE_POWER, mLongPressTime, false /* interactive */); assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } } Loading
services/core/java/com/android/server/policy/KeyCombinationManager.java +12 −2 Original line number Diff line number Diff line Loading @@ -18,11 +18,13 @@ package com.android.server.policy; import static android.view.KeyEvent.KEYCODE_POWER; import android.os.SystemClock; import android.util.Log; import android.util.SparseLongArray; import android.view.KeyEvent; import com.android.internal.util.ToBooleanFunction; import java.io.PrintWriter; import java.util.ArrayList; import java.util.function.Consumer; Loading Loading @@ -89,8 +91,8 @@ public class KeyCombinationManager { @Override public String toString() { return "KeyCode1 = " + KeyEvent.keyCodeToString(mKeyCode1) + ", KeyCode2 = " + KeyEvent.keyCodeToString(mKeyCode2); return KeyEvent.keyCodeToString(mKeyCode1) + " + " + KeyEvent.keyCodeToString(mKeyCode2); } } Loading Loading @@ -151,6 +153,7 @@ public class KeyCombinationManager { if (!rule.shouldInterceptKeys(mDownTimes)) { return false; } Log.v(TAG, "Performing combination rule : " + rule); rule.execute(); mTriggeredRule = rule; return true; Loading Loading @@ -230,4 +233,11 @@ public class KeyCombinationManager { } return false; } void dump(String prefix, PrintWriter pw) { pw.println(prefix + "KeyCombination rules:"); forAllRules(mRules, (rule)-> { pw.println(prefix + " " + rule); }); } }
services/core/java/com/android/server/policy/PhoneWindowManager.java +23 −22 Original line number Diff line number Diff line Loading @@ -434,7 +434,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // to hold wakelocks during dispatch and eliminating the critical path. volatile boolean mPowerKeyHandled; volatile boolean mBackKeyHandled; volatile boolean mBeganFromNonInteractive; volatile boolean mEndCallKeyHandled; volatile boolean mCameraGestureTriggeredDuringGoingToSleep; Loading Loading @@ -876,16 +875,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (!mPowerKeyHandled) { if (!interactive) { wakeUpFromPowerKey(event.getDownTime()); if (mSupportLongPressPowerWhenNonInteractive && hasLongPressOnPowerBehavior()) { mBeganFromNonInteractive = true; } else { final int maxCount = getMaxMultiPressPowerCount(); if (maxCount <= 1) { mPowerKeyHandled = true; } else { mBeganFromNonInteractive = true; } } } } else { // handled by another power key policy. Loading @@ -895,7 +884,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) { private void interceptPowerKeyUp(KeyEvent event, boolean canceled) { final boolean handled = canceled || mPowerKeyHandled; if (!handled) { Loading @@ -906,33 +895,36 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else { // handled by single key or another power key policy. mSingleKeyGestureDetector.reset(); finishPowerKeyPress(); } finishPowerKeyPress(); } private void finishPowerKeyPress() { mBeganFromNonInteractive = false; mPowerKeyHandled = false; if (mPowerKeyWakeLock.isHeld()) { mPowerKeyWakeLock.release(); } } private void powerPress(long eventTime, boolean interactive, int count) { private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) { Slog.i(TAG, "Suppressed redundant power key press while " + "already in the process of turning the screen on."); return; } final boolean interactive = Display.isOnState(mDefaultDisplay.getState()); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + mBeganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); if (count == 2) { powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); } else if (count == 3) { powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior); } else if (interactive && !mBeganFromNonInteractive) { } else if (interactive && !beganFromNonInteractive) { switch (mShortPressOnPowerBehavior) { case SHORT_PRESS_POWER_NOTHING: break; Loading Loading @@ -1906,12 +1898,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onPress(long downTime) { powerPress(downTime, true, 1 /*count*/); powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); finishPowerKeyPress(); } @Override void onLongPress(long eventTime) { if (mSingleKeyGestureDetector.beganFromNonInteractive() && !mSupportLongPressPowerWhenNonInteractive) { Slog.v(TAG, "Not support long press power when device is not interactive."); return; } powerLongPress(eventTime); } Loading @@ -1923,7 +1922,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onMultiPress(long downTime, int count) { powerPress(downTime, true, count); powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); finishPowerKeyPress(); } } Loading Loading @@ -3562,7 +3561,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (down) { interceptPowerKeyDown(event, interactiveAndOn); } else { interceptPowerKeyUp(event, interactiveAndOn, canceled); interceptPowerKeyUp(event, canceled); } break; } Loading Loading @@ -3752,7 +3751,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mSingleKeyGestureDetector.interceptKey(event); mSingleKeyGestureDetector.interceptKey(event, interactive); } // The camera gesture will be detected by GestureLauncherService. Loading Loading @@ -5230,6 +5229,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive); mGlobalKeyManager.dump(prefix, pw); mKeyCombinationManager.dump(prefix, pw); mSingleKeyGestureDetector.dump(prefix, pw); if (mWakeGestureListener != null) { mWakeGestureListener.dump(pw, prefix); Loading
services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +25 −8 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.Log; import android.view.KeyEvent; import android.view.ViewConfiguration; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; Loading @@ -37,7 +38,7 @@ import java.util.ArrayList; public final class SingleKeyGestureDetector { private static final String TAG = "SingleKeyGesture"; private static final boolean DEBUG = false; private static final boolean DEBUG = PhoneWindowManager.DEBUG_INPUT; private static final int MSG_KEY_LONG_PRESS = 0; private static final int MSG_KEY_VERY_LONG_PRESS = 1; Loading @@ -47,6 +48,7 @@ public final class SingleKeyGestureDetector { private final long mVeryLongPressTimeout; private volatile int mKeyPressCounter; private boolean mBeganFromNonInteractive = false; private final ArrayList<SingleKeyRule> mRules = new ArrayList(); private SingleKeyRule mActiveRule = null; Loading @@ -57,7 +59,6 @@ public final class SingleKeyGestureDetector { private final Handler mHandler; private static final long MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); /** Supported gesture flags */ public static final int KEY_LONGPRESS = 1 << 1; public static final int KEY_VERYLONGPRESS = 1 << 2; Loading Loading @@ -144,9 +145,9 @@ public final class SingleKeyGestureDetector { @Override public String toString() { return "KeyCode=" + KeyEvent.keyCodeToString(mKeyCode) + ", long press : " + supportLongPress() + ", very Long press : " + supportVeryLongPress() + ", max multi press count : " + getMaxMultiPressCount(); + ", LongPress=" + supportLongPress() + ", VeryLongPress=" + supportVeryLongPress() + ", MaxMultiPressCount=" + getMaxMultiPressCount(); } } Loading @@ -161,8 +162,12 @@ public final class SingleKeyGestureDetector { mRules.add(rule); } void interceptKey(KeyEvent event) { void interceptKey(KeyEvent event, boolean interactive) { if (event.getAction() == KeyEvent.ACTION_DOWN) { // Store the non interactive state when first down. if (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) { mBeganFromNonInteractive = !interactive; } interceptKeyDown(event); } else { interceptKeyUp(event); Loading Loading @@ -268,6 +273,7 @@ public final class SingleKeyGestureDetector { Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode())); } mActiveRule.onPress(downTime); reset(); return true; } Loading Loading @@ -316,6 +322,17 @@ public final class SingleKeyGestureDetector { return false; } boolean beganFromNonInteractive() { return mBeganFromNonInteractive; } void dump(String prefix, PrintWriter pw) { pw.println(prefix + "SingleKey rules:"); for (SingleKeyRule rule : mRules) { pw.println(prefix + " " + rule); } } private class KeyHandler extends Handler { KeyHandler() { super(Looper.getMainLooper()); Loading Loading @@ -354,7 +371,7 @@ public final class SingleKeyGestureDetector { } else { mActiveRule.onMultiPress(eventTime, mKeyPressCounter); } mKeyPressCounter = 0; reset(); break; } } Loading
services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +34 −2 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static com.android.server.policy.SingleKeyGestureDetector.KEY_LONGPRESS; import static com.android.server.policy.SingleKeyGestureDetector.KEY_VERYLONGPRESS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.app.Instrumentation; Loading Loading @@ -62,6 +63,10 @@ public class SingleKeyGestureTests { private long mLongPressTime; private long mVeryLongPressTime; // Allow press from non interactive mode. private boolean mAllowNonInteractiveForPress = true; private boolean mAllowNonInteractiveForLongPress = true; @Before public void setUp() { mDetector = new SingleKeyGestureDetector(mContext); Loading @@ -81,11 +86,17 @@ public class SingleKeyGestureTests { } @Override public void onPress(long downTime) { if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForPress) { return; } mShortPressed.countDown(); } @Override void onLongPress(long downTime) { if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForLongPress) { return; } mLongPressed.countDown(); } Loading @@ -96,6 +107,9 @@ public class SingleKeyGestureTests { @Override void onMultiPress(long downTime, int count) { if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForPress) { return; } mMultiPressed.countDown(); assertEquals(mMaxMultiPressPowerCount, count); } Loading @@ -103,9 +117,13 @@ public class SingleKeyGestureTests { } private void pressKey(long eventTime, int keyCode, long pressTime) { pressKey(eventTime, keyCode, pressTime, true /* interactive */); } private void pressKey(long eventTime, int keyCode, long pressTime, boolean interactive) { final KeyEvent keyDown = new KeyEvent(eventTime, eventTime, ACTION_DOWN, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyDown); mDetector.interceptKey(keyDown, interactive); // keep press down. try { Loading @@ -118,7 +136,7 @@ public class SingleKeyGestureTests { final KeyEvent keyUp = new KeyEvent(eventTime, eventTime, ACTION_UP, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyUp); mDetector.interceptKey(keyUp, interactive); } @Test Loading Loading @@ -149,4 +167,18 @@ public class SingleKeyGestureTests { pressKey(eventTime, KEYCODE_POWER, 0 /* pressTime */); assertTrue(mMultiPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } @Test public void testNonInteractive() throws InterruptedException { long eventTime = SystemClock.uptimeMillis(); // Disallow short press behavior from non interactive. mAllowNonInteractiveForPress = false; pressKey(eventTime, KEYCODE_POWER, 0 /* pressTime */, false /* interactive */); assertFalse(mShortPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); // Allow long press behavior from non interactive. eventTime = SystemClock.uptimeMillis(); pressKey(eventTime, KEYCODE_POWER, mLongPressTime, false /* interactive */); assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } }