Do not notify transition finish for a initializing activity

Because startActivity always collects the launch activity to
transition participants, it may contain some records that are
not actual handled by transition.

For example, when launching activity under dream, because
dream activity has top z-order, the launching activity will
use mLaunchTaskBehind to be visible.
The z-order:
 Top TaskD DreamActivity
     TaskX B <-INITIALIZING
           A (Trampoline which launches B)
There might be a no-op transition triggered by A. If the
transition clears B's mLaunchTaskBehind, then after A is paused
B won't continue to resume.

Fix: 279647026
Test: TransitionTests#testIntermediateVisibility

Change-Id: Id0615c2bc6cbea1adb94e866db85567cdf514326
This commit is contained in:
Riddle Hsu
2023-06-02 00:37:40 +08:00
parent 25aa2d3c87
commit 27142d6215
2 changed files with 15 additions and 1 deletions

View File

@@ -1191,7 +1191,11 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
// processed all the participants first (in particular, we want to trigger pip-enter first)
for (int i = 0; i < mParticipants.size(); ++i) {
final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord();
if (ar != null) {
// If the activity was just inserted to an invisible task, it will keep INITIALIZING
// state. Then no need to notify the callback to avoid clearing some states
// unexpectedly, e.g. launch-task-behind.
if (ar != null && (ar.isVisibleRequested()
|| !ar.isState(ActivityRecord.State.INITIALIZING))) {
mController.dispatchLegacyAppTransitionFinished(ar);
}
}

View File

@@ -1346,6 +1346,16 @@ public class TransitionTests extends WindowTestsBase {
activity1.setVisible(false);
abortTransition.abort();
assertTrue(activity1.isVisible());
// The mLaunchTaskBehind flag of an invisible initializing activity should not be cleared.
final Transition noChangeTransition = controller.createTransition(TRANSIT_OPEN);
noChangeTransition.collect(activity1);
activity1.setVisibleRequested(false);
activity1.setState(ActivityRecord.State.INITIALIZING, "test");
activity1.mLaunchTaskBehind = true;
mWm.mSyncEngine.abort(noChangeTransition.getSyncId());
noChangeTransition.finishTransition();
assertTrue(activity1.mLaunchTaskBehind);
}
@Test