From fd0e60e6e08bbdb3b5a0d357e7250cd2c1a43a46 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Tue, 10 Jan 2023 22:24:53 +0000 Subject: [PATCH] Pass down whether iterating through tasks in overview is in forward or backward direction We are redesigning the alt tab experience and will allow user to iterate through all the apps in forward and backward directions Alt+Tab: backward, most recent to least recent Shift+Alt+Tab: forward, least recent to most recent Bug: 258854035 Test: manual Change-Id: Ic274fbb38c73865e18e95a835d5f85ad406616ba --- .../internal/statusbar/IStatusBar.aidl | 2 +- .../shared/recents/IOverviewProxy.aidl | 2 +- .../recents/OverviewProxyRecentsImpl.java | 4 +- .../com/android/systemui/recents/Recents.java | 4 +- .../recents/RecentsImplementation.java | 2 +- .../systemui/statusbar/CommandQueue.java | 10 ++--- .../systemui/statusbar/CommandQueueTest.java | 4 +- .../server/policy/PhoneWindowManager.java | 45 +++++++++++-------- .../statusbar/StatusBarManagerInternal.java | 2 +- .../statusbar/StatusBarManagerService.java | 4 +- 10 files changed, 44 insertions(+), 35 deletions(-) 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) {} } }