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

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

Merge "Fix screen can not turn on with power key sometimes" into sc-dev

parents 04e05de6 2cd8502f
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -18,11 +18,13 @@ package com.android.server.policy;
import static android.view.KeyEvent.KEYCODE_POWER;

import android.os.SystemClock;
import android.util.Log;
import android.util.SparseLongArray;
import android.view.KeyEvent;

import com.android.internal.util.ToBooleanFunction;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.function.Consumer;

@@ -89,8 +91,8 @@ public class KeyCombinationManager {

        @Override
        public String toString() {
            return "KeyCode1 = " + KeyEvent.keyCodeToString(mKeyCode1)
                    + ", KeyCode2 = " +  KeyEvent.keyCodeToString(mKeyCode2);
            return KeyEvent.keyCodeToString(mKeyCode1) + " + "
                    + KeyEvent.keyCodeToString(mKeyCode2);
        }
    }

@@ -151,6 +153,7 @@ public class KeyCombinationManager {
                    if (!rule.shouldInterceptKeys(mDownTimes)) {
                        return false;
                    }
                    Log.v(TAG, "Performing combination rule : " + rule);
                    rule.execute();
                    mTriggeredRule = rule;
                    return true;
@@ -230,4 +233,11 @@ public class KeyCombinationManager {
        }
        return false;
    }

    void dump(String prefix, PrintWriter pw) {
        pw.println(prefix + "KeyCombination rules:");
        forAllRules(mRules, (rule)-> {
            pw.println(prefix + "  " + rule);
        });
    }
}
+23 −22
Original line number Diff line number Diff line
@@ -434,7 +434,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    // to hold wakelocks during dispatch and eliminating the critical path.
    volatile boolean mPowerKeyHandled;
    volatile boolean mBackKeyHandled;
    volatile boolean mBeganFromNonInteractive;
    volatile boolean mEndCallKeyHandled;
    volatile boolean mCameraGestureTriggeredDuringGoingToSleep;

@@ -876,16 +875,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        if (!mPowerKeyHandled) {
            if (!interactive) {
                wakeUpFromPowerKey(event.getDownTime());
                if (mSupportLongPressPowerWhenNonInteractive && hasLongPressOnPowerBehavior()) {
                    mBeganFromNonInteractive = true;
                } else {
                    final int maxCount = getMaxMultiPressPowerCount();
                    if (maxCount <= 1) {
                        mPowerKeyHandled = true;
                    } else {
                        mBeganFromNonInteractive = true;
                    }
                }
            }
        } else {
            // handled by another power key policy.
@@ -895,7 +884,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) {
    private void interceptPowerKeyUp(KeyEvent event, boolean canceled) {
        final boolean handled = canceled || mPowerKeyHandled;

        if (!handled) {
@@ -906,33 +895,36 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        } else {
            // handled by single key or another power key policy.
            mSingleKeyGestureDetector.reset();
            finishPowerKeyPress();
        }

        finishPowerKeyPress();
    }

    private void finishPowerKeyPress() {
        mBeganFromNonInteractive = false;
        mPowerKeyHandled = false;
        if (mPowerKeyWakeLock.isHeld()) {
            mPowerKeyWakeLock.release();
        }
    }

    private void powerPress(long eventTime, boolean interactive, int count) {
    private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) {
        if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) {
            Slog.i(TAG, "Suppressed redundant power key press while "
                    + "already in the process of turning the screen on.");
            return;
        }

        final boolean interactive = Display.isOnState(mDefaultDisplay.getState());

        Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive
                + " count=" + count + " beganFromNonInteractive=" + mBeganFromNonInteractive +
                " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);
                + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive
                + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);

        if (count == 2) {
            powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);
        } else if (count == 3) {
            powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);
        } else if (interactive && !mBeganFromNonInteractive) {
        } else if (interactive && !beganFromNonInteractive) {
            switch (mShortPressOnPowerBehavior) {
                case SHORT_PRESS_POWER_NOTHING:
                    break;
@@ -1906,12 +1898,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {

        @Override
        void onPress(long downTime) {
            powerPress(downTime, true, 1 /*count*/);
            powerPress(downTime, 1 /*count*/,
                    mSingleKeyGestureDetector.beganFromNonInteractive());
            finishPowerKeyPress();
        }

        @Override
        void onLongPress(long eventTime) {
            if (mSingleKeyGestureDetector.beganFromNonInteractive()
                    && !mSupportLongPressPowerWhenNonInteractive) {
                Slog.v(TAG, "Not support long press power when device is not interactive.");
                return;
            }

            powerLongPress(eventTime);
        }

@@ -1923,7 +1922,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {

        @Override
        void onMultiPress(long downTime, int count) {
            powerPress(downTime, true, count);
            powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive());
            finishPowerKeyPress();
        }
    }
@@ -3562,7 +3561,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                if (down) {
                    interceptPowerKeyDown(event, interactiveAndOn);
                } else {
                    interceptPowerKeyUp(event, interactiveAndOn, canceled);
                    interceptPowerKeyUp(event, canceled);
                }
                break;
            }
@@ -3752,7 +3751,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
        }

        mSingleKeyGestureDetector.interceptKey(event);
        mSingleKeyGestureDetector.interceptKey(event, interactive);
    }

    // The camera gesture will be detected by GestureLauncherService.
