summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Brown <jeffbrown@google.com> 2011-05-25 14:43:16 -0700
committer Android Git Automerger <android-git-automerger@android.com> 2011-05-25 14:43:16 -0700
commitc5c7e047d1a1c56ba55bdfea9391d1907f355dbc (patch)
treea8c963db9b1be24a793248fb0ecf362a3d4d3a8d
parent6f37a7f9b6f83fbcc919dc452e72838623e8bb5d (diff)
parentd0132e8e187ebf69bf4d2d6d0ef0027ff3f7a727 (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.xml11
-rwxr-xr-xcore/java/android/view/KeyEvent.java21
-rw-r--r--data/keyboards/Generic.kcm3
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java67
-rw-r--r--policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java20
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++) {