[CD Taskbar] Refactor TaskbarManager to create object creation methods
Every object that needs its own instance for an instance of a new display-specific taskbar needs its own creation method.
Flag: EXEMPT not adding new behavior
Bug: 381105283
Test: Manual
Change-Id: I24794fefbf2a64f38795eca970cf30eb63c51e66
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index ff8e4a8..9407e73 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -113,7 +113,7 @@
private static final Uri NAV_BAR_KIDS_MODE = Settings.Secure.getUriFor(
Settings.Secure.NAV_BAR_KIDS_MODE);
- private final Context mContext;
+ private final Context mWindowContext;
private final @Nullable Context mNavigationBarPanelContext;
private WindowManager mWindowManager;
private boolean mAddedWindow;
@@ -231,7 +231,7 @@
@NonNull DesktopVisibilityController desktopVisibilityController) {
Display display =
context.getSystemService(DisplayManager.class).getDisplay(context.getDisplayId());
- mContext = context.createWindowContext(display,
+ mWindowContext = context.createWindowContext(display,
ENABLE_TASKBAR_NAVBAR_UNIFICATION ? TYPE_NAVIGATION_BAR : TYPE_NAVIGATION_BAR_PANEL,
null);
mAllAppsActionManager = allAppsActionManager;
@@ -240,30 +240,47 @@
: null;
mDesktopVisibilityController = desktopVisibilityController;
if (enableTaskbarNoRecreate()) {
- mWindowManager = mContext.getSystemService(WindowManager.class);
- FrameLayout taskbarRootLayout = new FrameLayout(mContext) {
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- // The motion events can be outside the view bounds of task bar, and hence
- // manually dispatching them to the drag layer here.
- TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
- if (taskbar != null && taskbar.getDragLayer().isAttachedToWindow()) {
- return taskbar.getDragLayer().dispatchTouchEvent(ev);
- }
- return super.dispatchTouchEvent(ev);
- }
- };
- addTaskbarRootLayoutToMap(getDefaultDisplayId(), taskbarRootLayout);
+ mWindowManager = mWindowContext.getSystemService(WindowManager.class);
+ createTaskbarRootLayout(getDefaultDisplayId());
}
- mDefaultNavButtonController = new TaskbarNavButtonController(
+ mDefaultNavButtonController = createDefaultNavButtonController(context, navCallbacks);
+ mDefaultComponentCallbacks = createDefaultComponentCallbacks();
+ SettingsCache.INSTANCE.get(mWindowContext)
+ .register(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
+ SettingsCache.INSTANCE.get(mWindowContext)
+ .register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
+ Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
+ mWindowContext.registerComponentCallbacks(mDefaultComponentCallbacks);
+ mShutdownReceiver.register(mWindowContext, Intent.ACTION_SHUTDOWN);
+ UI_HELPER_EXECUTOR.execute(() -> {
+ mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
+ mWindowContext,
+ SYSTEM_ACTION_ID_TASKBAR,
+ new Intent(ACTION_SHOW_TASKBAR).setPackage(mWindowContext.getPackageName()),
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+ mTaskbarBroadcastReceiver.register(
+ mWindowContext, RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
+ });
+
+ debugWhyTaskbarNotDestroyed("TaskbarManager created");
+ recreateTaskbar();
+ }
+
+ @NonNull
+ private TaskbarNavButtonController createDefaultNavButtonController(Context context,
+ TaskbarNavButtonCallbacks navCallbacks) {
+ return new TaskbarNavButtonController(
context,
navCallbacks,
- SystemUiProxy.INSTANCE.get(mContext),
- ContextualEduStatsManager.INSTANCE.get(mContext),
+ SystemUiProxy.INSTANCE.get(mWindowContext),
+ ContextualEduStatsManager.INSTANCE.get(mWindowContext),
new Handler(),
- new ContextualSearchInvoker(mContext));
- mDefaultComponentCallbacks = new ComponentCallbacks() {
- private Configuration mOldConfig = mContext.getResources().getConfiguration();
+ new ContextualSearchInvoker(mWindowContext));
+ }
+
+ private ComponentCallbacks createDefaultComponentCallbacks() {
+ return new ComponentCallbacks() {
+ private Configuration mOldConfig = mWindowContext.getResources().getConfiguration();
@Override
public void onConfigurationChanged(Configuration newConfig) {
@@ -273,7 +290,7 @@
"TaskbarManager#mComponentCallbacks.onConfigurationChanged: " + newConfig);
// TODO: adapt this logic to be specific to different displays.
DeviceProfile dp = mUserUnlocked
- ? LauncherAppState.getIDP(mContext).getDeviceProfile(mContext)
+ ? LauncherAppState.getIDP(mWindowContext).getDeviceProfile(mWindowContext)
: null;
int configDiff = mOldConfig.diff(newConfig) & ~SKIP_RECREATE_CONFIG_CHANGES;
@@ -317,25 +334,6 @@
@Override
public void onLowMemory() { }
};
- SettingsCache.INSTANCE.get(mContext)
- .register(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
- SettingsCache.INSTANCE.get(mContext)
- .register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
- Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
- mContext.registerComponentCallbacks(mDefaultComponentCallbacks);
- mShutdownReceiver.register(mContext, Intent.ACTION_SHUTDOWN);
- UI_HELPER_EXECUTOR.execute(() -> {
- mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
- mContext,
- SYSTEM_ACTION_ID_TASKBAR,
- new Intent(ACTION_SHOW_TASKBAR).setPackage(mContext.getPackageName()),
- PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
- mTaskbarBroadcastReceiver.register(
- mContext, RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
- });
-
- debugWhyTaskbarNotDestroyed("TaskbarManager created");
- recreateTaskbar();
}
private void destroyAllTaskbars() {
@@ -360,7 +358,7 @@
removeTaskbarFromMap(displayId);
}
DeviceProfile dp = mUserUnlocked ?
- LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
+ LauncherAppState.getIDP(mWindowContext).getDeviceProfile(mWindowContext) : null;
if (dp == null || !isTaskbarEnabled(dp)) {
removeTaskbarRootViewFromWindow(displayId);
}
@@ -407,7 +405,7 @@
*/
public void onUserUnlocked() {
mUserUnlocked = true;
- DisplayController.INSTANCE.get(mContext).addChangeListener(mRecreationListener);
+ DisplayController.INSTANCE.get(mWindowContext).addChangeListener(mRecreationListener);
recreateTaskbar();
addTaskbarRootViewToWindow(getDefaultDisplayId());
}
@@ -470,7 +468,7 @@
return ql.getUnfoldTransitionProgressProvider();
}
} else {
- return SystemUiProxy.INSTANCE.get(mContext).getUnfoldTransitionProvider();
+ return SystemUiProxy.INSTANCE.get(mWindowContext).getUnfoldTransitionProvider();
}
return null;
}
@@ -514,7 +512,7 @@
Trace.beginSection("recreateTaskbar");
try {
DeviceProfile dp = mUserUnlocked ?
- LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
+ LauncherAppState.getIDP(mWindowContext).getDeviceProfile(mWindowContext) : null;
// All Apps action is unrelated to navbar unification, so we only need to check DP.
final boolean isLargeScreenTaskbar = dp != null && dp.isTaskbarPresent;
@@ -528,7 +526,7 @@
+ " FLAG_HIDE_NAVBAR_WINDOW=" + ENABLE_TASKBAR_NAVBAR_UNIFICATION
+ " dp.isTaskbarPresent=" + (dp == null ? "null" : dp.isTaskbarPresent));
if (!isTaskbarEnabled || !isLargeScreenTaskbar) {
- SystemUiProxy.INSTANCE.get(mContext)
+ SystemUiProxy.INSTANCE.get(mWindowContext)
.notifyTaskbarStatus(/* visible */ false, /* stashed */ false);
if (!isTaskbarEnabled) {
return;
@@ -537,9 +535,7 @@
TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
if (enableTaskbarNoRecreate() || taskbar == null) {
- taskbar = new TaskbarActivityContext(mContext,
- mNavigationBarPanelContext, dp, mDefaultNavButtonController,
- mUnfoldProgressProvider, mDesktopVisibilityController);
+ taskbar = createTaskbarActivityContext(dp, displayId);
} else {
taskbar.updateDeviceProfile(dp);
}
@@ -560,7 +556,6 @@
taskbarRootLayout.addView(taskbar.getDragLayer());
taskbar.notifyUpdateLayoutParams();
}
- addTaskbarToMap(displayId, taskbar);
} finally {
Trace.endSection();
}
@@ -716,22 +711,23 @@
mRecentsViewContainer = null;
debugWhyTaskbarNotDestroyed("TaskbarManager#destroy()");
removeActivityCallbacksAndListeners();
- mTaskbarBroadcastReceiver.unregisterReceiverSafely(mContext);
+ mTaskbarBroadcastReceiver.unregisterReceiverSafely(mWindowContext);
destroyAllTaskbars();
if (mUserUnlocked) {
- DisplayController.INSTANCE.get(mContext).removeChangeListener(mRecreationListener);
+ DisplayController.INSTANCE.get(mWindowContext).removeChangeListener(
+ mRecreationListener);
}
- SettingsCache.INSTANCE.get(mContext)
+ SettingsCache.INSTANCE.get(mWindowContext)
.unregister(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
- SettingsCache.INSTANCE.get(mContext)
+ SettingsCache.INSTANCE.get(mWindowContext)
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "unregistering component callbacks from destroy().");
- mContext.unregisterComponentCallbacks(mDefaultComponentCallbacks);
- mShutdownReceiver.unregisterReceiverSafely(mContext);
+ mWindowContext.unregisterComponentCallbacks(mDefaultComponentCallbacks);
+ mShutdownReceiver.unregisterReceiverSafely(mWindowContext);
}
public @Nullable TaskbarActivityContext getCurrentActivityContext() {
- return getTaskbarForDisplay(mContext.getDisplayId());
+ return getTaskbarForDisplay(mWindowContext.getDisplayId());
}
public void dumpLogs(String prefix, PrintWriter pw) {
@@ -773,6 +769,19 @@
return mTaskbars.get(displayId);
}
+
+ /**
+ * Creates a {@link TaskbarActivityContext} for the given display and adds it to the map.
+ */
+ private TaskbarActivityContext createTaskbarActivityContext(DeviceProfile dp, int displayId) {
+ TaskbarActivityContext newTaskbar = new TaskbarActivityContext(mWindowContext,
+ mNavigationBarPanelContext, dp, mDefaultNavButtonController,
+ mUnfoldProgressProvider, mDesktopVisibilityController);
+
+ addTaskbarToMap(displayId, newTaskbar);
+ return newTaskbar;
+ }
+
/**
* Adds the {@link TaskbarActivityContext} associated with the given display ID to taskbar
* map if there is not already a taskbar mapped to that displayId.
@@ -796,6 +805,26 @@
}
/**
+ * Creates {@link FrameLayout} for the taskbar on the specified display and adds it to map.
+ * @param displayId The ID of the display for which to create the taskbar root layout.
+ */
+ private void createTaskbarRootLayout(int displayId) {
+ FrameLayout newTaskbarRootLayout = new FrameLayout(mWindowContext) {
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ // The motion events can be outside the view bounds of task bar, and hence
+ // manually dispatching them to the drag layer here.
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null && taskbar.getDragLayer().isAttachedToWindow()) {
+ return taskbar.getDragLayer().dispatchTouchEvent(ev);
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+ };
+ addTaskbarRootLayoutToMap(displayId, newTaskbarRootLayout);
+ }
+
+ /**
* Retrieves the root layout of the taskbar for the specified display.
*
* @param displayId The ID of the display for which to retrieve the taskbar root layout.
@@ -812,7 +841,7 @@
* @param rootLayout The taskbar root layout {@link FrameLayout} to add to the map.
*/
private void addTaskbarRootLayoutToMap(int displayId, FrameLayout rootLayout) {
- if (!mRootLayouts.contains(displayId)) {
+ if (!mRootLayouts.contains(displayId) && rootLayout != null) {
mRootLayouts.put(displayId, rootLayout);
}
}
@@ -829,7 +858,7 @@
}
private int getDefaultDisplayId() {
- return mContext.getDisplayId();
+ return mWindowContext.getDisplayId();
}
/** Temp logs for b/254119092. */
@@ -839,15 +868,15 @@
boolean activityTaskbarPresent = mActivity != null
&& mActivity.getDeviceProfile().isTaskbarPresent;
- boolean contextTaskbarPresent = mUserUnlocked
- && LauncherAppState.getIDP(mContext).getDeviceProfile(mContext).isTaskbarPresent;
+ boolean contextTaskbarPresent = mUserUnlocked && LauncherAppState.getIDP(mWindowContext)
+ .getDeviceProfile(mWindowContext).isTaskbarPresent;
if (activityTaskbarPresent == contextTaskbarPresent) {
- log.add("mActivity and mContext agree taskbarIsPresent=" + contextTaskbarPresent);
+ log.add("mActivity and mWindowContext agree taskbarIsPresent=" + contextTaskbarPresent);
Log.d(TASKBAR_NOT_DESTROYED_TAG, log.toString());
return;
}
- log.add("mActivity and mContext device profiles have different values, add more logs.");
+ log.add("mActivity & mWindowContext device profiles have different values, add more logs.");
log.add("\tmActivity logs:");
log.add("\t\tmActivity=" + mActivity);
@@ -857,13 +886,13 @@
log.add("\t\tmActivity.getDeviceProfile().isTaskbarPresent="
+ activityTaskbarPresent);
}
- log.add("\tmContext logs:");
- log.add("\t\tmContext=" + mContext);
- log.add("\t\tmContext.getResources().getConfiguration()="
- + mContext.getResources().getConfiguration());
+ log.add("\tmWindowContext logs:");
+ log.add("\t\tmWindowContext=" + mWindowContext);
+ log.add("\t\tmWindowContext.getResources().getConfiguration()="
+ + mWindowContext.getResources().getConfiguration());
if (mUserUnlocked) {
- log.add("\t\tLauncherAppState.getIDP().getDeviceProfile(mContext).isTaskbarPresent="
- + contextTaskbarPresent);
+ log.add("\t\tLauncherAppState.getIDP().getDeviceProfile(mWindowContext)"
+ + ".isTaskbarPresent=" + contextTaskbarPresent);
} else {
log.add("\t\tCouldn't get DeviceProfile because !mUserUnlocked");
}
@@ -876,6 +905,6 @@
@VisibleForTesting
public Context getWindowContext() {
- return mContext;
+ return mWindowContext;
}
}