From 3b7a391c2bae5cdd2951c4bbea1cb3b8dc9166b2 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 23 Mar 2022 16:03:10 -0700 Subject: [PATCH] Don't recreate taskbar on rotation This was a regression due to ag/17241303, since technically the size changes when rotating (width and height swap). Now we detect that case and don't recreate, but instead propagate the new DeviceProfile via TaskbarActivityContext#updateDeviceProfile() Test: Open an app, rotate device, ensure taskbar isn't recreated. Changing properties such as dark theme does still recreate taskbar. Bug: 219981733 Change-Id: Ic827c8e697a284a085609ea8653d77900686306a --- .../launcher3/taskbar/TaskbarManager.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index 494d21e016..8e31a74927 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -19,10 +19,7 @@ import static android.content.pm.PackageManager.FEATURE_PC; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; -import static com.android.launcher3.util.DisplayController.CHANGE_ACTIVE_SCREEN; -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_SUPPORTED_BOUNDS; import android.content.ComponentCallbacks; import android.content.Context; @@ -120,19 +117,24 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen int configsRequiringRecreate = ActivityInfo.CONFIG_ASSETS_PATHS | ActivityInfo.CONFIG_LAYOUT_DIRECTION | ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_DENSITY | ActivityInfo.CONFIG_SCREEN_SIZE; - if ((configDiff & configsRequiringRecreate) != 0) { - if ((configDiff & ActivityInfo.CONFIG_SCREEN_SIZE) != 0 && - mTaskbarActivityContext != null && dp != null) { - DeviceProfile oldDp = mTaskbarActivityContext.getDeviceProfile(); - // Additional check since this callback gets fired multiple times w/o - // screen size changing - if (dp.widthPx != oldDp.widthPx || dp.heightPx != oldDp.heightPx) { - recreateTaskbar(); - } - } else { - // Color has changed, recreate taskbar to reload background color & icons. - recreateTaskbar(); + boolean requiresRecreate = (configDiff & configsRequiringRecreate) != 0; + if ((configDiff & ActivityInfo.CONFIG_SCREEN_SIZE) != 0 + && mTaskbarActivityContext != null && dp != null) { + // Additional check since this callback gets fired multiple times w/o + // screen size changing, or when simply rotating the device. + DeviceProfile oldDp = mTaskbarActivityContext.getDeviceProfile(); + boolean isOrientationChange = + (configDiff & ActivityInfo.CONFIG_ORIENTATION) != 0; + int oldWidth = isOrientationChange ? oldDp.heightPx : oldDp.widthPx; + int oldHeight = isOrientationChange ? oldDp.widthPx : oldDp.heightPx; + if (dp.widthPx == oldWidth && dp.heightPx == oldHeight) { + configDiff &= ~ActivityInfo.CONFIG_SCREEN_SIZE; + requiresRecreate = (configDiff & configsRequiringRecreate) != 0; } + } + + if (requiresRecreate) { + recreateTaskbar(); } else { // Config change might be handled without re-creating the taskbar if (mTaskbarActivityContext != null) {