Loading core/res/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -542,6 +542,9 @@ <bool name="config_goToSleepOnButtonPressTheaterMode">true</bool> <!-- If this is true, long press on power button will be available from the non-interactive state --> <bool name="config_supportLongPressPowerWhenNonInteractive">false</bool> <!-- If this is true, short press on power button will be available whenever the default display is on even if the device is non-interactive (dreaming). --> <bool name="config_supportShortPressPowerWhenDefaultDisplayOn">false</bool> <!-- If this is true, then keep dreaming when unplugging. This config was formerly known as config_keepDreamingWhenUndocking. Loading core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1968,6 +1968,7 @@ <java-symbol type="integer" name="config_keyguardDrawnTimeout" /> <java-symbol type="bool" name="config_goToSleepOnButtonPressTheaterMode" /> <java-symbol type="bool" name="config_supportLongPressPowerWhenNonInteractive" /> <java-symbol type="bool" name="config_supportShortPressPowerWhenDefaultDisplayOn" /> <java-symbol type="bool" name="config_wimaxEnabled" /> <java-symbol type="bool" name="show_ongoing_ime_switcher" /> <java-symbol type="color" name="config_defaultNotificationColor" /> Loading services/core/java/com/android/server/policy/PhoneWindowManager.java +75 −21 Original line number Diff line number Diff line Loading @@ -208,7 +208,6 @@ import com.android.internal.policy.LogDecelerateInterpolator; import com.android.internal.policy.PhoneWindow; import com.android.internal.policy.TransitionAnimation; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.LockPatternUtils; import com.android.server.AccessibilityManagerInternal; import com.android.server.ExtconStateObserver; Loading Loading @@ -622,9 +621,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mAllowTheaterModeWakeFromLidSwitch; private boolean mAllowTheaterModeWakeFromWakeGesture; // Whether to support long press from power button in non-interactive mode // If true, the power button long press behavior will be invoked even if the default display is // non-interactive. If false, the power button long press behavior will be skipped if the // default display is non-interactive. private boolean mSupportLongPressPowerWhenNonInteractive; // If true, the power button short press behavior will be always invoked as long as the default // display is on, even if the display is not interactive. If false, the power button short press // behavior will be skipped if the default display is non-interactive. private boolean mSupportShortPressPowerWhenDefaultDisplayOn; // Whether to go to sleep entering theater mode from power button private boolean mGoToSleepOnButtonPressTheaterMode; Loading Loading @@ -1041,7 +1047,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { private void powerPress(long eventTime, int count) { // SideFPS still needs to know about suppressed power buttons, in case it needs to block // an auth attempt. if (count == 1) { Loading @@ -1055,9 +1061,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean interactive = mDefaultDisplayPolicy.isAwake(); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); Slog.d( TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); if (count == 2) { powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); Loading @@ -1065,12 +1078,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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.shouldConsumeSinglePress(eventTime)) { Slog.i(TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor"); return; } } else if (count == 1 && shouldHandleShortPressPowerAction(interactive, eventTime)) { switch (mShortPressOnPowerBehavior) { case SHORT_PRESS_POWER_NOTHING: break; Loading Loading @@ -1118,6 +1126,44 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private boolean shouldHandleShortPressPowerAction(boolean interactive, long eventTime) { if (mSupportShortPressPowerWhenDefaultDisplayOn) { final boolean defaultDisplayOn = Display.isOnState(mDefaultDisplay.getState()); final boolean beganFromDefaultDisplayOn = mSingleKeyGestureDetector.beganFromDefaultDisplayOn(); if (!defaultDisplayOn || !beganFromDefaultDisplayOn) { Slog.v( TAG, "Ignoring short press of power button because the default display is not" + " on. defaultDisplayOn=" + defaultDisplayOn + ", beganFromDefaultDisplayOn=" + beganFromDefaultDisplayOn); return false; } return true; } final boolean beganFromNonInteractive = mSingleKeyGestureDetector.beganFromNonInteractive(); if (!interactive || beganFromNonInteractive) { Slog.v( TAG, "Ignoring short press of power button because the device is not interactive." + " interactive=" + interactive + ", beganFromNonInteractive=" + beganFromNonInteractive); return false; } if (mSideFpsEventHandler.shouldConsumeSinglePress(eventTime)) { Slog.i( TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor"); return false; } return true; } /** * Attempt to dream from a power button press. * Loading Loading @@ -2231,6 +2277,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSupportLongPressPowerWhenNonInteractive = mContext.getResources().getBoolean( com.android.internal.R.bool.config_supportLongPressPowerWhenNonInteractive); mSupportShortPressPowerWhenDefaultDisplayOn = mContext.getResources() .getBoolean( com.android.internal.R.bool .config_supportShortPressPowerWhenDefaultDisplayOn); mLongPressOnBackBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnBackBehavior); Loading Loading @@ -2518,8 +2569,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onPress(long downTime) { powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); powerPress(downTime, 1 /*count*/); } @Override Loading Loading @@ -2550,7 +2600,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onMultiPress(long downTime, int count) { powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); powerPress(downTime, count); } } Loading Loading @@ -4323,10 +4373,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { // This could prevent some wrong state in multi-displays environment, // the default display may turned off but interactive is true. final boolean isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake(); final boolean interactiveAndOn = interactive && isDefaultDisplayOn; final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState()); final boolean isDefaultDisplayAwake = mDefaultDisplayPolicy.isAwake(); final boolean interactiveAndAwake = interactive && isDefaultDisplayAwake; if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { handleKeyGesture(event, interactiveAndOn); handleKeyGesture(event, interactiveAndAwake, isDefaultDisplayOn); } // Enable haptics if down and virtual key without multiple repetitions. If this is a hard Loading Loading @@ -4479,7 +4530,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { result &= ~ACTION_PASS_TO_USER; isWakeKey = false; // wake-up will be handled separately if (down) { interceptPowerKeyDown(event, interactiveAndOn); interceptPowerKeyDown(event, interactiveAndAwake); } else { interceptPowerKeyUp(event, canceled); } Loading Loading @@ -4695,7 +4746,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return result; } private void handleKeyGesture(KeyEvent event, boolean interactive) { private void handleKeyGesture(KeyEvent event, boolean interactive, boolean defaultDisplayOn) { if (mKeyCombinationManager.interceptKey(event, interactive)) { // handled by combo keys manager. mSingleKeyGestureDetector.reset(); Loading @@ -4711,7 +4762,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mSingleKeyGestureDetector.interceptKey(event, interactive); mSingleKeyGestureDetector.interceptKey(event, interactive, defaultDisplayOn); } // The camera gesture will be detected by GestureLauncherService. Loading Loading @@ -6166,6 +6217,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mTriplePressOnPowerBehavior="); pw.println(multiPressOnPowerBehaviorToString(mTriplePressOnPowerBehavior)); pw.print(prefix); pw.print("mSupportShortPressPowerWhenDefaultDisplayOn="); pw.println(mSupportShortPressPowerWhenDefaultDisplayOn); pw.print(prefix); pw.print("mPowerVolUpBehavior="); pw.println(powerVolumeUpBehaviorToString(mPowerVolUpBehavior)); Loading services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +8 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ public final class SingleKeyGestureDetector { private int mKeyPressCounter; private boolean mBeganFromNonInteractive = false; private boolean mBeganFromDefaultDisplayOn = false; private final ArrayList<SingleKeyRule> mRules = new ArrayList(); private SingleKeyRule mActiveRule = null; Loading Loading @@ -194,11 +195,12 @@ public final class SingleKeyGestureDetector { mRules.remove(rule); } void interceptKey(KeyEvent event, boolean interactive) { void interceptKey(KeyEvent event, boolean interactive, boolean defaultDisplayOn) { if (event.getAction() == KeyEvent.ACTION_DOWN) { // Store the non interactive state when first down. // Store the non interactive state and display on state when first down. if (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) { mBeganFromNonInteractive = !interactive; mBeganFromDefaultDisplayOn = defaultDisplayOn; } interceptKeyDown(event); } else { Loading Loading @@ -388,6 +390,10 @@ public final class SingleKeyGestureDetector { return mBeganFromNonInteractive; } boolean beganFromDefaultDisplayOn() { return mBeganFromDefaultDisplayOn; } void dump(String prefix, PrintWriter pw) { pw.println(prefix + "SingleKey rules:"); for (SingleKeyRule rule : mRules) { Loading services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +7 −2 Original line number Diff line number Diff line Loading @@ -170,10 +170,15 @@ public class SingleKeyGestureTests { } private void pressKey(int keyCode, long pressTime, boolean interactive) { pressKey(keyCode, pressTime, interactive, false /* defaultDisplayOn */); } private void pressKey( int keyCode, long pressTime, boolean interactive, boolean defaultDisplayOn) { long eventTime = SystemClock.uptimeMillis(); final KeyEvent keyDown = new KeyEvent(eventTime, eventTime, ACTION_DOWN, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyDown, interactive); mDetector.interceptKey(keyDown, interactive, defaultDisplayOn); // keep press down. try { Loading @@ -186,7 +191,7 @@ public class SingleKeyGestureTests { final KeyEvent keyUp = new KeyEvent(eventTime, eventTime, ACTION_UP, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyUp, interactive); mDetector.interceptKey(keyUp, interactive, defaultDisplayOn); } @Test Loading Loading
core/res/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -542,6 +542,9 @@ <bool name="config_goToSleepOnButtonPressTheaterMode">true</bool> <!-- If this is true, long press on power button will be available from the non-interactive state --> <bool name="config_supportLongPressPowerWhenNonInteractive">false</bool> <!-- If this is true, short press on power button will be available whenever the default display is on even if the device is non-interactive (dreaming). --> <bool name="config_supportShortPressPowerWhenDefaultDisplayOn">false</bool> <!-- If this is true, then keep dreaming when unplugging. This config was formerly known as config_keepDreamingWhenUndocking. Loading
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1968,6 +1968,7 @@ <java-symbol type="integer" name="config_keyguardDrawnTimeout" /> <java-symbol type="bool" name="config_goToSleepOnButtonPressTheaterMode" /> <java-symbol type="bool" name="config_supportLongPressPowerWhenNonInteractive" /> <java-symbol type="bool" name="config_supportShortPressPowerWhenDefaultDisplayOn" /> <java-symbol type="bool" name="config_wimaxEnabled" /> <java-symbol type="bool" name="show_ongoing_ime_switcher" /> <java-symbol type="color" name="config_defaultNotificationColor" /> Loading
services/core/java/com/android/server/policy/PhoneWindowManager.java +75 −21 Original line number Diff line number Diff line Loading @@ -208,7 +208,6 @@ import com.android.internal.policy.LogDecelerateInterpolator; import com.android.internal.policy.PhoneWindow; import com.android.internal.policy.TransitionAnimation; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.LockPatternUtils; import com.android.server.AccessibilityManagerInternal; import com.android.server.ExtconStateObserver; Loading Loading @@ -622,9 +621,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mAllowTheaterModeWakeFromLidSwitch; private boolean mAllowTheaterModeWakeFromWakeGesture; // Whether to support long press from power button in non-interactive mode // If true, the power button long press behavior will be invoked even if the default display is // non-interactive. If false, the power button long press behavior will be skipped if the // default display is non-interactive. private boolean mSupportLongPressPowerWhenNonInteractive; // If true, the power button short press behavior will be always invoked as long as the default // display is on, even if the display is not interactive. If false, the power button short press // behavior will be skipped if the default display is non-interactive. private boolean mSupportShortPressPowerWhenDefaultDisplayOn; // Whether to go to sleep entering theater mode from power button private boolean mGoToSleepOnButtonPressTheaterMode; Loading Loading @@ -1041,7 +1047,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { private void powerPress(long eventTime, int count) { // SideFPS still needs to know about suppressed power buttons, in case it needs to block // an auth attempt. if (count == 1) { Loading @@ -1055,9 +1061,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean interactive = mDefaultDisplayPolicy.isAwake(); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); Slog.d( TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior); if (count == 2) { powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); Loading @@ -1065,12 +1078,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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.shouldConsumeSinglePress(eventTime)) { Slog.i(TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor"); return; } } else if (count == 1 && shouldHandleShortPressPowerAction(interactive, eventTime)) { switch (mShortPressOnPowerBehavior) { case SHORT_PRESS_POWER_NOTHING: break; Loading Loading @@ -1118,6 +1126,44 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } private boolean shouldHandleShortPressPowerAction(boolean interactive, long eventTime) { if (mSupportShortPressPowerWhenDefaultDisplayOn) { final boolean defaultDisplayOn = Display.isOnState(mDefaultDisplay.getState()); final boolean beganFromDefaultDisplayOn = mSingleKeyGestureDetector.beganFromDefaultDisplayOn(); if (!defaultDisplayOn || !beganFromDefaultDisplayOn) { Slog.v( TAG, "Ignoring short press of power button because the default display is not" + " on. defaultDisplayOn=" + defaultDisplayOn + ", beganFromDefaultDisplayOn=" + beganFromDefaultDisplayOn); return false; } return true; } final boolean beganFromNonInteractive = mSingleKeyGestureDetector.beganFromNonInteractive(); if (!interactive || beganFromNonInteractive) { Slog.v( TAG, "Ignoring short press of power button because the device is not interactive." + " interactive=" + interactive + ", beganFromNonInteractive=" + beganFromNonInteractive); return false; } if (mSideFpsEventHandler.shouldConsumeSinglePress(eventTime)) { Slog.i( TAG, "Suppressing power key because the user is interacting with the " + "fingerprint sensor"); return false; } return true; } /** * Attempt to dream from a power button press. * Loading Loading @@ -2231,6 +2277,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSupportLongPressPowerWhenNonInteractive = mContext.getResources().getBoolean( com.android.internal.R.bool.config_supportLongPressPowerWhenNonInteractive); mSupportShortPressPowerWhenDefaultDisplayOn = mContext.getResources() .getBoolean( com.android.internal.R.bool .config_supportShortPressPowerWhenDefaultDisplayOn); mLongPressOnBackBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnBackBehavior); Loading Loading @@ -2518,8 +2569,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onPress(long downTime) { powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); powerPress(downTime, 1 /*count*/); } @Override Loading Loading @@ -2550,7 +2600,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onMultiPress(long downTime, int count) { powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); powerPress(downTime, count); } } Loading Loading @@ -4323,10 +4373,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { // This could prevent some wrong state in multi-displays environment, // the default display may turned off but interactive is true. final boolean isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake(); final boolean interactiveAndOn = interactive && isDefaultDisplayOn; final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState()); final boolean isDefaultDisplayAwake = mDefaultDisplayPolicy.isAwake(); final boolean interactiveAndAwake = interactive && isDefaultDisplayAwake; if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { handleKeyGesture(event, interactiveAndOn); handleKeyGesture(event, interactiveAndAwake, isDefaultDisplayOn); } // Enable haptics if down and virtual key without multiple repetitions. If this is a hard Loading Loading @@ -4479,7 +4530,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { result &= ~ACTION_PASS_TO_USER; isWakeKey = false; // wake-up will be handled separately if (down) { interceptPowerKeyDown(event, interactiveAndOn); interceptPowerKeyDown(event, interactiveAndAwake); } else { interceptPowerKeyUp(event, canceled); } Loading Loading @@ -4695,7 +4746,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return result; } private void handleKeyGesture(KeyEvent event, boolean interactive) { private void handleKeyGesture(KeyEvent event, boolean interactive, boolean defaultDisplayOn) { if (mKeyCombinationManager.interceptKey(event, interactive)) { // handled by combo keys manager. mSingleKeyGestureDetector.reset(); Loading @@ -4711,7 +4762,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mSingleKeyGestureDetector.interceptKey(event, interactive); mSingleKeyGestureDetector.interceptKey(event, interactive, defaultDisplayOn); } // The camera gesture will be detected by GestureLauncherService. Loading Loading @@ -6166,6 +6217,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(prefix); pw.print("mTriplePressOnPowerBehavior="); pw.println(multiPressOnPowerBehaviorToString(mTriplePressOnPowerBehavior)); pw.print(prefix); pw.print("mSupportShortPressPowerWhenDefaultDisplayOn="); pw.println(mSupportShortPressPowerWhenDefaultDisplayOn); pw.print(prefix); pw.print("mPowerVolUpBehavior="); pw.println(powerVolumeUpBehaviorToString(mPowerVolUpBehavior)); Loading
services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +8 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ public final class SingleKeyGestureDetector { private int mKeyPressCounter; private boolean mBeganFromNonInteractive = false; private boolean mBeganFromDefaultDisplayOn = false; private final ArrayList<SingleKeyRule> mRules = new ArrayList(); private SingleKeyRule mActiveRule = null; Loading Loading @@ -194,11 +195,12 @@ public final class SingleKeyGestureDetector { mRules.remove(rule); } void interceptKey(KeyEvent event, boolean interactive) { void interceptKey(KeyEvent event, boolean interactive, boolean defaultDisplayOn) { if (event.getAction() == KeyEvent.ACTION_DOWN) { // Store the non interactive state when first down. // Store the non interactive state and display on state when first down. if (mDownKeyCode == KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode != event.getKeyCode()) { mBeganFromNonInteractive = !interactive; mBeganFromDefaultDisplayOn = defaultDisplayOn; } interceptKeyDown(event); } else { Loading Loading @@ -388,6 +390,10 @@ public final class SingleKeyGestureDetector { return mBeganFromNonInteractive; } boolean beganFromDefaultDisplayOn() { return mBeganFromDefaultDisplayOn; } void dump(String prefix, PrintWriter pw) { pw.println(prefix + "SingleKey rules:"); for (SingleKeyRule rule : mRules) { Loading
services/tests/wmtests/src/com/android/server/policy/SingleKeyGestureTests.java +7 −2 Original line number Diff line number Diff line Loading @@ -170,10 +170,15 @@ public class SingleKeyGestureTests { } private void pressKey(int keyCode, long pressTime, boolean interactive) { pressKey(keyCode, pressTime, interactive, false /* defaultDisplayOn */); } private void pressKey( int keyCode, long pressTime, boolean interactive, boolean defaultDisplayOn) { long eventTime = SystemClock.uptimeMillis(); final KeyEvent keyDown = new KeyEvent(eventTime, eventTime, ACTION_DOWN, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyDown, interactive); mDetector.interceptKey(keyDown, interactive, defaultDisplayOn); // keep press down. try { Loading @@ -186,7 +191,7 @@ public class SingleKeyGestureTests { final KeyEvent keyUp = new KeyEvent(eventTime, eventTime, ACTION_UP, keyCode, 0 /* repeat */, 0 /* metaState */); mDetector.interceptKey(keyUp, interactive); mDetector.interceptKey(keyUp, interactive, defaultDisplayOn); } @Test Loading