From f21953666ddc644c5cf4996a682ec00a2820d0ba Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Thu, 31 Jan 2019 18:20:11 -0800 Subject: Fix deferring making activities active New logic for checking whether activities should be made active did not take into account deferring resume during launch. This lead to making activity resumed before actually launching it, and top-resumed state change callback was ignored on the client side since activity was not registered on the client yet. This in turn made the client think that it was never made top-resumed before loosing the top-resumed position. Bug: 123587738 Test: atest WmTests:ActivityRecordTests#testShouldMakeActive_deferredResume Change-Id: Ieb3b98b4ddb4819805fa0e818ecf8359487eaaff --- services/core/java/com/android/server/wm/ActivityRecord.java | 8 +++++++- .../src/com/android/server/wm/ActivityRecordTests.java | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index aa0c62c65973..38e8785b0692 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2065,7 +2065,8 @@ final class ActivityRecord extends ConfigurationContainer { * - should be either the topmost in task, or right below the top activity that is finishing * If all of these conditions are not met at the same time, the activity cannot be made active. */ - private boolean shouldMakeActive(ActivityRecord activeActivity) { + @VisibleForTesting + boolean shouldMakeActive(ActivityRecord activeActivity) { // If the activity is stopped, stopping, cycle to an active state. We avoid doing // this when there is an activity waiting to become translucent as the extra binder // calls will lead to noticeable jank. A later call to @@ -2080,6 +2081,11 @@ final class ActivityRecord extends ConfigurationContainer { return false; } + if (!mStackSupervisor.readyToResume()) { + // Making active is currently deferred (e.g. because an activity launch is in progress). + return false; + } + if (this.mLaunchTaskBehind) { // This activity is being launched from behind, which means that it's not intended to be // presented to user right now, even if it's set to be visible. diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 319ffed3778c..f1506a0ebc22 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -368,4 +368,15 @@ public class ActivityRecordTests extends ActivityTestsBase { verify(mService.getLifecycleManager()).scheduleTransaction(eq(mActivity.app.getThread()), eq(mActivity.appToken), eq(expected)); } + + @Test + public void testShouldMakeActive_deferredResume() { + mActivity.setState(ActivityStack.ActivityState.STOPPED, "Testing"); + + mSupervisor.beginDeferResume(); + assertEquals(false, mActivity.shouldMakeActive(null /* activeActivity */)); + + mSupervisor.endDeferResume(); + assertEquals(true, mActivity.shouldMakeActive(null /* activeActivity */)); + } } -- cgit v1.2.3-59-g8ed1b