Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb628a53 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix invalid launch state reported to "am start -W"

If a launching activity starts another activity before it
finishes drawing, because it becomes invisible, it is dropped
from active transition info. The waiting result should not use
the intermediate state as the launch is completed.

Bug: 123355661
Bug: 149326995
Test: atest ActivityMetricsLoggerTests#testConsecutiveLaunch
Change-Id: I9a5776cc7895a8d62ca28700c18efa4fd8b7c33d
parent 71153912
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -581,6 +581,9 @@ class ActivityMetricsLogger {

    /**
     * Notifies the tracker that all windows of the app have been drawn.
     *
     * @return Non-null info if the activity was pending to draw, otherwise it might have been set
     *         to invisible (removed from active transition) or it was already drawn.
     */
    @Nullable
    TransitionInfoSnapshot notifyWindowsDrawn(@NonNull ActivityRecord r, long timestampNs) {
+11 −5
Original line number Diff line number Diff line
@@ -5201,11 +5201,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        }
        final TransitionInfoSnapshot info = mStackSupervisor
                .getActivityMetricsLogger().notifyWindowsDrawn(this, timestampNs);
        final int windowsDrawnDelayMs = info != null ? info.windowsDrawnDelayMs : INVALID_DELAY;
        final @LaunchState int launchState = info != null ? info.getLaunchState() : -1;
        final boolean validInfo = info != null;
        final int windowsDrawnDelayMs = validInfo ? info.windowsDrawnDelayMs : INVALID_DELAY;
        final @LaunchState int launchState = validInfo ? info.getLaunchState() : -1;
        // The activity may have been requested to be invisible (another activity has been launched)
        // so there is no valid info. But if it is the current top activity (e.g. sleeping), the
        // invalid state is still reported to make sure the waiting result is notified.
        if (validInfo || this == mDisplayContent.topRunningActivity()) {
            mStackSupervisor.reportActivityLaunchedLocked(false /* timeout */, this,
                    windowsDrawnDelayMs, launchState);
            mStackSupervisor.stopWaitingForActivityVisible(this, windowsDrawnDelayMs);
        }
        finishLaunchTickingLocked();
        if (task != null) {
            task.hasBeenVisible = true;