diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index db288c0dca901..8fb345b3a9001 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -53,7 +53,7 @@ oneway interface IStatusBar boolean showImeSwitcher); void setWindowState(int display, int window, int state); - void showRecentApps(boolean triggeredFromAltTab); + void showRecentApps(boolean triggeredFromAltTab, boolean forward); void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey); void toggleRecentApps(); void toggleSplitScreen(); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl index a71fb5611bd9c..fa484c794a5b0 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl @@ -37,7 +37,7 @@ oneway interface IOverviewProxy { /** * Sent when overview is to be shown. */ - void onOverviewShown(boolean triggeredFromAltTab) = 7; + void onOverviewShown(boolean triggeredFromAltTab, boolean forward) = 7; /** * Sent when overview is to be hidden. diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java index 5ea1c0b4ce852..c335a6d74e9b2 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java @@ -59,11 +59,11 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { } @Override - public void showRecentApps(boolean triggeredFromAltTab) { + public void showRecentApps(boolean triggeredFromAltTab, boolean forward) { IOverviewProxy overviewProxy = mOverviewProxyService.getProxy(); if (overviewProxy != null) { try { - overviewProxy.onOverviewShown(triggeredFromAltTab); + overviewProxy.onOverviewShown(triggeredFromAltTab, forward); } catch (RemoteException e) { Log.e(TAG, "Failed to send overview show event to launcher.", e); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index b041f957d7712..95d6c187a224a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -65,14 +65,14 @@ public class Recents implements CoreStartable, CommandQueue.Callbacks { } @Override - public void showRecentApps(boolean triggeredFromAltTab) { + public void showRecentApps(boolean triggeredFromAltTab, boolean forward) { // Ensure the device has been provisioned before allowing the user to interact with // recents if (!isUserSetup()) { return; } - mImpl.showRecentApps(triggeredFromAltTab); + mImpl.showRecentApps(triggeredFromAltTab, forward); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java index 8848dbbda5e78..010ceda84068a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java @@ -31,7 +31,7 @@ public interface RecentsImplementation { default void preloadRecentApps() {} default void cancelPreloadRecentApps() {} - default void showRecentApps(boolean triggeredFromAltTab) {} + default void showRecentApps(boolean triggeredFromAltTab, boolean forward) {} default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {} default void toggleRecentApps() {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index bad942fe3da95..04adaae209fbb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -224,7 +224,7 @@ public class CommandQueue extends IStatusBar.Stub implements */ default void setImeWindowStatus(int displayId, IBinder token, int vis, @BackDispositionMode int backDisposition, boolean showImeSwitcher) { } - default void showRecentApps(boolean triggeredFromAltTab) { } + default void showRecentApps(boolean triggeredFromAltTab, boolean forward) { } default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { } default void toggleRecentApps() { } default void toggleSplitScreen() { } @@ -686,11 +686,11 @@ public class CommandQueue extends IStatusBar.Stub implements } } - public void showRecentApps(boolean triggeredFromAltTab) { + public void showRecentApps(boolean triggeredFromAltTab, boolean forward) { synchronized (mLock) { mHandler.removeMessages(MSG_SHOW_RECENT_APPS); - mHandler.obtainMessage(MSG_SHOW_RECENT_APPS, triggeredFromAltTab ? 1 : 0, 0, - null).sendToTarget(); + mHandler.obtainMessage(MSG_SHOW_RECENT_APPS, triggeredFromAltTab ? 1 : 0, + forward ? 1 : 0, null).sendToTarget(); } } @@ -1384,7 +1384,7 @@ public class CommandQueue extends IStatusBar.Stub implements break; case MSG_SHOW_RECENT_APPS: for (int i = 0; i < mCallbacks.size(); i++) { - mCallbacks.get(i).showRecentApps(msg.arg1 != 0); + mCallbacks.get(i).showRecentApps(msg.arg1 != 0, msg.arg2 != 0); } break; case MSG_HIDE_RECENT_APPS: diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index 0000c32aa60d2..fc7cd890af36e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -209,9 +209,9 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testShowRecentApps() { - mCommandQueue.showRecentApps(true); + mCommandQueue.showRecentApps(true, false); waitForIdleSync(); - verify(mCallbacks).showRecentApps(eq(true)); + verify(mCallbacks).showRecentApps(eq(true), eq(false)); } @Test diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a53d0f9e3c7a2..ba066571d4806 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -661,7 +661,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { dispatchMediaKeyRepeatWithWakeLock((KeyEvent)msg.obj); break; case MSG_DISPATCH_SHOW_RECENTS: - showRecentApps(false); + showRecents(); break; case MSG_DISPATCH_SHOW_GLOBAL_ACTIONS: showGlobalActionsInternal(); @@ -2910,7 +2910,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { break; case KeyEvent.KEYCODE_RECENT_APPS: if (down && repeatCount == 0) { - showRecentApps(false /* triggeredFromAltTab */); + showRecents(); } return key_consumed; case KeyEvent.KEYCODE_APP_SWITCH: @@ -3094,22 +3094,23 @@ public class PhoneWindowManager implements WindowManagerPolicy { } break; case KeyEvent.KEYCODE_TAB: - if (down && event.isMetaPressed()) { - if (!keyguardOn && isUserSetupComplete()) { - showRecentApps(false); - return key_consumed; - } - } else if (down && repeatCount == 0) { - // Display task switcher for ALT-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); + if (down) { + if (event.isMetaPressed()) { + if (!keyguardOn && isUserSetupComplete()) { + showRecents(); return key_consumed; } + } else { + // Display task switcher for ALT-TAB. + if (mRecentAppsHeldModifiers == 0 && !keyguardOn && isUserSetupComplete()) { + final int modifiers = event.getModifiers(); + if (KeyEvent.metaStateHasModifiers(modifiers, KeyEvent.META_ALT_ON)) { + mRecentAppsHeldModifiers = modifiers; + showRecentsFromAltTab(KeyEvent.metaStateHasModifiers(modifiers, + KeyEvent.META_SHIFT_ON)); + return key_consumed; + } + } } } break; @@ -3646,11 +3647,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHandler.obtainMessage(MSG_DISPATCH_SHOW_RECENTS).sendToTarget(); } - private void showRecentApps(boolean triggeredFromAltTab) { + private void showRecents() { mPreloadedRecentApps = false; // preloading no longer needs to be canceled StatusBarManagerInternal statusbar = getStatusBarManagerInternal(); if (statusbar != null) { - statusbar.showRecentApps(triggeredFromAltTab); + statusbar.showRecentApps(false /* triggeredFromAltTab */, false /* forward */); + } + } + + private void showRecentsFromAltTab(boolean forward) { + mPreloadedRecentApps = false; // preloading no longer needs to be canceled + StatusBarManagerInternal statusbar = getStatusBarManagerInternal(); + if (statusbar != null) { + statusbar.showRecentApps(true /* triggeredFromAltTab */, forward); } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 392fda9520fef..0fd6d9b396056 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -39,7 +39,7 @@ public interface StatusBarManagerInternal { void cancelPreloadRecentApps(); - void showRecentApps(boolean triggeredFromAltTab); + void showRecentApps(boolean triggeredFromAltTab, boolean forward); void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 8d71d9cc6dc80..97ca8df268a91 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -454,10 +454,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void showRecentApps(boolean triggeredFromAltTab) { + public void showRecentApps(boolean triggeredFromAltTab, boolean forward) { if (mBar != null) { try { - mBar.showRecentApps(triggeredFromAltTab); + mBar.showRecentApps(triggeredFromAltTab, forward); } catch (RemoteException ex) {} } }