Loading services/core/java/com/android/server/policy/PhoneWindowManager.java +42 −29 Original line number Diff line number Diff line Loading @@ -68,8 +68,6 @@ import static android.view.WindowManagerGlobal.ADD_OKAY; import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY; import static com.android.server.policy.SingleKeyGestureDetector.KEY_LONGPRESS; import static com.android.server.policy.SingleKeyGestureDetector.KEY_VERYLONGPRESS; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED; Loading Loading @@ -2246,10 +2244,21 @@ public class PhoneWindowManager implements WindowManagerPolicy { * Rule for single power key gesture. */ private final class PowerKeyRule extends SingleKeyGestureDetector.SingleKeyRule { PowerKeyRule(int gestures) { super(KEYCODE_POWER, gestures); PowerKeyRule() { super(KEYCODE_POWER); } @Override boolean supportLongPress() { return hasLongPressOnPowerBehavior(); } @Override boolean supportVeryLongPress() { return hasVeryLongPressOnPowerBehavior(); } @Override int getMaxMultiPressCount() { return getMaxMultiPressPowerCount(); Loading Loading @@ -2297,8 +2306,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { * Rule for single back key gesture. */ private final class BackKeyRule extends SingleKeyGestureDetector.SingleKeyRule { BackKeyRule(int gestures) { super(KEYCODE_BACK, gestures); BackKeyRule() { super(KEYCODE_BACK); } @Override boolean supportLongPress() { return hasLongPressOnBackBehavior(); } @Override Loading @@ -2321,8 +2335,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { * Rule for single stem primary key gesture. */ private final class StemPrimaryKeyRule extends SingleKeyGestureDetector.SingleKeyRule { StemPrimaryKeyRule(int gestures) { super(KeyEvent.KEYCODE_STEM_PRIMARY, gestures); StemPrimaryKeyRule() { super(KeyEvent.KEYCODE_STEM_PRIMARY); } @Override boolean supportLongPress() { return hasLongPressOnStemPrimaryBehavior(); } @Override Loading @@ -2348,25 +2367,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void initSingleKeyGestureRules() { mSingleKeyGestureDetector = SingleKeyGestureDetector.get(mContext); int powerKeyGestures = 0; if (hasVeryLongPressOnPowerBehavior()) { powerKeyGestures |= KEY_VERYLONGPRESS; } if (hasLongPressOnPowerBehavior()) { powerKeyGestures |= KEY_LONGPRESS; } mSingleKeyGestureDetector.addRule(new PowerKeyRule(powerKeyGestures)); mSingleKeyGestureDetector.addRule(new PowerKeyRule()); if (hasLongPressOnBackBehavior()) { mSingleKeyGestureDetector.addRule(new BackKeyRule(KEY_LONGPRESS)); mSingleKeyGestureDetector.addRule(new BackKeyRule()); } if (hasStemPrimaryBehavior()) { int stemPrimaryKeyGestures = 0; if (hasLongPressOnStemPrimaryBehavior()) { stemPrimaryKeyGestures |= KEY_LONGPRESS; } mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule(stemPrimaryKeyGestures)); mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule()); } } Loading Loading @@ -2456,19 +2462,26 @@ public class PhoneWindowManager implements WindowManagerPolicy { updateRotation = true; } mLongPressOnPowerBehavior = Settings.Global.getInt(resolver, final int longPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerBehavior)); final int veryLongPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_veryLongPressOnPowerBehavior)); if (mLongPressOnPowerBehavior != longPressOnPowerBehavior || mVeryLongPressOnPowerBehavior != veryLongPressOnPowerBehavior) { mLongPressOnPowerBehavior = longPressOnPowerBehavior; mVeryLongPressOnPowerBehavior = veryLongPressOnPowerBehavior; } mLongPressOnPowerAssistantTimeoutMs = Settings.Global.getLong( mContext.getContentResolver(), Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerDurationMs)); mVeryLongPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_veryLongPressOnPowerBehavior)); mPowerVolUpBehavior = Settings.Global.getInt(resolver, Settings.Global.KEY_CHORD_POWER_VOLUME_UP, mContext.getResources().getInteger( Loading services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +5 −22 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.server.policy; import android.annotation.IntDef; import android.content.Context; import android.os.Handler; import android.os.Looper; Loading @@ -26,8 +25,6 @@ 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 Loading @@ -56,22 +53,10 @@ public final class SingleKeyGestureDetector { private final Handler mHandler; private long mLastDownTime = 0; /** Supported gesture flags */ public static final int KEY_LONGPRESS = 1 << 1; public static final int KEY_VERYLONGPRESS = 1 << 2; static final long MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); static long sDefaultLongPressTimeout; static long sDefaultVeryLongPressTimeout; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "KEY_" }, value = { KEY_LONGPRESS, KEY_VERYLONGPRESS, }) public @interface KeyGestureFlag {} /** * Rule definition for single keys gesture. * E.g : define power key. Loading @@ -88,11 +73,9 @@ public final class SingleKeyGestureDetector { */ abstract static class SingleKeyRule { private final int mKeyCode; private final int mSupportedGestures; SingleKeyRule(int keyCode, @KeyGestureFlag int supportedGestures) { SingleKeyRule(int keyCode) { mKeyCode = keyCode; mSupportedGestures = supportedGestures; } /** Loading @@ -105,15 +88,15 @@ public final class SingleKeyGestureDetector { /** * True if the rule support long press. */ private boolean supportLongPress() { return (mSupportedGestures & KEY_LONGPRESS) != 0; boolean supportLongPress() { return false; } /** * True if the rule support very long press. */ private boolean supportVeryLongPress() { return (mSupportedGestures & KEY_VERYLONGPRESS) != 0; boolean supportVeryLongPress() { return false; } /** Loading services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +36 −6 Original line number Diff line number Diff line Loading @@ -23,9 +23,6 @@ import static android.view.KeyEvent.KEYCODE_POWER; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; 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; Loading Loading @@ -71,6 +68,10 @@ public class SingleKeyGestureTests { private boolean mAllowNonInteractiveForPress = true; private boolean mAllowNonInteractiveForLongPress = true; private boolean mLongPressOnPowerBehavior = true; private boolean mVeryLongPressOnPowerBehavior = true; private boolean mLongPressOnBackBehavior = false; @Before public void setUp() { mInstrumentation.runOnMainSync(() -> { Loading @@ -84,8 +85,15 @@ public class SingleKeyGestureTests { } private void initSingleKeyGestureRules() { mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER, KEY_LONGPRESS | KEY_VERYLONGPRESS) { mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER) { @Override boolean supportLongPress() { return mLongPressOnPowerBehavior; } @Override boolean supportVeryLongPress() { return mVeryLongPressOnPowerBehavior; } @Override int getMaxMultiPressCount() { return mMaxMultiPressCount; Loading Loading @@ -122,7 +130,11 @@ public class SingleKeyGestureTests { } }); mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_BACK, 0) { mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_BACK) { @Override boolean supportLongPress() { return mLongPressOnBackBehavior; } @Override int getMaxMultiPressCount() { return mMaxMultiPressCount; Loading @@ -144,6 +156,11 @@ public class SingleKeyGestureTests { assertTrue(mMaxMultiPressCount >= count); assertEquals(mExpectedMultiPressCount, count); } @Override void onLongPress(long downTime) { mLongPressed.countDown(); } }); } Loading Loading @@ -267,4 +284,17 @@ public class SingleKeyGestureTests { handlerThread.quitSafely(); } } @Test public void testUpdateRule() throws InterruptedException { // Power key rule doesn't allow the long press gesture. mLongPressOnPowerBehavior = false; pressKey(KEYCODE_POWER, mLongPressTime); assertFalse(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); // Back key rule allows the long press gesture. mLongPressOnBackBehavior = true; pressKey(KEYCODE_BACK, mLongPressTime); assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } } Loading
services/core/java/com/android/server/policy/PhoneWindowManager.java +42 −29 Original line number Diff line number Diff line Loading @@ -68,8 +68,6 @@ import static android.view.WindowManagerGlobal.ADD_OKAY; import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY; import static com.android.server.policy.SingleKeyGestureDetector.KEY_LONGPRESS; import static com.android.server.policy.SingleKeyGestureDetector.KEY_VERYLONGPRESS; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED; Loading Loading @@ -2246,10 +2244,21 @@ public class PhoneWindowManager implements WindowManagerPolicy { * Rule for single power key gesture. */ private final class PowerKeyRule extends SingleKeyGestureDetector.SingleKeyRule { PowerKeyRule(int gestures) { super(KEYCODE_POWER, gestures); PowerKeyRule() { super(KEYCODE_POWER); } @Override boolean supportLongPress() { return hasLongPressOnPowerBehavior(); } @Override boolean supportVeryLongPress() { return hasVeryLongPressOnPowerBehavior(); } @Override int getMaxMultiPressCount() { return getMaxMultiPressPowerCount(); Loading Loading @@ -2297,8 +2306,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { * Rule for single back key gesture. */ private final class BackKeyRule extends SingleKeyGestureDetector.SingleKeyRule { BackKeyRule(int gestures) { super(KEYCODE_BACK, gestures); BackKeyRule() { super(KEYCODE_BACK); } @Override boolean supportLongPress() { return hasLongPressOnBackBehavior(); } @Override Loading @@ -2321,8 +2335,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { * Rule for single stem primary key gesture. */ private final class StemPrimaryKeyRule extends SingleKeyGestureDetector.SingleKeyRule { StemPrimaryKeyRule(int gestures) { super(KeyEvent.KEYCODE_STEM_PRIMARY, gestures); StemPrimaryKeyRule() { super(KeyEvent.KEYCODE_STEM_PRIMARY); } @Override boolean supportLongPress() { return hasLongPressOnStemPrimaryBehavior(); } @Override Loading @@ -2348,25 +2367,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void initSingleKeyGestureRules() { mSingleKeyGestureDetector = SingleKeyGestureDetector.get(mContext); int powerKeyGestures = 0; if (hasVeryLongPressOnPowerBehavior()) { powerKeyGestures |= KEY_VERYLONGPRESS; } if (hasLongPressOnPowerBehavior()) { powerKeyGestures |= KEY_LONGPRESS; } mSingleKeyGestureDetector.addRule(new PowerKeyRule(powerKeyGestures)); mSingleKeyGestureDetector.addRule(new PowerKeyRule()); if (hasLongPressOnBackBehavior()) { mSingleKeyGestureDetector.addRule(new BackKeyRule(KEY_LONGPRESS)); mSingleKeyGestureDetector.addRule(new BackKeyRule()); } if (hasStemPrimaryBehavior()) { int stemPrimaryKeyGestures = 0; if (hasLongPressOnStemPrimaryBehavior()) { stemPrimaryKeyGestures |= KEY_LONGPRESS; } mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule(stemPrimaryKeyGestures)); mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule()); } } Loading Loading @@ -2456,19 +2462,26 @@ public class PhoneWindowManager implements WindowManagerPolicy { updateRotation = true; } mLongPressOnPowerBehavior = Settings.Global.getInt(resolver, final int longPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerBehavior)); final int veryLongPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_veryLongPressOnPowerBehavior)); if (mLongPressOnPowerBehavior != longPressOnPowerBehavior || mVeryLongPressOnPowerBehavior != veryLongPressOnPowerBehavior) { mLongPressOnPowerBehavior = longPressOnPowerBehavior; mVeryLongPressOnPowerBehavior = veryLongPressOnPowerBehavior; } mLongPressOnPowerAssistantTimeoutMs = Settings.Global.getLong( mContext.getContentResolver(), Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerDurationMs)); mVeryLongPressOnPowerBehavior = Settings.Global.getInt(resolver, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, mContext.getResources().getInteger( com.android.internal.R.integer.config_veryLongPressOnPowerBehavior)); mPowerVolUpBehavior = Settings.Global.getInt(resolver, Settings.Global.KEY_CHORD_POWER_VOLUME_UP, mContext.getResources().getInteger( Loading
services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +5 −22 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.server.policy; import android.annotation.IntDef; import android.content.Context; import android.os.Handler; import android.os.Looper; Loading @@ -26,8 +25,6 @@ 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 Loading @@ -56,22 +53,10 @@ public final class SingleKeyGestureDetector { private final Handler mHandler; private long mLastDownTime = 0; /** Supported gesture flags */ public static final int KEY_LONGPRESS = 1 << 1; public static final int KEY_VERYLONGPRESS = 1 << 2; static final long MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); static long sDefaultLongPressTimeout; static long sDefaultVeryLongPressTimeout; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "KEY_" }, value = { KEY_LONGPRESS, KEY_VERYLONGPRESS, }) public @interface KeyGestureFlag {} /** * Rule definition for single keys gesture. * E.g : define power key. Loading @@ -88,11 +73,9 @@ public final class SingleKeyGestureDetector { */ abstract static class SingleKeyRule { private final int mKeyCode; private final int mSupportedGestures; SingleKeyRule(int keyCode, @KeyGestureFlag int supportedGestures) { SingleKeyRule(int keyCode) { mKeyCode = keyCode; mSupportedGestures = supportedGestures; } /** Loading @@ -105,15 +88,15 @@ public final class SingleKeyGestureDetector { /** * True if the rule support long press. */ private boolean supportLongPress() { return (mSupportedGestures & KEY_LONGPRESS) != 0; boolean supportLongPress() { return false; } /** * True if the rule support very long press. */ private boolean supportVeryLongPress() { return (mSupportedGestures & KEY_VERYLONGPRESS) != 0; boolean supportVeryLongPress() { return false; } /** Loading
services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +36 −6 Original line number Diff line number Diff line Loading @@ -23,9 +23,6 @@ import static android.view.KeyEvent.KEYCODE_POWER; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; 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; Loading Loading @@ -71,6 +68,10 @@ public class SingleKeyGestureTests { private boolean mAllowNonInteractiveForPress = true; private boolean mAllowNonInteractiveForLongPress = true; private boolean mLongPressOnPowerBehavior = true; private boolean mVeryLongPressOnPowerBehavior = true; private boolean mLongPressOnBackBehavior = false; @Before public void setUp() { mInstrumentation.runOnMainSync(() -> { Loading @@ -84,8 +85,15 @@ public class SingleKeyGestureTests { } private void initSingleKeyGestureRules() { mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER, KEY_LONGPRESS | KEY_VERYLONGPRESS) { mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER) { @Override boolean supportLongPress() { return mLongPressOnPowerBehavior; } @Override boolean supportVeryLongPress() { return mVeryLongPressOnPowerBehavior; } @Override int getMaxMultiPressCount() { return mMaxMultiPressCount; Loading Loading @@ -122,7 +130,11 @@ public class SingleKeyGestureTests { } }); mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_BACK, 0) { mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_BACK) { @Override boolean supportLongPress() { return mLongPressOnBackBehavior; } @Override int getMaxMultiPressCount() { return mMaxMultiPressCount; Loading @@ -144,6 +156,11 @@ public class SingleKeyGestureTests { assertTrue(mMaxMultiPressCount >= count); assertEquals(mExpectedMultiPressCount, count); } @Override void onLongPress(long downTime) { mLongPressed.countDown(); } }); } Loading Loading @@ -267,4 +284,17 @@ public class SingleKeyGestureTests { handlerThread.quitSafely(); } } @Test public void testUpdateRule() throws InterruptedException { // Power key rule doesn't allow the long press gesture. mLongPressOnPowerBehavior = false; pressKey(KEYCODE_POWER, mLongPressTime); assertFalse(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); // Back key rule allows the long press gesture. mLongPressOnBackBehavior = true; pressKey(KEYCODE_BACK, mLongPressTime); assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS)); } }