summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java452
1 files changed, 235 insertions, 217 deletions
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 4ccd57ddc977..c50efc70a6bc 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -520,8 +520,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mConsumeSearchKeyUp;
boolean mPendingMetaAction;
boolean mPendingCapsLockToggle;
- int mMetaState;
- int mInitialMetaState;
// support for activating the lock screen while the screen is on
private HashSet<Integer> mAllowLockscreenWhenOnDisplays = new HashSet<>();
@@ -2547,6 +2545,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final boolean canceled = event.isCanceled();
final int displayId = event.getDisplayId();
+ final long key_consumed = -1;
if (DEBUG_INPUT) {
Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
@@ -2554,7 +2553,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if (mKeyCombinationManager.isKeyConsumed(event)) {
- return -1;
+ return key_consumed;
}
if ((flags & KeyEvent.FLAG_FALLBACK) == 0) {
@@ -2575,205 +2574,250 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mPendingCapsLockToggle = false;
}
- // First we always handle the home key here, so applications
- // can never break it, although if keyguard is on, we do let
- // it handle it, because that gives us the correct 5 second
- // timeout.
- if (keyCode == KEYCODE_HOME) {
- DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
- if (handler == null) {
- handler = new DisplayHomeButtonHandler(displayId);
- mDisplayHomeButtonHandlers.put(displayId, handler);
- }
- return handler.handleHomeButton(focusedToken, event);
- } else if (keyCode == KeyEvent.KEYCODE_MENU) {
- // Hijack modified menu keys for debugging features
- final int chordBug = KeyEvent.META_SHIFT_ON;
-
- if (down && repeatCount == 0) {
- if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
- Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
- mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT,
- null, null, null, 0, null, null);
- return -1;
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_HOME:
+ // First we always handle the home key here, so applications
+ // can never break it, although if keyguard is on, we do let
+ // it handle it, because that gives us the correct 5 second
+ // timeout.
+ DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
+ if (handler == null) {
+ handler = new DisplayHomeButtonHandler(displayId);
+ mDisplayHomeButtonHandlers.put(displayId, handler);
}
- }
- } else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
- if (down) {
- if (repeatCount == 0) {
- mSearchKeyShortcutPending = true;
- mConsumeSearchKeyUp = false;
+ return handler.handleHomeButton(focusedToken, event);
+ case KeyEvent.KEYCODE_MENU:
+ // Hijack modified menu keys for debugging features
+ final int chordBug = KeyEvent.META_SHIFT_ON;
+
+ if (down && repeatCount == 0) {
+ if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
+ Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
+ mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT,
+ null, null, null, 0, null, null);
+ return key_consumed;
+ }
}
- } else {
- mSearchKeyShortcutPending = false;
- if (mConsumeSearchKeyUp) {
- mConsumeSearchKeyUp = false;
- return -1;
+ break;
+ case KeyEvent.KEYCODE_SEARCH:
+ if (down) {
+ if (repeatCount == 0) {
+ mSearchKeyShortcutPending = true;
+ mConsumeSearchKeyUp = false;
+ }
+ } else {
+ mSearchKeyShortcutPending = false;
+ if (mConsumeSearchKeyUp) {
+ mConsumeSearchKeyUp = false;
+ return key_consumed;
+ }
}
- }
- return 0;
- } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {
- if (!keyguardOn) {
- if (down && repeatCount == 0) {
- preloadRecentApps();
- } else if (!down) {
- toggleRecentApps();
+ return 0;
+ case KeyEvent.KEYCODE_APP_SWITCH:
+ if (!keyguardOn) {
+ if (down && repeatCount == 0) {
+ preloadRecentApps();
+ } else if (!down) {
+ toggleRecentApps();
+ }
}
- }
- return -1;
- } else if (keyCode == KeyEvent.KEYCODE_N && event.isMetaPressed()) {
- if (down) {
- IStatusBarService service = getStatusBarService();
- if (service != null) {
- try {
- service.expandNotificationsPanel();
- } catch (RemoteException e) {
- // do nothing.
+ return key_consumed;
+ case KeyEvent.KEYCODE_N:
+ if (down && event.isMetaPressed()) {
+ IStatusBarService service = getStatusBarService();
+ if (service != null) {
+ try {
+ service.expandNotificationsPanel();
+ } catch (RemoteException e) {
+ // do nothing.
+ }
+ return key_consumed;
}
}
- }
- } else if (keyCode == KeyEvent.KEYCODE_S && event.isMetaPressed()
- && event.isCtrlPressed()) {
- if (down && repeatCount == 0) {
- int type = event.isShiftPressed() ? TAKE_SCREENSHOT_SELECTED_REGION
- : TAKE_SCREENSHOT_FULLSCREEN;
- mScreenshotRunnable.setScreenshotType(type);
- mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
- mHandler.post(mScreenshotRunnable);
- return -1;
- }
- } else if (keyCode == KeyEvent.KEYCODE_SLASH && event.isMetaPressed()) {
- if (down && repeatCount == 0 && !isKeyguardLocked()) {
- toggleKeyboardShortcutsMenu(event.getDeviceId());
- }
- } else if (keyCode == KeyEvent.KEYCODE_ASSIST) {
- Slog.wtf(TAG, "KEYCODE_ASSIST should be handled in interceptKeyBeforeQueueing");
- return -1;
- } else if (keyCode == KeyEvent.KEYCODE_VOICE_ASSIST) {
- Slog.wtf(TAG, "KEYCODE_VOICE_ASSIST should be handled in interceptKeyBeforeQueueing");
- return -1;
- } else if (keyCode == KeyEvent.KEYCODE_SYSRQ) {
- if (down && repeatCount == 0) {
- mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
- mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
- mHandler.post(mScreenshotRunnable);
- }
- return -1;
- } else if (keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP
- || keyCode == KeyEvent.KEYCODE_BRIGHTNESS_DOWN) {
- if (down) {
- int direction = keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP ? 1 : -1;
-
- // Disable autobrightness if it's on
- int auto = Settings.System.getIntForUser(
- mContext.getContentResolver(),
- Settings.System.SCREEN_BRIGHTNESS_MODE,
- Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
- UserHandle.USER_CURRENT_OR_SELF);
- if (auto != 0) {
- Settings.System.putIntForUser(mContext.getContentResolver(),
+ break;
+ case KeyEvent.KEYCODE_S:
+ if (down && event.isMetaPressed() && event.isCtrlPressed() && repeatCount == 0) {
+ int type = event.isShiftPressed() ? TAKE_SCREENSHOT_SELECTED_REGION
+ : TAKE_SCREENSHOT_FULLSCREEN;
+ mScreenshotRunnable.setScreenshotType(type);
+ mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
+ mHandler.post(mScreenshotRunnable);
+ return key_consumed;
+ }
+ break;
+ case KeyEvent.KEYCODE_SLASH:
+ if (down && repeatCount == 0 && event.isMetaPressed() && !keyguardOn) {
+ toggleKeyboardShortcutsMenu(event.getDeviceId());
+ return key_consumed;
+ }
+ break;
+ case KeyEvent.KEYCODE_ASSIST:
+ Slog.wtf(TAG, "KEYCODE_ASSIST should be handled in interceptKeyBeforeQueueing");
+ return key_consumed;
+ case KeyEvent.KEYCODE_VOICE_ASSIST:
+ Slog.wtf(TAG, "KEYCODE_VOICE_ASSIST should be handled in"
+ + " interceptKeyBeforeQueueing");
+ return key_consumed;
+ case KeyEvent.KEYCODE_SYSRQ:
+ if (down && repeatCount == 0) {
+ mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
+ mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
+ mHandler.post(mScreenshotRunnable);
+ }
+ return key_consumed;
+ case KeyEvent.KEYCODE_BRIGHTNESS_UP:
+ case KeyEvent.KEYCODE_BRIGHTNESS_DOWN:
+ if (down) {
+ int direction = keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP ? 1 : -1;
+
+ // Disable autobrightness if it's on
+ int auto = Settings.System.getIntForUser(
+ mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
UserHandle.USER_CURRENT_OR_SELF);
+ if (auto != 0) {
+ Settings.System.putIntForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
+ UserHandle.USER_CURRENT_OR_SELF);
+ }
+ float minFloat = mPowerManager.getBrightnessConstraint(
+ PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);
+ float maxFloat = mPowerManager.getBrightnessConstraint(
+ PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM);
+ float stepFloat = (maxFloat - minFloat) / BRIGHTNESS_STEPS * direction;
+ float brightnessFloat = Settings.System.getFloatForUser(
+ mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_FLOAT,
+ mContext.getDisplay().getBrightnessDefault(),
+ UserHandle.USER_CURRENT_OR_SELF);
+ brightnessFloat += stepFloat;
+ // Make sure we don't go beyond the limits.
+ brightnessFloat = Math.min(maxFloat, brightnessFloat);
+ brightnessFloat = Math.max(minFloat, brightnessFloat);
+
+ Settings.System.putFloatForUser(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_FLOAT, brightnessFloat,
+ UserHandle.USER_CURRENT_OR_SELF);
+ startActivityAsUser(new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG),
+ UserHandle.CURRENT_OR_SELF);
+ }
+ return key_consumed;
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ if (mUseTvRouting || mHandleVolumeKeysInWM) {
+ // On TVs or when the configuration is enabled, volume keys never
+ // go to the foreground app.
+ dispatchDirectAudioEvent(event);
+ return key_consumed;
}
- float minFloat = mPowerManager.getBrightnessConstraint(
- PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);
- float maxFloat = mPowerManager.getBrightnessConstraint(
- PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM);
- float stepFloat = (maxFloat - minFloat) / BRIGHTNESS_STEPS * direction;
- float brightnessFloat = Settings.System.getFloatForUser(
- mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_FLOAT,
- mContext.getDisplay().getBrightnessDefault(),
- UserHandle.USER_CURRENT_OR_SELF);
- brightnessFloat += stepFloat;
- // Make sure we don't go beyond the limits.
- brightnessFloat = Math.min(maxFloat, brightnessFloat);
- brightnessFloat = Math.max(minFloat, brightnessFloat);
-
- Settings.System.putFloatForUser(mContext.getContentResolver(),
- Settings.System.SCREEN_BRIGHTNESS_FLOAT, brightnessFloat,
- UserHandle.USER_CURRENT_OR_SELF);
- startActivityAsUser(new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG),
- UserHandle.CURRENT_OR_SELF);
- }
- return -1;
- } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP
- || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
- || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) {
- if (mUseTvRouting || mHandleVolumeKeysInWM) {
- // On TVs or when the configuration is enabled, volume keys never
- // go to the foreground app.
- dispatchDirectAudioEvent(event);
- return -1;
- }
- // If the device is in VR mode and keys are "internal" (e.g. on the side of the
- // device), then drop the volume keys and don't forward it to the application/dispatch
- // the audio event.
- if (mDefaultDisplayPolicy.isPersistentVrModeEnabled()) {
- final InputDevice d = event.getDevice();
- if (d != null && !d.isExternal()) {
- return -1;
+ // If the device is in VR mode and keys are "internal" (e.g. on the side of the
+ // device), then drop the volume keys and don't forward it to the
+ // application/dispatch the audio event.
+ if (mDefaultDisplayPolicy.isPersistentVrModeEnabled()) {
+ final InputDevice d = event.getDevice();
+ if (d != null && !d.isExternal()) {
+ return key_consumed;
+ }
}
- }
- } else if (keyCode == KeyEvent.KEYCODE_TAB && event.isMetaPressed()) {
- // Pass through keyboard navigation keys.
- return 0;
- } else if (keyCode == KeyEvent.KEYCODE_ALL_APPS) {
- if (!down) {
- mHandler.removeMessages(MSG_HANDLE_ALL_APPS);
- Message msg = mHandler.obtainMessage(MSG_HANDLE_ALL_APPS);
- msg.setAsynchronous(true);
- msg.sendToTarget();
- }
- return -1;
- } else if (keyCode == KeyEvent.KEYCODE_NOTIFICATION) {
- if (!down) {
- toggleNotificationPanel();
- }
- return -1;
- }
+ break;
+ case KeyEvent.KEYCODE_TAB:
+ if (event.isMetaPressed()) {
+ // Pass through keyboard navigation keys.
+ return 0;
+ }
+ // Display task switcher for ALT-TAB.
+ if (down && repeatCount == 0) {
+ if (mRecentAppsHeldModifiers == 0 && !keyguardOn && isUserSetupComplete()) {
+ final int shiftlessModifiers =
+ event.getModifiers() & ~KeyEvent.META_SHIFT_MASK;
+ if (KeyEvent.metaStateHasModifiers(
+ shiftlessModifiers, KeyEvent.META_ALT_ON)) {
+ mRecentAppsHeldModifiers = shiftlessModifiers;
+ showRecentApps(true);
+ return key_consumed;
+ }
+ }
+ }
+ break;
+ case KeyEvent.KEYCODE_ALL_APPS:
+ if (!down) {
+ mHandler.removeMessages(MSG_HANDLE_ALL_APPS);
+ Message msg = mHandler.obtainMessage(MSG_HANDLE_ALL_APPS);
+ msg.setAsynchronous(true);
+ msg.sendToTarget();
+ }
+ return key_consumed;
+ case KeyEvent.KEYCODE_NOTIFICATION:
+ if (!down) {
+ toggleNotificationPanel();
+ }
+ return key_consumed;
- // Toggle Caps Lock on META-ALT.
- boolean actionTriggered = false;
- if (KeyEvent.isModifierKey(keyCode)) {
- if (!mPendingCapsLockToggle) {
- // Start tracking meta state for combo.
- mInitialMetaState = mMetaState;
- mPendingCapsLockToggle = true;
- } else if (event.getAction() == KeyEvent.ACTION_UP) {
- int altOnMask = mMetaState & KeyEvent.META_ALT_MASK;
- int metaOnMask = mMetaState & KeyEvent.META_META_MASK;
-
- // Check for Caps Lock toggle
- if ((metaOnMask != 0) && (altOnMask != 0)) {
- // Check if nothing else is pressed
- if (mInitialMetaState == (mMetaState ^ (altOnMask | metaOnMask))) {
- // Handle Caps Lock Toggle
+ case KeyEvent.KEYCODE_SPACE:
+ // Handle keyboard layout switching.
+ if ((metaState & (KeyEvent.META_CTRL_MASK | KeyEvent.META_META_MASK)) == 0) {
+ return 0;
+ }
+ // Share the same behavior with KEYCODE_LANGUAGE_SWITCH.
+ case KeyEvent.KEYCODE_LANGUAGE_SWITCH:
+ if (down && repeatCount == 0) {
+ int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
+ mWindowManagerFuncs.switchKeyboardLayout(event.getDeviceId(), direction);
+ return key_consumed;
+ }
+ break;
+ case KeyEvent.KEYCODE_META_LEFT:
+ case KeyEvent.KEYCODE_META_RIGHT:
+ if (down) {
+ if (event.isAltPressed()) {
+ mPendingCapsLockToggle = true;
+ mPendingMetaAction = false;
+ } else {
+ mPendingCapsLockToggle = false;
+ mPendingMetaAction = true;
+ }
+ } else {
+ // Toggle Caps Lock on META-ALT.
+ if (mPendingCapsLockToggle) {
mInputManagerInternal.toggleCapsLock(event.getDeviceId());
- actionTriggered = true;
+ mPendingCapsLockToggle = false;
+ } else if (mPendingMetaAction) {
+ launchAssistAction(Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD,
+ event.getDeviceId(),
+ event.getEventTime());
+ mPendingMetaAction = false;
}
}
+ return key_consumed;
+ case KeyEvent.KEYCODE_ALT_LEFT:
+ case KeyEvent.KEYCODE_ALT_RIGHT:
+ if (down) {
+ if (event.isMetaPressed()) {
+ mPendingCapsLockToggle = true;
+ mPendingMetaAction = false;
+ } else {
+ mPendingCapsLockToggle = false;
+ }
+ } else {
+ // hide recent if triggered by ALT-TAB.
+ if (mRecentAppsHeldModifiers != 0
+ && (metaState & mRecentAppsHeldModifiers) == 0) {
+ mRecentAppsHeldModifiers = 0;
+ hideRecentApps(true, false);
+ return key_consumed;
+ }
- // Always stop tracking when key goes up.
- mPendingCapsLockToggle = false;
- }
- }
- // Store current meta state to be able to evaluate it later.
- mMetaState = metaState;
-
- if (actionTriggered) {
- return -1;
- }
-
- if (KeyEvent.isMetaKey(keyCode)) {
- if (down) {
- mPendingMetaAction = true;
- } else if (mPendingMetaAction) {
- launchAssistAction(Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD, event.getDeviceId(),
- event.getEventTime());
- }
- return -1;
+ // Toggle Caps Lock on META-ALT.
+ if (mPendingCapsLockToggle) {
+ mInputManagerInternal.toggleCapsLock(event.getDeviceId());
+ mPendingCapsLockToggle = false;
+ return key_consumed;
+ }
+ }
+ break;
}
// Shortcuts are invoked through Search+key, so intercept those here
@@ -2803,7 +2847,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
+ "SEARCH+" + KeyEvent.keyCodeToString(keyCode));
}
}
- return -1;
+ return key_consumed;
}
}
@@ -2825,7 +2869,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
+ "the activity to which it is registered was not found: "
+ "META+" + KeyEvent.keyCodeToString(keyCode), ex);
}
- return -1;
+ return key_consumed;
}
}
}
@@ -2844,39 +2888,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
+ "the activity to which it is registered was not found: "
+ "keyCode=" + keyCode + ", category=" + category, ex);
}
- return -1;
+ return key_consumed;
}
}
- // Display task switcher for ALT-TAB.
- if (down && repeatCount == 0 && keyCode == KeyEvent.KEYCODE_TAB) {
- if (mRecentAppsHeldModifiers == 0 && !keyguardOn && isUserSetupComplete()) {
- final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK;
- if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON)) {
- mRecentAppsHeldModifiers = shiftlessModifiers;
- showRecentApps(true);
- return -1;
- }
- }
- } else if (!down && mRecentAppsHeldModifiers != 0
- && (metaState & mRecentAppsHeldModifiers) == 0) {
- mRecentAppsHeldModifiers = 0;
- hideRecentApps(true, false);
- }
-
- // Handle keyboard language switching.
- final boolean isCtrlOrMetaSpace = keyCode == KeyEvent.KEYCODE_SPACE
- && (metaState & (KeyEvent.META_CTRL_MASK | KeyEvent.META_META_MASK)) != 0;
- if (down && repeatCount == 0
- && (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH || isCtrlOrMetaSpace)) {
- int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
- mWindowManagerFuncs.switchKeyboardLayout(event.getDeviceId(), direction);
- return -1;
- }
-
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.handleGlobalKey(mContext, keyCode, event)) {
- return -1;
+ return key_consumed;
}
if (down) {
@@ -2906,13 +2924,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} catch (RemoteException e) {
mShortcutKeyServices.delete(shortcutCode);
}
- return -1;
+ return key_consumed;
}
}
// Reserve all the META modifier combos for system behavior
if ((metaState & KeyEvent.META_META_ON) != 0) {
- return -1;
+ return key_consumed;
}
// Let the application handle the key.