From b91c7255906d1bcff060dacefcd548f17cb01418 Mon Sep 17 00:00:00 2001 From: yzj Date: Fri, 24 Sep 2021 22:37:36 +0000 Subject: [PATCH] Import wear emergency gesture handling logic into master. Wear OS doesn't have StatusBarManager. So we have to add a special handling logic for emergency gesture. Bug: 200218055 Test: manually tested Change-Id: If6bf76b02706a2c3d2c165044f30b76ea1db6214 --- core/res/res/values/config.xml | 6 -- core/res/res/values/symbols.xml | 2 + .../server/GestureLauncherService.java | 62 +++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) 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;