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
This commit is contained in:
Andrii Kulian
2019-01-31 18:20:11 -08:00
parent 8b7275695a
commit f21953666d
2 changed files with 18 additions and 1 deletions

View File

@@ -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.

View File

@@ -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 */));
}
}