From 4a46a92e39b867b3e6910cea9c7a5ef15726f4fc Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Tue, 9 Jun 2020 11:23:29 +0200 Subject: [PATCH] Fix unexpected closure of the bubble. WindowManager calls ATMS#notifySingleTaskDisplayEmpty to notify that the last task is removed from a single task display. Originally it was called from ActivityStack when Tsak is removed, but while merging ActivityStack and Task, CL[1] moved the call to Task. As a result, the lister gets notification when ActivityRecord is removed, instead of a last Task is removed, which causes unexpected bubble closure. [1]: Ifb167129c89a3aba11796daa21a9dee7200913ca Bug: 157067689 Test: atest TaskStackChangedListnerTest Change-Id: I93b745ba7fd1bb2fbef7915ddff2316100813187 --- .../core/java/com/android/server/wm/Task.java | 15 ++++-------- services/tests/wmtests/AndroidManifest.xml | 2 ++ .../wm/TaskStackChangedListenerTest.java | 23 ++++++++++++++++++- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 3ee7ee7a42760..ce2ae2a420696 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1436,15 +1436,6 @@ class Task extends WindowContainer { mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged(); } - final boolean isRootTask = isRootTask(); - if (isRootTask) { - final DisplayContent display = getDisplayContent(); - if (display.isSingleTaskInstance()) { - mAtmService.notifySingleTaskDisplayEmpty(display.mDisplayId); - } - display.mDisplayContent.setLayoutNeeded(); - } - if (hasChild()) { updateEffectiveIntent(); @@ -1465,7 +1456,7 @@ class Task extends WindowContainer { } else if (!mReuseTask && !mCreatedByOrganizer) { // Remove entire task if it doesn't have any activity left and it isn't marked for reuse // or created by task organizer. - if (!isRootTask) { + if (!isRootTask()) { getStack().removeChild(this, reason); } EventLogTags.writeWmTaskRemoved(mTaskId, @@ -2817,6 +2808,10 @@ class Task extends WindowContainer { if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); EventLogTags.writeWmTaskRemoved(mTaskId, "removeTask"); + if (mDisplayContent != null && mDisplayContent.isSingleTaskInstance()) { + mAtmService.notifySingleTaskDisplayEmpty(mDisplayContent.mDisplayId); + } + // If applicable let the TaskOrganizer know the Task is vanishing. setTaskOrganizer(null); diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml index 30df0d4b4ad91..4040fa6a675e2 100644 --- a/services/tests/wmtests/AndroidManifest.xml +++ b/services/tests/wmtests/AndroidManifest.xml @@ -54,6 +54,8 @@ +