Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d773922d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Import wear emergency gesture handling logic into master."

parents 83608e05 b91c7255
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -4948,12 +4948,6 @@
         button. -->
    <integer name="config_mashPressVibrateTimeOnPowerButton">0</integer>

    <!-- Control the behavior when the user presses the power button 5 times.
           0 - Nothing
           1 - Launch panic button gesture
    -->
    <integer name="config_mashPressOnPowerBehavior">0</integer>

    <!-- Whether or not to enable the binder heavy hitter watcher by default -->
    <bool name="config_defaultBinderHeavyHitterWatcherEnabled">false</bool>

+2 −0
Original line number Diff line number Diff line
@@ -4617,4 +4617,6 @@
  <java-symbol type="array" name="config_roundedCornerBottomRadiusAdjustmentArray" />
  <java-symbol type="bool" name="config_secondaryBuiltInDisplayIsRound" />
  <java-symbol type="array" name="config_builtInDisplayIsRoundArray" />

  <java-symbol type="integer" name="config_mashPressVibrateTimeOnPowerButton" />
</resources>
+62 −0
Original line number Diff line number Diff line
@@ -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;