From 7318d63ba6dbb3042907d10d5369fcd5ac444d67 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Wed, 20 Jul 2016 18:59:28 -0700 Subject: [PATCH] Correctly finish activity in non-focused stack When activity is finished we first looked for next activity to show in focused stack. If real next activity to show in place of finishing one is in the same non-focused stack, we didn't fully complete the dismissal process and activity was stuck in FINISHING state. This CL checks if we're trying to finish visible activity in paused state and destroy it immediately if top running activity is visible - same as we do for pinned activities. Bug: 29458854 Change-Id: I0d5ceb2daa45c0628d89417c8456e132996bcea9 --- .../core/java/com/android/server/am/ActivityStack.java | 9 ++++++++- .../com/android/server/am/ActivityStackSupervisor.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 752dbd95c4c29..5a6614074002e 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3562,11 +3562,18 @@ final class ActivityStack { if (mode == FINISH_IMMEDIATELY || (prevState == ActivityState.PAUSED - && (mode == FINISH_AFTER_PAUSE || mStackId == PINNED_STACK_ID)) + && (mode == FINISH_AFTER_PAUSE || mode == FINISH_AFTER_VISIBLE + || mStackId == PINNED_STACK_ID)) || prevState == ActivityState.STOPPED || prevState == ActivityState.INITIALIZING) { r.makeFinishingLocked(); boolean activityRemoved = destroyActivityLocked(r, true, "finish-imm"); + + if (prevState == ActivityState.PAUSED && mode == FINISH_AFTER_VISIBLE) { + // Finishing activity that was in paused state - this can happen if it was in + // not currently focused stack. Need to make something visible in its place. + mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); + } if (activityRemoved) { mStackSupervisor.resumeFocusedStackTopActivityLocked(); } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index c16fc62d1177c..e31df57f56d4e 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1051,7 +1051,7 @@ public final class ActivityStackSupervisor implements DisplayListener { return r; } - // Return to the home stack. + // Look in other non-focused and non-home stacks. final ArrayList stacks = mHomeStack.mStacks; for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = stacks.get(stackNdx);