From 8931470a790ebd6dc7386356a6368d792f3362ef Mon Sep 17 00:00:00 2001 From: Arthur Hung Date: Wed, 2 Jun 2021 18:22:57 +0800 Subject: [PATCH] Fix double tap power key to launch camera locks phone If user enabled double tap power to launch camera, we should return the correct value of 'MaxMultiPressPowerCount' so single tap power detector could wait for multi press timeout instead triggering 'powerPress' immediately. Test: double tap power to launch camera Bug: 188247996 Change-Id: I4ca28c42c4affd9c48219e3c68630ea0ce1d5409 --- .../server/GestureLauncherService.java | 8 +++++++ .../server/policy/PhoneWindowManager.java | 23 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java index af791cb2cfcbd..50b27a0f3b3d5 100644 --- a/services/core/java/com/android/server/GestureLauncherService.java +++ b/services/core/java/com/android/server/GestureLauncherService.java @@ -520,6 +520,14 @@ public class GestureLauncherService extends SystemService { return intercept && isUserSetupComplete(); } + public boolean isCameraDoubleTapPowerEnabled() { + return mCameraDoubleTapPowerEnabled; + } + + public boolean isEmergencyGestureEnabled() { + return mEmergencyGestureEnabled; + } + /** * @return true if camera was launched, false otherwise. */ diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index ae8f967ade64c..f3b8c7e3e209f 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -596,6 +596,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private KeyCombinationManager mKeyCombinationManager; private SingleKeyGestureDetector mSingleKeyGestureDetector; + private GestureLauncherService mGestureLauncherService; private boolean mLockNowPending = false; @@ -917,6 +918,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { + mCameraGestureTriggered = false; if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) { Slog.i(TAG, "Suppressed redundant power key press while " + "already in the process of turning the screen on."); @@ -1066,12 +1068,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private int getMaxMultiPressPowerCount() { + // GestureLauncherService could handle power multi tap gesture. + if (mGestureLauncherService != null + && mGestureLauncherService.isEmergencyGestureEnabled()) { + return 5; // EMERGENCY_GESTURE_POWER_TAP_COUNT_THRESHOLD + } + if (mTriplePressOnPowerBehavior != MULTI_PRESS_POWER_NOTHING) { return 3; } if (mDoublePressOnPowerBehavior != MULTI_PRESS_POWER_NOTHING) { return 2; } + + if (mGestureLauncherService != null + && mGestureLauncherService.isCameraDoubleTapPowerEnabled()) { + return 2; // CAMERA_POWER_TAP_COUNT_THRESHOLD + } + return 1; } @@ -3825,15 +3839,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { // The camera gesture will be detected by GestureLauncherService. private boolean handleCameraGesture(KeyEvent event, boolean interactive) { // camera gesture. - GestureLauncherService gestureService = LocalServices.getService( - GestureLauncherService.class); - if (gestureService == null) { + if (mGestureLauncherService == null) { return false; } final MutableBoolean outLaunched = new MutableBoolean(false); - final boolean gesturedServiceIntercepted = gestureService.interceptPowerKeyDown(event, - interactive, outLaunched); + final boolean gesturedServiceIntercepted = mGestureLauncherService.interceptPowerKeyDown( + event, interactive, outLaunched); if (outLaunched.value) { mCameraGestureTriggered = true; } @@ -4689,6 +4701,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } mAutofillManagerInternal = LocalServices.getService(AutofillManagerInternal.class); + mGestureLauncherService = LocalServices.getService(GestureLauncherService.class); } /** {@inheritDoc} */