Loading api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -212956,6 +212956,17 @@ visibility="public" > </method> <method name="getModifiers" return="int" abstract="false" native="false" synchronized="false" static="false" final="true" deprecated="not deprecated" visibility="public" > </method> <method name="getNumber" return="char" abstract="false" core/java/android/view/KeyEvent.java +21 −0 Original line number Diff line number Diff line Loading @@ -1741,11 +1741,32 @@ public class KeyEvent extends InputEvent implements Parcelable { * @see #META_CAPS_LOCK_ON * @see #META_NUM_LOCK_ON * @see #META_SCROLL_LOCK_ON * @see #getModifiers */ public final int getMetaState() { return mMetaState; } /** * Returns the state of the modifier keys. * <p> * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK}, * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are * not considered modifier keys. Consequently, this function specifically masks out * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}. * </p><p> * The value returned consists of the meta state (from {@link #getMetaState}) * normalized using {@link #normalizeMetaState(int)} and then masked with * {@link #getModifierMetaStateMask} so that only valid modifier bits are retained. * </p> * * @return An integer in which each bit set to 1 represents a pressed modifier key. * @see #getMetaState */ public final int getModifiers() { return normalizeMetaState(mMetaState) & META_MODIFIER_MASK; } /** * Returns the flags for this key event. * Loading data/keyboards/Generic.kcm +1 −2 Original line number Diff line number Diff line Loading @@ -300,8 +300,7 @@ key ENTER { key TAB { label: '\t' base: '\t' ctrl: none alt, meta: fallback APP_SWITCH ctrl, alt, meta: none } key COMMA { Loading policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +46 −21 Original line number Diff line number Diff line Loading @@ -623,7 +623,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) { showRecentAppsDialog(0); showOrHideRecentAppsDialog(0, true /*dismissIfShown*/); } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_ACTIVITY) { try { Intent intent = new Intent(); Loading @@ -640,17 +640,25 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** * Create (if necessary) and launch the recent apps dialog * Create (if necessary) and launch the recent apps dialog, or hide it if it is * already shown. */ void showRecentAppsDialog(final int initialModifiers) { void showOrHideRecentAppsDialog(final int heldModifiers, final boolean dismissIfShown) { mHandler.post(new Runnable() { @Override public void run() { if (mRecentAppsDialog == null) { mRecentAppsDialog = new RecentApplicationsDialog(mContext, initialModifiers); mRecentAppsDialog = new RecentApplicationsDialog(mContext); } if (mRecentAppsDialog.isShowing()) { if (dismissIfShown) { mRecentAppsDialog.dismiss(); } } else { mRecentAppsDialog.setHeldModifiers(heldModifiers); mRecentAppsDialog.show(); } } }); } Loading Loading @@ -1433,7 +1441,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return false; } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) { if (down && repeatCount == 0) { showRecentAppsDialog(event.getMetaState() & KeyEvent.getModifierMetaStateMask()); showOrHideRecentAppsDialog(0, true /*dismissIfShown*/); } return true; } Loading Loading @@ -1475,6 +1483,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) { // Note: This method is only called if the initial down was unhandled. if (DEBUG_FALLBACK) { Slog.d(TAG, "Unhandled key: win=" + win + ", action=" + event.getAction() + ", flags=" + event.getFlags() Loading @@ -1486,10 +1495,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { // Invoke shortcuts using Meta as a fallback. final KeyCharacterMap kcm = event.getKeyCharacterMap(); final int keyCode = event.getKeyCode(); final int metaState = event.getMetaState(); final boolean initialDown = event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0; if (initialDown) { // Invoke shortcuts using Meta as a fallback. if ((metaState & KeyEvent.META_META_ON) != 0) { Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, metaState & ~(KeyEvent.META_META_ON Loading @@ -1507,7 +1520,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } // Check for fallback actions. // Display task switcher for ALT-TAB or Meta-TAB. if (keyCode == KeyEvent.KEYCODE_TAB) { final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK; if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON) || KeyEvent.metaStateHasModifiers( shiftlessModifiers, KeyEvent.META_META_ON)) { showOrHideRecentAppsDialog(shiftlessModifiers, false /*dismissIfShown*/); return null; } } } // Check for fallback actions specified by the key character map. if (getFallbackAction(kcm, keyCode, metaState, mFallbackAction)) { if (DEBUG_FALLBACK) { Slog.d(TAG, "Fallback: keyCode=" + mFallbackAction.keyCode Loading policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java +15 −5 Original line number Diff line number Diff line Loading @@ -71,12 +71,11 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener } }; private int mInitialModifiers; private int mHeldModifiers; public RecentApplicationsDialog(Context context, int initialModifiers) { public RecentApplicationsDialog(Context context) { super(context, com.android.internal.R.style.Theme_Dialog_RecentApplications); mInitialModifiers = initialModifiers; } /** Loading Loading @@ -125,9 +124,20 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener } } /** * Sets the modifier keys that are being held to keep the dialog open, or 0 if none. * Used to make the recent apps dialog automatically dismiss itself when the modifiers * all go up. * @param heldModifiers The held key modifiers, such as {@link KeyEvent#META_ALT_ON}. * Should exclude shift. */ public void setHeldModifiers(int heldModifiers) { mHeldModifiers = heldModifiers; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_APP_SWITCH || keyCode == KeyEvent.KEYCODE_TAB) { if (keyCode == KeyEvent.KEYCODE_TAB) { // Ignore all meta keys other than SHIFT. The app switch key could be a // fallback action chorded with ALT, META or even CTRL depending on the key map. // DPad navigation is handled by the ViewRoot elsewhere. Loading Loading @@ -166,7 +176,7 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (mInitialModifiers != 0 && event.hasNoModifiers()) { if (mHeldModifiers != 0 && (event.getModifiers() & mHeldModifiers) == 0) { final int numIcons = mIcons.length; RecentTag tag = null; for (int i = 0; i < numIcons; i++) { Loading Loading
api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -212956,6 +212956,17 @@ visibility="public" > </method> <method name="getModifiers" return="int" abstract="false" native="false" synchronized="false" static="false" final="true" deprecated="not deprecated" visibility="public" > </method> <method name="getNumber" return="char" abstract="false"
core/java/android/view/KeyEvent.java +21 −0 Original line number Diff line number Diff line Loading @@ -1741,11 +1741,32 @@ public class KeyEvent extends InputEvent implements Parcelable { * @see #META_CAPS_LOCK_ON * @see #META_NUM_LOCK_ON * @see #META_SCROLL_LOCK_ON * @see #getModifiers */ public final int getMetaState() { return mMetaState; } /** * Returns the state of the modifier keys. * <p> * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK}, * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are * not considered modifier keys. Consequently, this function specifically masks out * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}. * </p><p> * The value returned consists of the meta state (from {@link #getMetaState}) * normalized using {@link #normalizeMetaState(int)} and then masked with * {@link #getModifierMetaStateMask} so that only valid modifier bits are retained. * </p> * * @return An integer in which each bit set to 1 represents a pressed modifier key. * @see #getMetaState */ public final int getModifiers() { return normalizeMetaState(mMetaState) & META_MODIFIER_MASK; } /** * Returns the flags for this key event. * Loading
data/keyboards/Generic.kcm +1 −2 Original line number Diff line number Diff line Loading @@ -300,8 +300,7 @@ key ENTER { key TAB { label: '\t' base: '\t' ctrl: none alt, meta: fallback APP_SWITCH ctrl, alt, meta: none } key COMMA { Loading
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +46 −21 Original line number Diff line number Diff line Loading @@ -623,7 +623,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) { showRecentAppsDialog(0); showOrHideRecentAppsDialog(0, true /*dismissIfShown*/); } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_ACTIVITY) { try { Intent intent = new Intent(); Loading @@ -640,17 +640,25 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** * Create (if necessary) and launch the recent apps dialog * Create (if necessary) and launch the recent apps dialog, or hide it if it is * already shown. */ void showRecentAppsDialog(final int initialModifiers) { void showOrHideRecentAppsDialog(final int heldModifiers, final boolean dismissIfShown) { mHandler.post(new Runnable() { @Override public void run() { if (mRecentAppsDialog == null) { mRecentAppsDialog = new RecentApplicationsDialog(mContext, initialModifiers); mRecentAppsDialog = new RecentApplicationsDialog(mContext); } if (mRecentAppsDialog.isShowing()) { if (dismissIfShown) { mRecentAppsDialog.dismiss(); } } else { mRecentAppsDialog.setHeldModifiers(heldModifiers); mRecentAppsDialog.show(); } } }); } Loading Loading @@ -1433,7 +1441,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return false; } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) { if (down && repeatCount == 0) { showRecentAppsDialog(event.getMetaState() & KeyEvent.getModifierMetaStateMask()); showOrHideRecentAppsDialog(0, true /*dismissIfShown*/); } return true; } Loading Loading @@ -1475,6 +1483,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) { // Note: This method is only called if the initial down was unhandled. if (DEBUG_FALLBACK) { Slog.d(TAG, "Unhandled key: win=" + win + ", action=" + event.getAction() + ", flags=" + event.getFlags() Loading @@ -1486,10 +1495,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { // Invoke shortcuts using Meta as a fallback. final KeyCharacterMap kcm = event.getKeyCharacterMap(); final int keyCode = event.getKeyCode(); final int metaState = event.getMetaState(); final boolean initialDown = event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0; if (initialDown) { // Invoke shortcuts using Meta as a fallback. if ((metaState & KeyEvent.META_META_ON) != 0) { Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, metaState & ~(KeyEvent.META_META_ON Loading @@ -1507,7 +1520,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } // Check for fallback actions. // Display task switcher for ALT-TAB or Meta-TAB. if (keyCode == KeyEvent.KEYCODE_TAB) { final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK; if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON) || KeyEvent.metaStateHasModifiers( shiftlessModifiers, KeyEvent.META_META_ON)) { showOrHideRecentAppsDialog(shiftlessModifiers, false /*dismissIfShown*/); return null; } } } // Check for fallback actions specified by the key character map. if (getFallbackAction(kcm, keyCode, metaState, mFallbackAction)) { if (DEBUG_FALLBACK) { Slog.d(TAG, "Fallback: keyCode=" + mFallbackAction.keyCode Loading
policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java +15 −5 Original line number Diff line number Diff line Loading @@ -71,12 +71,11 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener } }; private int mInitialModifiers; private int mHeldModifiers; public RecentApplicationsDialog(Context context, int initialModifiers) { public RecentApplicationsDialog(Context context) { super(context, com.android.internal.R.style.Theme_Dialog_RecentApplications); mInitialModifiers = initialModifiers; } /** Loading Loading @@ -125,9 +124,20 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener } } /** * Sets the modifier keys that are being held to keep the dialog open, or 0 if none. * Used to make the recent apps dialog automatically dismiss itself when the modifiers * all go up. * @param heldModifiers The held key modifiers, such as {@link KeyEvent#META_ALT_ON}. * Should exclude shift. */ public void setHeldModifiers(int heldModifiers) { mHeldModifiers = heldModifiers; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_APP_SWITCH || keyCode == KeyEvent.KEYCODE_TAB) { if (keyCode == KeyEvent.KEYCODE_TAB) { // Ignore all meta keys other than SHIFT. The app switch key could be a // fallback action chorded with ALT, META or even CTRL depending on the key map. // DPad navigation is handled by the ViewRoot elsewhere. Loading Loading @@ -166,7 +176,7 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (mInitialModifiers != 0 && event.hasNoModifiers()) { if (mHeldModifiers != 0 && (event.getModifiers() & mHeldModifiers) == 0) { final int numIcons = mIcons.length; RecentTag tag = null; for (int i = 0; i < numIcons; i++) { Loading