[CD Projected Mode] Make Taskbars for Detected displays on Boot when Connected

Make Taskbars for Detected displays on Boot when Connected.

Bug: 409820188
Flag: com.android.window.flags.enable_taskbar_connected_displays
Test: m
Change-Id: Iac04fe3c5ba8faac7383ed2953ddee99240ce016
This commit is contained in:
Sukesh Ram
2025-04-10 13:22:07 -07:00
committed by Ajinkya Chalke
parent c496829044
commit 90af684118
@@ -112,6 +112,7 @@ import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringJoiner;
import java.util.concurrent.ConcurrentHashMap;
@@ -156,6 +157,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
// TODO: Remove this during the connected displays lifecycle refactor.
private final Context mPrimaryWindowContext;
private final WindowManager mPrimaryWindowManager;
private final DisplayManager mDisplayManager;
private TaskbarNavButtonController mPrimaryNavButtonController;
private ComponentCallbacks mPrimaryComponentCallbacks;
@@ -270,7 +272,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
// This listens to any Task, so we filter them by the ones shown in the launcher.
// For Tasks restored after startup, they will by default not be Perceptible, and no
// need to until user interacts with it by bringing it to the foreground.
for (Map.Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
// get pinned tasks - we care about all tasks, not just the one moved to the front
Set<Integer> taskbarPinnedTasks =
entry.getValue().getControllers().taskbarViewController
@@ -294,7 +296,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
*/
@Override
public void onRecentTaskListUpdated() {
for (Map.Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (GroupTask gTask : entry.getValue().getControllers()
.taskbarRecentAppsController.getShownTasks()) {
for (Task task : gTask.getTasks()) {
@@ -329,7 +331,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
new DesktopVisibilityController.TaskbarDesktopModeListener() {
@Override
public void onExitDesktopMode(int duration) {
for (Map.Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
int displayId = entry.getKey();
if (isExternalDisplay(displayId)) {
continue;
@@ -351,7 +353,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
@Override
public void onEnterDesktopMode(int duration) {
for (Map.Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
int displayId = entry.getKey();
if (isExternalDisplay(displayId)) {
continue;
@@ -455,6 +457,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
// Set up primary display.
debugPrimaryTaskbar("TaskbarManager constructor");
mDisplayManager = mBaseContext.getSystemService(DisplayManager.class);
mPrimaryWindowContext = createWindowContext(mPrimaryDisplayId);
mPrimaryWindowManager = mPrimaryWindowContext.getSystemService(WindowManager.class);
DesktopVisibilityController.INSTANCE.get(
@@ -508,10 +511,24 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
mTaskStackListener = null;
}
addWindowContextToMap(mPrimaryDisplayId, mPrimaryWindowContext);
recreateTaskbars();
recreateTaskbarForDisplay(mPrimaryDisplayId, /* duration= */ 0);
// TODO b/408503553: Remove when WM is used instead of CommandQueue for system decorations.
addSystemDecorationForDisplaysAtBoot();
debugPrimaryTaskbar("TaskbarManager created");
}
/** Calls {@link #onDisplayAddSystemDecorations(int)} for all displays. */
private void addSystemDecorationForDisplaysAtBoot() {
if (mDisplayManager == null) {
return;
}
for (Display display : mDisplayManager.getDisplays()) {
onDisplayAddSystemDecorations(display.getDisplayId());
}
}
public LooperExecutor getPerWindowUiExecutor() {
return mPerWindowUiExecutor;
}
@@ -542,7 +559,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
private void destroyAllTaskbars() {
debugPrimaryTaskbar("destroyAllTaskbars");
for (Map.Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry : new ArraySet<>(mTaskbars.entrySet())) {
int displayId = entry.getKey();
debugTaskbarManager("destroyAllTaskbars: call destroyTaskbarForDisplay", displayId);
destroyTaskbarForDisplay(entry.getValue());
@@ -638,7 +655,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
}
recreateTaskbars();
for (Map.Entry<Integer, TaskbarActivityContext> entry: mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry: mTaskbars.entrySet()) {
int displayId = entry.getKey();
debugTaskbarManager("onUserUnlocked: addTaskbarRootViewToWindow()", displayId);
addTaskbarRootViewToWindow(entry.getValue());
@@ -1000,8 +1017,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
if (newWindowContext != null) {
debugTaskbarManager("onDisplayAddSystemDecorations: add new windowContext to map!",
displayId);
addWindowContextToMap(displayId, newWindowContext);
WindowManager wm = getWindowManager(displayId);
WindowManager wm = newWindowContext.getSystemService(WindowManager.class);
if (wm == null || !wm.shouldShowSystemDecors(displayId)) {
String wmStatus = wm == null ? "WindowManager is null!" : "WindowManager exists";
boolean showDecor = wm != null && wm.shouldShowSystemDecors(displayId);
@@ -1010,6 +1026,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
+ showDecor, displayId);
return;
}
addWindowContextToMap(displayId, newWindowContext);
debugTaskbarManager("onDisplayAddSystemDecorations: creating RootLayout!", displayId);
createExternalDeviceProfile(displayId);
@@ -1154,7 +1171,7 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
public void dumpLogs(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskbarManager:");
// iterate through taskbars and do the dump for each
for (Map.Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
for (Entry<Integer, TaskbarActivityContext> entry : mTaskbars.entrySet()) {
int displayId = entry.getKey();
TaskbarActivityContext taskbar = entry.getValue();
pw.println(prefix + "\tTaskbar at display " + displayId + ":");
@@ -1602,19 +1619,18 @@ public class TaskbarManagerImpl implements DisplayDecorationListener {
}
private @Nullable Display getDisplay(int displayId) {
DisplayManager displayManager = mBaseContext.getSystemService(DisplayManager.class);
if (displayManager == null) {
if (mDisplayManager == null) {
debugTaskbarManager("cannot get DisplayManager", displayId);
return null;
}
Display display = displayManager.getDisplay(displayId);
Display display = mDisplayManager.getDisplay(displayId);
if (display == null) {
debugTaskbarManager("Cannot get display!", displayId);
return null;
}
return displayManager.getDisplay(displayId);
return mDisplayManager.getDisplay(displayId);
}
/**