Import wear power button gestures to master.
Features imported in this change:
1. Double press on power button to launch target activity.
2. De-dup the power button gestures handled by PhoneWindowManager
from GestureLauncherService.
Bug: 200218055
Test: manual test
Change-Id: I573a2910f0a564a5990de9c6b9d75360c6211fd5
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 2b830b4..3d28b15 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1048,9 +1048,16 @@
0 - Nothing
1 - Toggle theater mode setting
2 - Brightness boost
+ 3 - Launch target activity defined by config_doublePressOnPowerTargetActivity
+ if available
-->
<integer name="config_doublePressOnPowerBehavior">0</integer>
+ <!-- Activity name for the default target activity to be launched. Note that
+ config_doublePressOnPowerBehavior must be set to 3 for this to work. [DO NOT TRANSLATE]
+ -->
+ <string name="config_doublePressOnPowerTargetActivity" translatable="false"></string>
+
<!-- Control the behavior when the user triple presses the power button.
0 - Nothing
1 - Toggle theater mode setting
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 45d9a36..63c1a1f 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -463,6 +463,7 @@
<java-symbol type="integer" name="config_shortPressOnStemPrimaryBehavior" />
<java-symbol type="integer" name="config_doublePressOnStemPrimaryBehavior" />
<java-symbol type="integer" name="config_triplePressOnStemPrimaryBehavior" />
+ <java-symbol type="string" name="config_doublePressOnPowerTargetActivity" />
<java-symbol type="integer" name="config_windowOutsetBottom" />
<java-symbol type="integer" name="db_connection_pool_size" />
<java-symbol type="integer" name="db_journal_size_limit" />
diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java
index d04698c..b0c80ae 100644
--- a/services/core/java/com/android/server/GestureLauncherService.java
+++ b/services/core/java/com/android/server/GestureLauncherService.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.hardware.Sensor;
@@ -150,6 +151,8 @@
private int mPowerButtonSlowConsecutiveTaps;
private final UiEventLogger mUiEventLogger;
+ private boolean mHasFeatureWatch;
+
@VisibleForTesting
public enum GestureLauncherEvent implements UiEventLogger.UiEventEnum {
@UiEvent(doc = "The user lifted the device just the right way to launch the camera.")
@@ -214,6 +217,9 @@
mUserId = ActivityManager.getCurrentUser();
mContext.registerReceiver(mUserReceiver, new IntentFilter(Intent.ACTION_USER_SWITCHED));
registerContentObservers();
+
+ mHasFeatureWatch =
+ mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
}
}
@@ -390,8 +396,7 @@
/**
* Whether to enable emergency gesture.
*/
- @VisibleForTesting
- static boolean isEmergencyGestureSettingEnabled(Context context, int userId) {
+ public static boolean isEmergencyGestureSettingEnabled(Context context, int userId) {
return isEmergencyGestureEnabled(context.getResources())
&& Settings.Secure.getIntForUser(context.getContentResolver(),
Settings.Secure.EMERGENCY_GESTURE_ENABLED, 1, userId) != 0;
@@ -475,7 +480,10 @@
if (mEmergencyGestureEnabled) {
// Commit to intercepting the powerkey event after the second "quick" tap to avoid
// lockscreen changes between launching camera and the emergency gesture flow.
- if (mPowerButtonConsecutiveTaps > 1) {
+ // Since watch doesn't have camera gesture, only intercept power key event after
+ // emergency gesture tap count.
+ if (mPowerButtonConsecutiveTaps
+ > (mHasFeatureWatch ? EMERGENCY_GESTURE_POWER_TAP_COUNT_THRESHOLD : 1)) {
intercept = interactive;
}
if (mPowerButtonConsecutiveTaps == EMERGENCY_GESTURE_POWER_TAP_COUNT_THRESHOLD) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index f61b562..5c15a84 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -280,6 +280,7 @@
static final int MULTI_PRESS_POWER_NOTHING = 0;
static final int MULTI_PRESS_POWER_THEATER_MODE = 1;
static final int MULTI_PRESS_POWER_BRIGHTNESS_BOOST = 2;
+ static final int MULTI_PRESS_POWER_LAUNCH_TARGET_ACTIVITY = 3;
// must match: config_longPressOnBackBehavior in config.xml
static final int LONG_PRESS_BACK_NOTHING = 0;
@@ -497,6 +498,7 @@
long mLongPressOnPowerAssistantTimeoutMs;
int mVeryLongPressOnPowerBehavior;
int mDoublePressOnPowerBehavior;
+ ComponentName mPowerDoublePressTargetActivity;
int mTriplePressOnPowerBehavior;
int mLongPressOnBackBehavior;
int mShortPressOnSleepBehavior;
@@ -952,6 +954,8 @@
powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);
} else if (count == 3) {
powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);
+ } else if (count > 3 && count <= getMaxMultiPressPowerCount()) {
+ Slog.d(TAG, "No behavior defined for power press count " + count);
} else if (count == 1 && interactive && !beganFromNonInteractive) {
if (mSideFpsEventHandler.onSinglePressDetected(eventTime)) {
Slog.i(TAG, "Suppressing power key because the user is interacting with the "
@@ -1084,6 +1088,30 @@
}
mPowerManager.boostScreenBrightness(eventTime);
break;
+ case MULTI_PRESS_POWER_LAUNCH_TARGET_ACTIVITY:
+ if (DEBUG_INPUT) {
+ Slog.d(TAG, "Executing the double press power action.");
+ }
+ final boolean keyguardActive =
+ mKeyguardDelegate != null && mKeyguardDelegate.isShowing();
+ if (!keyguardActive) {
+ Intent intent = new Intent();
+ if (mPowerDoublePressTargetActivity != null) {
+ intent.setComponent(mPowerDoublePressTargetActivity);
+ ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
+ intent, /* flags= */0);
+ if (resolveInfo != null) {
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+ } else {
+ Slog.e(TAG, "Could not resolve activity with : "
+ + mPowerDoublePressTargetActivity.flattenToString()
+ + " name.");
+ }
+ }
+ }
+ break;
}
}
@@ -1098,7 +1126,13 @@
// GestureLauncherService.
// To speed up the handling of single-press of power button inside SingleKeyGestureDetector,
// however, we limit the max count to the number of button presses actually handled by the
- // SingleKeyGestureDetector.
+ // SingleKeyGestureDetector except for wearable devices, where we want to de-dup the double
+ // press gesture with the emergency gesture.
+ if (mHasFeatureWatch
+ && GestureLauncherService.isEmergencyGestureSettingEnabled(
+ mContext, ActivityManager.getCurrentUser())) {
+ return 5;
+ }
if (mTriplePressOnPowerBehavior != MULTI_PRESS_POWER_NOTHING) {
return 3;
}
@@ -1933,6 +1967,9 @@
com.android.internal.R.integer.config_veryLongPressOnPowerBehavior);
mDoublePressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_doublePressOnPowerBehavior);
+ mPowerDoublePressTargetActivity = ComponentName.unflattenFromString(
+ mContext.getResources().getString(
+ com.android.internal.R.string.config_doublePressOnPowerTargetActivity));
mTriplePressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_triplePressOnPowerBehavior);
mShortPressOnSleepBehavior = mContext.getResources().getInteger(
@@ -5686,6 +5723,8 @@
return "MULTI_PRESS_POWER_THEATER_MODE";
case MULTI_PRESS_POWER_BRIGHTNESS_BOOST:
return "MULTI_PRESS_POWER_BRIGHTNESS_BOOST";
+ case MULTI_PRESS_POWER_LAUNCH_TARGET_ACTIVITY:
+ return "MULTI_PRESS_POWER_LAUNCH_TARGET_ACTIVITY";
default:
return Integer.toString(behavior);
}