diff options
| author | 2011-05-25 14:43:16 -0700 | |
|---|---|---|
| committer | 2011-05-25 14:43:16 -0700 | |
| commit | c5c7e047d1a1c56ba55bdfea9391d1907f355dbc (patch) | |
| tree | a8c963db9b1be24a793248fb0ecf362a3d4d3a8d | |
| parent | 6f37a7f9b6f83fbcc919dc452e72838623e8bb5d (diff) | |
| parent | d0132e8e187ebf69bf4d2d6d0ef0027ff3f7a727 (diff) | |
am d0132e8e: Minor Alt-TAB / Recent Apps Dialog improvements. (DO NOT MERGE)
* commit 'd0132e8e187ebf69bf4d2d6d0ef0027ff3f7a727':
Minor Alt-TAB / Recent Apps Dialog improvements. (DO NOT MERGE)
| -rw-r--r-- | api/current.xml | 11 | ||||
| -rwxr-xr-x | core/java/android/view/KeyEvent.java | 21 | ||||
| -rw-r--r-- | data/keyboards/Generic.kcm | 3 | ||||
| -rwxr-xr-x | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 67 | ||||
| -rw-r--r-- | policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java | 20 |
5 files changed, 94 insertions, 28 deletions
diff --git a/api/current.xml b/api/current.xml index 37ce1d5bdb0c..b0886788ad70 100644 --- a/api/current.xml +++ b/api/current.xml @@ -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" diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 81d5a6e7f77d..f455f913e19a 100755 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -1741,12 +1741,33 @@ 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. * * @see #FLAG_WOKE_HERE diff --git a/data/keyboards/Generic.kcm b/data/keyboards/Generic.kcm index ef0a4e624bfe..b5f689719b32 100644 --- a/data/keyboards/Generic.kcm +++ b/data/keyboards/Generic.kcm @@ -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 { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 298c587fe4d4..d024c4171729 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -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(); @@ -640,16 +640,24 @@ 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(); } - mRecentAppsDialog.show(); } }); } @@ -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; } @@ -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() @@ -1486,28 +1495,44 @@ 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(); - if ((metaState & KeyEvent.META_META_ON) != 0) { - Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, - metaState & ~(KeyEvent.META_META_ON - | KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON)); - if (shortcutIntent != null) { - shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - mContext.startActivity(shortcutIntent); - } catch (ActivityNotFoundException ex) { - Slog.w(TAG, "Dropping shortcut key combination because " - + "the activity to which it is registered was not found: " - + "META+" + KeyEvent.keyCodeToString(keyCode), ex); + 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 + | KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON)); + if (shortcutIntent != null) { + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + mContext.startActivity(shortcutIntent); + } catch (ActivityNotFoundException ex) { + Slog.w(TAG, "Dropping shortcut key combination because " + + "the activity to which it is registered was not found: " + + "META+" + KeyEvent.keyCodeToString(keyCode), ex); + } + return null; + } + } + + // 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; } - return null; } } - // Check for fallback actions. + // 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 diff --git a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java index c4b78222746d..aa00fbdd246f 100644 --- a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java +++ b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java @@ -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; } /** @@ -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. @@ -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++) { |