diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 3d28b156cdc63..d7abfbb110dda 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -4948,12 +4948,6 @@
button. -->
0
-
- 0
-
false
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 63c1a1fbe20e1..0495122eaee79 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -4617,4 +4617,6 @@
+
+
diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java
index b0c80ae955dde..25b36e847ea66 100644
--- a/services/core/java/com/android/server/GestureLauncherService.java
+++ b/services/core/java/com/android/server/GestureLauncherService.java
@@ -19,10 +19,12 @@ package com.android.server;
import android.app.ActivityManager;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.hardware.Sensor;
@@ -38,6 +40,8 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.provider.Settings;
import android.util.MutableBoolean;
import android.util.Slog;
@@ -88,6 +92,19 @@ public class GestureLauncherService extends SystemService {
*/
private static final int CAMERA_POWER_TAP_COUNT_THRESHOLD = 2;
+ /** Action for starting emergency alerts on Wear OS. */
+ private static final String WEAR_LAUNCH_EMERGENCY_ACTION =
+ "com.android.systemui.action.LAUNCH_EMERGENCY";
+
+ /** Action for starting emergency alerts in retail mode on Wear OS. */
+ private static final String WEAR_LAUNCH_EMERGENCY_RETAIL_ACTION =
+ "com.android.systemui.action.LAUNCH_EMERGENCY_RETAIL";
+
+ /**
+ * Boolean extra for distinguishing intents coming from power button gesture.
+ */
+ private static final String EXTRA_LAUNCH_EMERGENCY_VIA_GESTURE = "launch_emergency_via_gesture";
+
/** The listener that receives the gesture event. */
private final GestureEventListener mGestureListener = new GestureEventListener();
private final CameraLiftTriggerEventListener mCameraLiftTriggerListener =
@@ -152,6 +169,7 @@ public class GestureLauncherService extends SystemService {
private final UiEventLogger mUiEventLogger;
private boolean mHasFeatureWatch;
+ private long mVibrateMilliSecondsForPanicGesture;
@VisibleForTesting
public enum GestureLauncherEvent implements UiEventLogger.UiEventEnum {
@@ -220,6 +238,13 @@ public class GestureLauncherService extends SystemService {
mHasFeatureWatch =
mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
+ mVibrateMilliSecondsForPanicGesture =
+ resources.getInteger(
+ com.android
+ .internal
+ .R
+ .integer
+ .config_mashPressVibrateTimeOnPowerButton);
}
}
@@ -584,6 +609,12 @@ public class GestureLauncherService extends SystemService {
"userSetupComplete = %s, performing emergency gesture.",
userSetupComplete));
}
+
+ if (mHasFeatureWatch) {
+ onEmergencyGestureDetectedOnWatch();
+ return true;
+ }
+
StatusBarManagerInternal service = LocalServices.getService(
StatusBarManagerInternal.class);
service.onEmergencyActionLaunchGestureDetected();
@@ -593,6 +624,37 @@ public class GestureLauncherService extends SystemService {
}
}
+ private void onEmergencyGestureDetectedOnWatch() {
+ Intent emergencyIntent =
+ new Intent(
+ isInRetailMode()
+ ? WEAR_LAUNCH_EMERGENCY_RETAIL_ACTION
+ : WEAR_LAUNCH_EMERGENCY_ACTION);
+ PackageManager pm = mContext.getPackageManager();
+ ResolveInfo resolveInfo = pm.resolveActivity(emergencyIntent, /*flags=*/0);
+ if (resolveInfo == null) {
+ Slog.w(TAG, "Couldn't find an app to process the emergency intent "
+ + emergencyIntent.getAction());
+ return;
+ }
+
+ Vibrator vibrator = mContext.getSystemService(Vibrator.class);
+ vibrator.vibrate(VibrationEffect.createOneShot(mVibrateMilliSecondsForPanicGesture,
+ VibrationEffect.DEFAULT_AMPLITUDE));
+
+ emergencyIntent.setComponent(
+ new ComponentName(
+ resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name));
+ emergencyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ emergencyIntent.putExtra(EXTRA_LAUNCH_EMERGENCY_VIA_GESTURE, true);
+ mContext.startActivityAsUser(emergencyIntent, new UserHandle(mUserId));
+ }
+
+ private boolean isInRetailMode() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_DEMO_MODE, 0) == 1;
+ }
+
private boolean isUserSetupComplete() {
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;