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

Commit 2547975f authored by Arthur Hung's avatar Arthur Hung Committed by Android (Google) Code Review
Browse files

Merge "Fix power long press behavior could be changed by setting"

parents 9d102bc5 9803e7a5
Loading
Loading
Loading
Loading
+42 −29
Original line number Diff line number Diff line
@@ -68,8 +68,6 @@ import static android.view.WindowManagerGlobal.ADD_OKAY;
import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;

import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY;
import static com.android.server.policy.SingleKeyGestureDetector.KEY_LONGPRESS;
import static com.android.server.policy.SingleKeyGestureDetector.KEY_VERYLONGPRESS;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
@@ -2246,10 +2244,21 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     * Rule for single power key gesture.
     */
    private final class PowerKeyRule extends SingleKeyGestureDetector.SingleKeyRule {
        PowerKeyRule(int gestures) {
            super(KEYCODE_POWER, gestures);
        PowerKeyRule() {
            super(KEYCODE_POWER);
        }

        @Override
        boolean supportLongPress() {
            return hasLongPressOnPowerBehavior();
        }

        @Override
        boolean supportVeryLongPress() {
            return hasVeryLongPressOnPowerBehavior();
        }


        @Override
        int getMaxMultiPressCount() {
            return getMaxMultiPressPowerCount();
@@ -2297,8 +2306,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     * Rule for single back key gesture.
     */
    private final class BackKeyRule extends SingleKeyGestureDetector.SingleKeyRule {
        BackKeyRule(int gestures) {
            super(KEYCODE_BACK, gestures);
        BackKeyRule() {
            super(KEYCODE_BACK);
        }

        @Override
        boolean supportLongPress() {
            return hasLongPressOnBackBehavior();
        }

        @Override
@@ -2321,8 +2335,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     * Rule for single stem primary key gesture.
     */
    private final class StemPrimaryKeyRule extends SingleKeyGestureDetector.SingleKeyRule {
        StemPrimaryKeyRule(int gestures) {
            super(KeyEvent.KEYCODE_STEM_PRIMARY, gestures);
        StemPrimaryKeyRule() {
            super(KeyEvent.KEYCODE_STEM_PRIMARY);
        }

        @Override
        boolean supportLongPress() {
            return hasLongPressOnStemPrimaryBehavior();
        }

        @Override
@@ -2348,25 +2367,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    private void initSingleKeyGestureRules() {
        mSingleKeyGestureDetector = SingleKeyGestureDetector.get(mContext);

        int powerKeyGestures = 0;
        if (hasVeryLongPressOnPowerBehavior()) {
            powerKeyGestures |= KEY_VERYLONGPRESS;
        }
        if (hasLongPressOnPowerBehavior()) {
            powerKeyGestures |= KEY_LONGPRESS;
        }
        mSingleKeyGestureDetector.addRule(new PowerKeyRule(powerKeyGestures));

        mSingleKeyGestureDetector.addRule(new PowerKeyRule());
        if (hasLongPressOnBackBehavior()) {
            mSingleKeyGestureDetector.addRule(new BackKeyRule(KEY_LONGPRESS));
            mSingleKeyGestureDetector.addRule(new BackKeyRule());
        }
        if (hasStemPrimaryBehavior()) {
            int stemPrimaryKeyGestures = 0;
            if (hasLongPressOnStemPrimaryBehavior()) {
                stemPrimaryKeyGestures |= KEY_LONGPRESS;
            }
            mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule(stemPrimaryKeyGestures));
            mSingleKeyGestureDetector.addRule(new StemPrimaryKeyRule());
        }
    }

@@ -2456,19 +2462,26 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                updateRotation = true;
            }

            mLongPressOnPowerBehavior = Settings.Global.getInt(resolver,
            final int longPressOnPowerBehavior = Settings.Global.getInt(resolver,
                    Settings.Global.POWER_BUTTON_LONG_PRESS,
                    mContext.getResources().getInteger(
                            com.android.internal.R.integer.config_longPressOnPowerBehavior));
            final int veryLongPressOnPowerBehavior = Settings.Global.getInt(resolver,
                    Settings.Global.POWER_BUTTON_VERY_LONG_PRESS,
                    mContext.getResources().getInteger(
                            com.android.internal.R.integer.config_veryLongPressOnPowerBehavior));
            if (mLongPressOnPowerBehavior != longPressOnPowerBehavior
                    || mVeryLongPressOnPowerBehavior != veryLongPressOnPowerBehavior) {
                mLongPressOnPowerBehavior = longPressOnPowerBehavior;
                mVeryLongPressOnPowerBehavior = veryLongPressOnPowerBehavior;
            }

            mLongPressOnPowerAssistantTimeoutMs = Settings.Global.getLong(
                    mContext.getContentResolver(),
                    Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS,
                    mContext.getResources().getInteger(
                            com.android.internal.R.integer.config_longPressOnPowerDurationMs));
            mVeryLongPressOnPowerBehavior = Settings.Global.getInt(resolver,
                    Settings.Global.POWER_BUTTON_VERY_LONG_PRESS,
                    mContext.getResources().getInteger(
                            com.android.internal.R.integer.config_veryLongPressOnPowerBehavior));

            mPowerVolUpBehavior = Settings.Global.getInt(resolver,
                    Settings.Global.KEY_CHORD_POWER_VOLUME_UP,
                    mContext.getResources().getInteger(
+5 −22
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.server.policy;

import android.annotation.IntDef;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
@@ -26,8 +25,6 @@ import android.view.KeyEvent;
import android.view.ViewConfiguration;

import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;

/**
@@ -56,22 +53,10 @@ public final class SingleKeyGestureDetector {
    private final Handler mHandler;
    private long mLastDownTime = 0;

    /** Supported gesture flags */
    public static final int KEY_LONGPRESS = 1 << 1;
    public static final int KEY_VERYLONGPRESS = 1 << 2;

    static final long MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout();
    static long sDefaultLongPressTimeout;
    static long sDefaultVeryLongPressTimeout;

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = { "KEY_" }, value = {
            KEY_LONGPRESS,
            KEY_VERYLONGPRESS,
    })
    public @interface KeyGestureFlag {}

    /**
     *  Rule definition for single keys gesture.
     *  E.g : define power key.
@@ -88,11 +73,9 @@ public final class SingleKeyGestureDetector {
     */
    abstract static class SingleKeyRule {
        private final int mKeyCode;
        private final int mSupportedGestures;

        SingleKeyRule(int keyCode, @KeyGestureFlag int supportedGestures) {
        SingleKeyRule(int keyCode) {
            mKeyCode = keyCode;
            mSupportedGestures = supportedGestures;
        }

        /**
@@ -105,15 +88,15 @@ public final class SingleKeyGestureDetector {
        /**
         *  True if the rule support long press.
         */
        private boolean supportLongPress() {
            return (mSupportedGestures & KEY_LONGPRESS) != 0;
        boolean supportLongPress() {
            return false;
        }

        /**
         *  True if the rule support very long press.
         */
        private boolean supportVeryLongPress() {
            return (mSupportedGestures & KEY_VERYLONGPRESS) != 0;
        boolean supportVeryLongPress() {
            return false;
        }

        /**
+36 −6
Original line number Diff line number Diff line
@@ -23,9 +23,6 @@ import static android.view.KeyEvent.KEYCODE_POWER;

import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;

import static com.android.server.policy.SingleKeyGestureDetector.KEY_LONGPRESS;
import static com.android.server.policy.SingleKeyGestureDetector.KEY_VERYLONGPRESS;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -71,6 +68,10 @@ public class SingleKeyGestureTests {
    private boolean mAllowNonInteractiveForPress = true;
    private boolean mAllowNonInteractiveForLongPress = true;

    private boolean mLongPressOnPowerBehavior = true;
    private boolean mVeryLongPressOnPowerBehavior = true;
    private boolean mLongPressOnBackBehavior = false;

    @Before
    public void setUp() {
        mInstrumentation.runOnMainSync(() -> {
@@ -84,8 +85,15 @@ public class SingleKeyGestureTests {
    }

    private void initSingleKeyGestureRules() {
        mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER,
                KEY_LONGPRESS | KEY_VERYLONGPRESS) {
        mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_POWER) {
            @Override
            boolean supportLongPress() {
                return mLongPressOnPowerBehavior;
            }
            @Override
            boolean supportVeryLongPress() {
                return mVeryLongPressOnPowerBehavior;
            }
            @Override
            int getMaxMultiPressCount() {
                return mMaxMultiPressCount;
@@ -122,7 +130,11 @@ public class SingleKeyGestureTests {
            }
        });

        mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_BACK, 0) {
        mDetector.addRule(new SingleKeyGestureDetector.SingleKeyRule(KEYCODE_BACK) {
            @Override
            boolean supportLongPress() {
                return mLongPressOnBackBehavior;
            }
            @Override
            int getMaxMultiPressCount() {
                return mMaxMultiPressCount;
@@ -144,6 +156,11 @@ public class SingleKeyGestureTests {
                assertTrue(mMaxMultiPressCount >= count);
                assertEquals(mExpectedMultiPressCount, count);
            }

            @Override
            void onLongPress(long downTime) {
                mLongPressed.countDown();
            }
        });

    }
@@ -267,4 +284,17 @@ public class SingleKeyGestureTests {
            handlerThread.quitSafely();
        }
    }

    @Test
    public void testUpdateRule() throws InterruptedException {
        // Power key rule doesn't allow the long press gesture.
        mLongPressOnPowerBehavior = false;
        pressKey(KEYCODE_POWER, mLongPressTime);
        assertFalse(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS));

        // Back key rule allows the long press gesture.
        mLongPressOnBackBehavior = true;
        pressKey(KEYCODE_BACK, mLongPressTime);
        assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS));
    }
}