@@ -5230,6 +5229,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive);

        mGlobalKeyManager.dump(prefix, pw);
        mKeyCombinationManager.dump(prefix, pw);
        mSingleKeyGestureDetector.dump(prefix, pw);

        if (mWakeGestureListener != null) {
            mWakeGestureListener.dump(pw, prefix);
+25 −8
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.util.Log;
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;
@@ -37,7 +38,7 @@ import java.util.ArrayList;

public final class SingleKeyGestureDetector {
    private static final String TAG = "SingleKeyGesture";
    private static final boolean DEBUG = false;
    private static final boolean DEBUG = PhoneWindowManager.DEBUG_INPUT;

    private static final int MSG_KEY_LONG_PRESS = 0;
    private static final int MSG_KEY_VERY_LONG_PRESS = 1;
@@ -47,6 +48,7 @@ public final class SingleKeyGestureDetector {
    private final long mVeryLongPressTimeout;

    private volatile int mKeyPressCounter;
    private boolean mBeganFromNonInteractive = false;

    private final ArrayList<SingleKeyRule> mRules = new ArrayList();
    private SingleKeyRule mActiveRule = null;
@@ -57,7 +59,6 @@ public final class SingleKeyGestureDetector {
    private final Handler mHandler;
    private static final long MULTI_PRESS_TIMEOUT = ViewConfiguration.getMultiPressTimeout();


    /** Supported gesture flags */
    public static final int KEY_LONGPRESS = 1 << 1;
    public static final int KEY_VERYLONGPRESS = 1 << 2;
@@ -144,9 +145,9 @@ public final class SingleKeyGestureDetector {
        @Override
        public String toString() {
            return "KeyCode=" + KeyEvent.keyCodeToString(mKeyCode)
                    + ", long press : " + supportLongPress()
                    + ", very Long press : " + supportVeryLongPress()
                    + ", max multi press count : " + getMaxMultiPressCount();
                    + ", LongPress=" + supportLongPress()
                    + ", VeryLongPress=" + supportVeryLongPress()
                    + ", MaxMultiPressCount=" + getMaxMultiPressCount();
        }
    }

@@ -161,8 +162,12 @@ public final class SingleKeyGestureDetector {
        mRules.add(rule);
    }

    void interceptKey(KeyEvent event) {
    void interceptKey(KeyEvent event, boolean interactive) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            // Store the non interactive state when first down.
            if (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) {
                mBeganFromNonInteractive = !interactive;
            }
            interceptKeyDown(event);
        } else {
            interceptKeyUp(event);
@@ -268,6 +273,7 @@ public final class SingleKeyGestureDetector {
                    Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode()));
                }
                mActiveRule.onPress(downTime);
                reset();
                return true;
            }

@@ -316,6 +322,17 @@ public final class SingleKeyGestureDetector {
        return false;
    }

    boolean beganFromNonInteractive() {
        return mBeganFromNonInteractive;
    }

    void dump(String prefix, PrintWriter pw) {
        pw.println(prefix + "SingleKey rules:");
        for (SingleKeyRule rule : mRules) {
            pw.println(prefix + "  " + rule);
        }
    }

    private class KeyHandler extends Handler {
        KeyHandler() {
            super(Looper.getMainLooper());
@@ -354,7 +371,7 @@ public final class SingleKeyGestureDetector {
                    } else {
                        mActiveRule.onMultiPress(eventTime, mKeyPressCounter);
                    }
                    mKeyPressCounter = 0;
                    reset();
                    break;
            }
        }
+34 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ 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;

import android.app.Instrumentation;
@@ -62,6 +63,10 @@ public class SingleKeyGestureTests {
    private long mLongPressTime;
    private long mVeryLongPressTime;

    // Allow press from non interactive mode.
    private boolean mAllowNonInteractiveForPress = true;
    private boolean mAllowNonInteractiveForLongPress = true;

    @Before
    public void setUp() {
        mDetector = new SingleKeyGestureDetector(mContext);
@@ -81,11 +86,17 @@ public class SingleKeyGestureTests {
            }
            @Override
            public void onPress(long downTime) {
                if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForPress) {
                    return;
                }
                mShortPressed.countDown();
            }

            @Override
            void onLongPress(long downTime) {
                if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForLongPress) {
                    return;
                }
                mLongPressed.countDown();
            }

@@ -96,6 +107,9 @@ public class SingleKeyGestureTests {

            @Override
            void onMultiPress(long downTime, int count) {
                if (mDetector.beganFromNonInteractive() && !mAllowNonInteractiveForPress) {
                    return;
                }
                mMultiPressed.countDown();
                assertEquals(mMaxMultiPressPowerCount, count);
            }
@@ -103,9 +117,13 @@ public class SingleKeyGestureTests {
    }

    private void pressKey(long eventTime, int keyCode, long pressTime) {
        pressKey(eventTime, keyCode, pressTime, true /* interactive */);
    }

    private void pressKey(long eventTime, int keyCode, long pressTime, boolean interactive) {
        final KeyEvent keyDown = new KeyEvent(eventTime, eventTime, ACTION_DOWN,
                keyCode, 0 /* repeat */, 0 /* metaState */);
        mDetector.interceptKey(keyDown);
        mDetector.interceptKey(keyDown, interactive);

        // keep press down.
        try {
@@ -118,7 +136,7 @@ public class SingleKeyGestureTests {
        final KeyEvent keyUp = new KeyEvent(eventTime, eventTime, ACTION_UP,
                keyCode, 0 /* repeat */, 0 /* metaState */);

        mDetector.interceptKey(keyUp);
        mDetector.interceptKey(keyUp, interactive);
    }

    @Test
@@ -149,4 +167,18 @@ public class SingleKeyGestureTests {
        pressKey(eventTime, KEYCODE_POWER, 0 /* pressTime */);
        assertTrue(mMultiPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS));
    }

    @Test
    public void testNonInteractive() throws InterruptedException {
        long eventTime = SystemClock.uptimeMillis();
        // Disallow short press behavior from non interactive.
        mAllowNonInteractiveForPress = false;
        pressKey(eventTime, KEYCODE_POWER, 0 /* pressTime */, false /* interactive */);
        assertFalse(mShortPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS));

        // Allow long press behavior from non interactive.
        eventTime = SystemClock.uptimeMillis();
        pressKey(eventTime, KEYCODE_POWER, mLongPressTime, false /* interactive */);
        assertTrue(mLongPressed.await(mWaitTimeout, TimeUnit.MILLISECONDS));
    }
}