From e74569e935ebee5d01e9144b8a8c5145fea7fcfb Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 29 Jul 2022 16:55:18 -0700 Subject: [PATCH] Fix taskbar stash state not persisting properly across recreate Because we check supportsVisualStashing() in TaskbarStashController#init(), we need to avoid using TaskbarUIController to provide that value since TaskbarUIController isn't initialized until a bit later than the other controllers. So I moved the logic from supportsVisualStashing() back to TaskbarStashController, but still allow TaskbarUIController to override it (e.g. for DesktopTaskbarUIController). After that fix, I noticed that force stopping launcher (to test the fix) would briefly show the taskbar background before resetting the stashed state. This is also due to LauncherTaskbarUIController not being ready immediately, since that's what sets FLAG_IN_APP due to launcher being paused. To work around this, I set FLAG_IN_APP to true by default in TaskbarStashController#init(), since that is the most common case, and taskbar background/stashed handle isn't shown on home anyway. Test: Force stop launcher while taskbar is stashed, verify it recreates as stashed without background flicker; same when changing wallpaper color on home or in app; also tested when taskbar isn't stashed and in 3 button mode for good measure Test: testHideTaskbarPersistsOnRecreate Fixes: 235986838 Change-Id: Ie55bd70e8288d5ad7433dde970f18c176831d747 --- .../taskbar/DesktopTaskbarUIController.java | 2 +- .../launcher3/taskbar/TaskbarStashController.java | 13 +++++++++---- .../launcher3/taskbar/TaskbarUIController.java | 8 ++++++-- .../src/com/android/quickstep/TaplTestsTaskbar.java | 7 +++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java index d69b8d291c..9393b0f7ab 100644 --- a/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java @@ -43,8 +43,8 @@ public class DesktopTaskbarUIController extends TaskbarUIController { mLauncher.getHotseat().setIconsAlpha(1f); } - @Override /** Disable taskbar stashing in desktop environment. */ + @Override public boolean supportsVisualStashing() { return false; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 3ea917334c..d9d55e765f 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -210,7 +210,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba StashedHandleViewController.ALPHA_INDEX_STASHED); mTaskbarStashedHandleHintScale = stashedHandleController.getStashedHandleHintScale(); - boolean isManuallyStashedInApp = supportsManualStashing() + // We use supportsVisualStashing() here instead of supportsManualStashing() because we want + // it to work properly for tests that recreate taskbar. This check is here just to ensure + // that taskbar unstashes when going to 3 button mode (supportsVisualStashing() false). + boolean isManuallyStashedInApp = supportsVisualStashing() && mPrefs.getBoolean(SHARED_PREFS_STASHED_KEY, DEFAULT_STASHED_PREF); boolean isInSetup = !mActivity.isUserSetupComplete() || setupUIVisible; updateStateForFlag(FLAG_STASHED_IN_APP_MANUAL, isManuallyStashedInApp); @@ -218,7 +221,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba updateStateForFlag(FLAG_IN_SETUP, isInSetup); updateStateForFlag(FLAG_STASHED_SMALL_SCREEN, isPhoneMode() && !mActivity.isThreeButtonNav()); - applyState(); + // For now, assume we're in an app, since LauncherTaskbarUIController won't be able to tell + // us that we're paused until a bit later. This avoids flickering upon recreating taskbar. + updateStateForFlag(FLAG_IN_APP, true); + applyState(/* duration = */ 0); notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp()); } @@ -228,8 +234,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba * state. */ public boolean supportsVisualStashing() { - return mControllers.uiController.supportsVisualStashing() || - (isPhoneMode() && !mActivity.isThreeButtonNav()); + return !mActivity.isThreeButtonNav() && mControllers.uiController.supportsVisualStashing(); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index fcc34c6d99..114bfecb6e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -49,9 +49,13 @@ public class TaskbarUIController { return true; } + /** + * This should only be called by TaskbarStashController so that a TaskbarUIController can + * disable stashing. All other controllers should use + * {@link TaskbarStashController#supportsVisualStashing()} as the source of truth. + */ public boolean supportsVisualStashing() { - if (mControllers == null) return false; - return !mControllers.taskbarActivityContext.isThreeButtonNav(); + return true; } protected void onStashedInAppChanged() { } diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java index 1df9c02ee8..9337cb55bc 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java @@ -67,6 +67,13 @@ public class TaplTestsTaskbar extends AbstractQuickStepTest { mLauncher.getLaunchedAppState().showTaskbar(); } + @Test + public void testHideTaskbarPersistsOnRecreate() { + getTaskbar().hide(); + mLauncher.recreateTaskbar(); + mLauncher.getLaunchedAppState().assertTaskbarHidden(); + } + @Test public void testLaunchApp() throws Exception { getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE);