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:
@@ -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.
|
||||
|
||||
@@ -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 */));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user