am d0132e8e: Minor Alt-TAB / Recent Apps Dialog improvements. (DO NOT MERGE)
* commit 'd0132e8e187ebf69bf4d2d6d0ef0027ff3f7a727': Minor Alt-TAB / Recent Apps Dialog improvements. (DO NOT MERGE)
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user