From cc56871d71bd46d933d99c9ae14925430956ad6e Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Fri, 8 Mar 2019 14:54:41 +0800 Subject: [PATCH] Ensure activity display with an empty stack can be released The activities in home stack was destroyed/removed and resulted in an empty home stack. Activity display was leaked due to it had an empty home stack left which prevented it from being released. Making sure activity display with an empty home stack can also be released. Also fixed an issue that home activity was not being resumed due to early return in recursively resuming top activities. Bug: 126747441 Test: atest ActivityManagerMultiDisplayTests Change-Id: I243fab507268f81df0a8067883157d63f0f79c22 --- .../java/com/android/server/wm/ActivityDisplay.java | 12 +++++++++++- .../java/com/android/server/wm/ActivityStack.java | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java index a33b454d51dca..9d6efb4f76cbb 100644 --- a/services/core/java/com/android/server/wm/ActivityDisplay.java +++ b/services/core/java/com/android/server/wm/ActivityDisplay.java @@ -1173,7 +1173,17 @@ class ActivityDisplay extends ConfigurationContainer } private void releaseSelfIfNeeded() { - if (mStacks.isEmpty() && mRemoved) { + if (!mRemoved || mDisplayContent == null) { + return; + } + + final ActivityStack stack = mStacks.size() == 1 ? mStacks.get(0) : null; + if (stack != null && stack.isActivityTypeHome() && stack.getAllTasks().isEmpty()) { + // Release this display if an empty home stack is the only thing left. + // Since it is the last stack, this display will be released along with the stack + // removal. + stack.remove(); + } else if (mStacks.isEmpty()) { mDisplayContent.removeIfPossible(); mDisplayContent = null; mRootActivityContainer.removeChild(this); diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index ad989704b823d..4c9b80be5d7c3 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -3053,7 +3053,17 @@ class ActivityStack extends ConfigurationContainer { ActivityOptions.abort(options); if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityInNextFocusableStack: " + reason + ", go home"); - return mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId); + if (isActivityTypeHome()) { + // resumeTopActivityUncheckedLocked has been prevented to run recursively. Post a + // runnable to resume home since we are currently in the process of resuming top + // activity in home stack. + // See {@link #mInResumeTopActivity}. + mService.mH.post( + () -> mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId)); + return true; + } else { + return mRootActivityContainer.resumeHomeActivity(prev, reason, mDisplayId); + } } /** Returns the position the input task should be placed in this stack. */