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

Commit ed271ebb authored by Himanshi's avatar Himanshi Committed by Josh Yang
Browse files

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
parent 278a2aac
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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" />
+11 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.BroadcastReceiver;
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 @@ public class GestureLauncherService extends SystemService {
    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 @@ public class GestureLauncherService extends SystemService {
            mUserId = ActivityManager.getCurrentUser();
            mContext.registerReceiver(mUserReceiver, new IntentFilter(Intent.ACTION_USER_SWITCHED));
            registerContentObservers();

            mHasFeatureWatch =
                    mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
        }
    }

@@ -390,8 +396,7 @@ public class GestureLauncherService extends SystemService {
    /**
     * 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 @@ public class GestureLauncherService extends SystemService {
            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) {
+40 −1
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    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 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    long mLongPressOnPowerAssistantTimeoutMs;
    int mVeryLongPressOnPowerBehavior;
    int mDoublePressOnPowerBehavior;
    ComponentName mPowerDoublePressTargetActivity;
    int mTriplePressOnPowerBehavior;
    int mLongPressOnBackBehavior;
    int mShortPressOnSleepBehavior;
@@ -952,6 +954,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            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 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                }
                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 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        // 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 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                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 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                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);
        }