From f00adbeb68abdb53bb087c4c014b59e4ea1dd74d Mon Sep 17 00:00:00 2001 From: Yunfan Chen Date: Fri, 15 Dec 2023 13:13:33 +0900 Subject: [PATCH] Do not recreate taskbar due to unestimated bounds The change around configuration and display cutout to support flexible display setup is making the received display info is not calculated as the hard-coded way in taskbar. It will cause the taskbar recreated when the device reaches a given rotation for the first time. The recreation is not necessary as it is only a hint of taskbar's estimation doesn't match the result. Block the recreation in that case to avoid user visible animation issue. Bug: 302387383 Test: Rotate a device with movable cutout and no recreation happens Flag: ACONFIG com.android.window.flags.allows_screen_size_decoupled_from_status_bar_and_cutout TRUNKFOOD Flag: ACONFIG com.android.window.flags.movable_cutout_configuration DEVELOPMENT Change-Id: I1aa6add57ec49a49cc7473bfaada6d9212c1fc4b --- .../launcher3/taskbar/TaskbarManager.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index 831bc1167d..5dfef97fec 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -25,6 +25,9 @@ import static com.android.launcher3.BaseActivity.EVENT_DESTROYED; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION; import static com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate; +import static com.android.launcher3.util.DisplayController.CHANGE_DENSITY; +import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE; +import static com.android.launcher3.util.DisplayController.CHANGE_TASKBAR_PINNING; import static com.android.launcher3.util.DisplayController.TASKBAR_NOT_DESTROYED_TAG; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange; @@ -55,7 +58,6 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.InvariantDeviceProfile.OnIDPChangeListener; import com.android.launcher3.LauncherAppState; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.statemanager.StatefulActivity; @@ -71,7 +73,6 @@ import com.android.quickstep.util.AssistUtils; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.unfold.UnfoldTransitionProgressProvider; import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; -import com.android.wm.shell.Flags; import java.io.PrintWriter; import java.util.StringJoiner; @@ -135,7 +136,17 @@ public class TaskbarManager { * We use WindowManager's ComponentCallbacks() for internal UI changes (similar to an Activity) * which comes via a different channel */ - private final OnIDPChangeListener mIdpChangeListener = c -> recreateTaskbar(); + private final RecreationListener mRecreationListener = new RecreationListener(); + + private class RecreationListener implements DisplayController.DisplayInfoChangeListener { + @Override + public void onDisplayInfoChanged(Context context, DisplayController.Info info, int flags) { + if ((flags & (CHANGE_DENSITY | CHANGE_NAVIGATION_MODE + | CHANGE_TASKBAR_PINNING)) != 0) { + recreateTaskbar(); + } + } + } private final SettingsCache.OnChangeListener mOnSettingsChangeListener = c -> recreateTaskbar(); private boolean mUserUnlocked = false; @@ -353,7 +364,7 @@ public class TaskbarManager { */ public void onUserUnlocked() { mUserUnlocked = true; - LauncherAppState.getIDP(mContext).addOnChangeListener(mIdpChangeListener); + DisplayController.INSTANCE.get(mContext).addChangeListener(mRecreationListener); recreateTaskbar(); addTaskbarRootViewToWindow(); } @@ -551,7 +562,7 @@ public class TaskbarManager { () -> mTaskbarBroadcastReceiver.unregisterReceiverSafely(mContext)); destroyExistingTaskbar(); if (mUserUnlocked) { - LauncherAppState.getIDP(mContext).removeOnChangeListener(mIdpChangeListener); + DisplayController.INSTANCE.get(mContext).removeChangeListener(mRecreationListener); } SettingsCache.INSTANCE.get(mContext) .unregister(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);