Loading services/core/java/com/android/server/input/KeyGestureController.java +15 −23 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.display.DisplayManager; import android.hardware.input.AidlInputGestureData; import android.hardware.input.AidlKeyGestureEvent; import android.hardware.input.AppLaunchData; Loading @@ -57,6 +58,7 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; Loading Loading @@ -127,6 +129,7 @@ final class KeyGestureController { private final SettingsObserver mSettingsObserver; private final AppLaunchShortcutManager mAppLaunchShortcutManager; private final InputGestureManager mInputGestureManager; private final DisplayManager mDisplayManager; @GuardedBy("mInputDataStore") private final InputDataStore mInputDataStore; private static final Object mUserLock = new Object(); Loading Loading @@ -194,6 +197,7 @@ final class KeyGestureController { mSettingsObserver = new SettingsObserver(mHandler); mAppLaunchShortcutManager = new AppLaunchShortcutManager(mContext); mInputGestureManager = new InputGestureManager(mContext); mDisplayManager = Objects.requireNonNull(mContext.getSystemService(DisplayManager.class)); mInputDataStore = inputDataStore; mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); initBehaviors(); Loading Loading @@ -245,12 +249,6 @@ final class KeyGestureController { mKeyCombinationManager.addRule( new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_POWER) { @Override public boolean preCondition() { return isKeyGestureSupported( KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD); } @Override public void execute() { handleMultiKeyGesture( Loading @@ -273,12 +271,6 @@ final class KeyGestureController { mKeyCombinationManager.addRule( new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_POWER, KeyEvent.KEYCODE_STEM_PRIMARY) { @Override public boolean preCondition() { return isKeyGestureSupported( KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD); } @Override public void execute() { handleMultiKeyGesture(new int[]{KeyEvent.KEYCODE_POWER, Loading Loading @@ -333,9 +325,6 @@ final class KeyGestureController { KeyEvent.KEYCODE_POWER) { @Override public boolean preCondition() { if (!isKeyGestureSupported(getGestureType())) { return false; } switch (mPowerVolUpBehavior) { case POWER_VOLUME_UP_BEHAVIOR_MUTE: return mRingerToggleChord != Settings.Secure.VOLUME_HUSH_OFF; Loading Loading @@ -422,12 +411,6 @@ final class KeyGestureController { mKeyCombinationManager.addRule( new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_CENTER) { @Override public boolean preCondition() { return isKeyGestureSupported( KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT); } @Override public void execute() { handleMultiKeyGesture( Loading Loading @@ -468,10 +451,11 @@ final class KeyGestureController { if (mVisibleBackgroundUsersEnabled && shouldIgnoreKeyEventForVisibleBackgroundUser(event)) { return false; } final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0; if (InputSettings.doesKeyGestureEventHandlerSupportMultiKeyGestures() && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { return mKeyCombinationManager.interceptKey(event, interactive); final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0; final boolean isDefaultDisplayOn = isDefaultDisplayOn(); return mKeyCombinationManager.interceptKey(event, interactive && isDefaultDisplayOn); } return false; } Loading Loading @@ -1038,6 +1022,14 @@ final class KeyGestureController { mIoHandler.obtainMessage(MSG_LOAD_CUSTOM_GESTURES, userId).sendToTarget(); } private boolean isDefaultDisplayOn() { Display defaultDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); if (defaultDisplay == null) { return false; } return Display.isOnState(defaultDisplay.getState()); } @MainThread private void notifyKeyGestureEvent(AidlKeyGestureEvent event) { InputDevice device = getInputDevice(event.deviceId); Loading services/core/java/com/android/server/policy/KeyCombinationManager.java +4 −4 Original line number Diff line number Diff line Loading @@ -148,19 +148,19 @@ public class KeyCombinationManager { * to a window. * Return true if any active rule could be triggered by the key event, otherwise false. */ public boolean interceptKey(KeyEvent event, boolean interactive) { public boolean interceptKey(KeyEvent event, boolean isDefaultDisplayInteractive) { synchronized (mLock) { return interceptKeyLocked(event, interactive); return interceptKeyLocked(event, isDefaultDisplayInteractive); } } private boolean interceptKeyLocked(KeyEvent event, boolean interactive) { private boolean interceptKeyLocked(KeyEvent event, boolean isDefaultDisplayInteractive) { final boolean down = event.getAction() == KeyEvent.ACTION_DOWN; final int keyCode = event.getKeyCode(); final int count = mActiveRules.size(); final long eventTime = event.getEventTime(); if (interactive && down) { if (isDefaultDisplayInteractive && down) { if (mDownTimes.size() > 0) { if (count > 0 && eventTime > mDownTimes.valueAt(0) + COMBINE_KEY_DELAY_MILLIS) { Loading services/core/java/com/android/server/policy/PhoneWindowManager.java +7 −10 Original line number Diff line number Diff line Loading @@ -4283,22 +4283,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS: case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION: case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: return true; case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD: case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD: case KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS: case KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT: return mDefaultDisplayPolicy.isAwake(); case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD: return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController .isAccessibilityShortcutAvailable(isKeyguardLocked()); case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD: return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController .isAccessibilityShortcutAvailable(false); case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK: return enableTalkbackAndMagnifierKeyGestures(); case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS: return enableVoiceAccessKeyGestures(); return true; case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD: return mAccessibilityShortcutController.isAccessibilityShortcutAvailable( isKeyguardLocked()); case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD: return mAccessibilityShortcutController.isAccessibilityShortcutAvailable( false); default: return false; } Loading Loading
services/core/java/com/android/server/input/KeyGestureController.java +15 −23 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.display.DisplayManager; import android.hardware.input.AidlInputGestureData; import android.hardware.input.AidlKeyGestureEvent; import android.hardware.input.AppLaunchData; Loading @@ -57,6 +58,7 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; Loading Loading @@ -127,6 +129,7 @@ final class KeyGestureController { private final SettingsObserver mSettingsObserver; private final AppLaunchShortcutManager mAppLaunchShortcutManager; private final InputGestureManager mInputGestureManager; private final DisplayManager mDisplayManager; @GuardedBy("mInputDataStore") private final InputDataStore mInputDataStore; private static final Object mUserLock = new Object(); Loading Loading @@ -194,6 +197,7 @@ final class KeyGestureController { mSettingsObserver = new SettingsObserver(mHandler); mAppLaunchShortcutManager = new AppLaunchShortcutManager(mContext); mInputGestureManager = new InputGestureManager(mContext); mDisplayManager = Objects.requireNonNull(mContext.getSystemService(DisplayManager.class)); mInputDataStore = inputDataStore; mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); initBehaviors(); Loading Loading @@ -245,12 +249,6 @@ final class KeyGestureController { mKeyCombinationManager.addRule( new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_POWER) { @Override public boolean preCondition() { return isKeyGestureSupported( KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD); } @Override public void execute() { handleMultiKeyGesture( Loading @@ -273,12 +271,6 @@ final class KeyGestureController { mKeyCombinationManager.addRule( new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_POWER, KeyEvent.KEYCODE_STEM_PRIMARY) { @Override public boolean preCondition() { return isKeyGestureSupported( KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD); } @Override public void execute() { handleMultiKeyGesture(new int[]{KeyEvent.KEYCODE_POWER, Loading Loading @@ -333,9 +325,6 @@ final class KeyGestureController { KeyEvent.KEYCODE_POWER) { @Override public boolean preCondition() { if (!isKeyGestureSupported(getGestureType())) { return false; } switch (mPowerVolUpBehavior) { case POWER_VOLUME_UP_BEHAVIOR_MUTE: return mRingerToggleChord != Settings.Secure.VOLUME_HUSH_OFF; Loading Loading @@ -422,12 +411,6 @@ final class KeyGestureController { mKeyCombinationManager.addRule( new KeyCombinationManager.TwoKeysCombinationRule(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_DPAD_CENTER) { @Override public boolean preCondition() { return isKeyGestureSupported( KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT); } @Override public void execute() { handleMultiKeyGesture( Loading Loading @@ -468,10 +451,11 @@ final class KeyGestureController { if (mVisibleBackgroundUsersEnabled && shouldIgnoreKeyEventForVisibleBackgroundUser(event)) { return false; } final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0; if (InputSettings.doesKeyGestureEventHandlerSupportMultiKeyGestures() && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { return mKeyCombinationManager.interceptKey(event, interactive); final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0; final boolean isDefaultDisplayOn = isDefaultDisplayOn(); return mKeyCombinationManager.interceptKey(event, interactive && isDefaultDisplayOn); } return false; } Loading Loading @@ -1038,6 +1022,14 @@ final class KeyGestureController { mIoHandler.obtainMessage(MSG_LOAD_CUSTOM_GESTURES, userId).sendToTarget(); } private boolean isDefaultDisplayOn() { Display defaultDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); if (defaultDisplay == null) { return false; } return Display.isOnState(defaultDisplay.getState()); } @MainThread private void notifyKeyGestureEvent(AidlKeyGestureEvent event) { InputDevice device = getInputDevice(event.deviceId); Loading
services/core/java/com/android/server/policy/KeyCombinationManager.java +4 −4 Original line number Diff line number Diff line Loading @@ -148,19 +148,19 @@ public class KeyCombinationManager { * to a window. * Return true if any active rule could be triggered by the key event, otherwise false. */ public boolean interceptKey(KeyEvent event, boolean interactive) { public boolean interceptKey(KeyEvent event, boolean isDefaultDisplayInteractive) { synchronized (mLock) { return interceptKeyLocked(event, interactive); return interceptKeyLocked(event, isDefaultDisplayInteractive); } } private boolean interceptKeyLocked(KeyEvent event, boolean interactive) { private boolean interceptKeyLocked(KeyEvent event, boolean isDefaultDisplayInteractive) { final boolean down = event.getAction() == KeyEvent.ACTION_DOWN; final int keyCode = event.getKeyCode(); final int count = mActiveRules.size(); final long eventTime = event.getEventTime(); if (interactive && down) { if (isDefaultDisplayInteractive && down) { if (mDownTimes.size() > 0) { if (count > 0 && eventTime > mDownTimes.valueAt(0) + COMBINE_KEY_DELAY_MILLIS) { Loading
services/core/java/com/android/server/policy/PhoneWindowManager.java +7 −10 Original line number Diff line number Diff line Loading @@ -4283,22 +4283,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS: case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION: case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: return true; case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD: case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD: case KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS: case KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT: return mDefaultDisplayPolicy.isAwake(); case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD: return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController .isAccessibilityShortcutAvailable(isKeyguardLocked()); case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD: return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController .isAccessibilityShortcutAvailable(false); case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK: return enableTalkbackAndMagnifierKeyGestures(); case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS: return enableVoiceAccessKeyGestures(); return true; case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT_CHORD: return mAccessibilityShortcutController.isAccessibilityShortcutAvailable( isKeyguardLocked()); case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD: return mAccessibilityShortcutController.isAccessibilityShortcutAvailable( false); default: return false; } Loading