From d7de004c85e7cae9933ef5a0b4d60ba02763e2ab Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Thu, 25 Feb 2021 12:53:05 +0800 Subject: [PATCH] Clear launch root tasks when WM shell is killed SysUI crashed repeatedly after toggle SystemUIGX when legacy split-screen enabled. NPE was thrown whenever SysUI restarted because the WM Core was unable to add child tasks to the launch root tasks which already being removed from the WM hierarchy. Bug: 180581256 Test: toggle SystemUIGX in split-screen Change-Id: Iede701f8eccfbe726e72273c36bf789e22780d9f --- .../core/java/com/android/server/wm/Task.java | 4 ++++ .../android/server/wm/TaskDisplayArea.java | 24 ++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 80173b5942e65..68f5c58b4761d 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -5058,6 +5058,10 @@ class Task extends WindowContainer { } } else { // No longer managed by any organizer. + final TaskDisplayArea taskDisplayArea = getDisplayArea(); + if (taskDisplayArea != null) { + taskDisplayArea.removeLaunchRootTask(this); + } setForceHidden(FLAG_FORCE_HIDDEN_FOR_TASK_ORG, false /* set */); if (mCreatedByOrganizer) { removeImmediately("setTaskOrganizer"); diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index badd7fda28974..76869e548fced 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1135,12 +1135,7 @@ final class TaskDisplayArea extends DisplayArea { "Can't set not mCreatedByOrganizer as launch root tr=" + rootTask); } - LaunchRootTaskDef def = null; - for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) { - if (mLaunchRootTasks.get(i).task.mTaskId != rootTask.mTaskId) continue; - def = mLaunchRootTasks.get(i); - } - + LaunchRootTaskDef def = getLaunchRootTaskDef(rootTask); if (def != null) { // Remove so we add to the end of the list. mLaunchRootTasks.remove(def); @@ -1156,6 +1151,23 @@ final class TaskDisplayArea extends DisplayArea { } } + void removeLaunchRootTask(Task rootTask) { + LaunchRootTaskDef def = getLaunchRootTaskDef(rootTask); + if (def != null) { + mLaunchRootTasks.remove(def); + } + } + + private @Nullable LaunchRootTaskDef getLaunchRootTaskDef(Task rootTask) { + LaunchRootTaskDef def = null; + for (int i = mLaunchRootTasks.size() - 1; i >= 0; --i) { + if (mLaunchRootTasks.get(i).task.mTaskId != rootTask.mTaskId) continue; + def = mLaunchRootTasks.get(i); + break; + } + return def; + } + Task getLaunchRootTask(int windowingMode, int activityType, ActivityOptions options) { // Try to use the launch root task in options if available. if (options != null) {