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

Commit d15063bb authored by Vishnu Nair's avatar Vishnu Nair
Browse files

[AML] Check if launched activity has changed when handling visibility changes

The trampoline activity launches a new activity and becomes invisible. AML receives a visibility
changed notification for the trampoline activity and activity launching notification. If the
intent is not resolved, and the activity is not launched before the visibility change is processed,
AML will incorrectly cancel the app transition since it does not know if the app will ever draw on
screen.

This change checks if the launched activity has changed when handling the visibility change
notification.

Bug: 134694123
Test: atest ActivityMetricsLoggerTests
Test: repro steps in bug
Change-Id: I10744323b971ba709afa506e804d458de22c44e5
parent 445d7b38
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -544,9 +544,26 @@ class ActivityMetricsLogger {

            // If we have an active transition that's waiting on a certain activity that will be
            // invisible now, we'll never get onWindowsDrawn, so abort the transition if necessary.
            if (info != null && !hasVisibleNonFinishingActivity(t)) {
                if (DEBUG_METRICS) Slog.i(TAG, "notifyVisibilityChanged to invisible"
                        + " activity=" + r);

            // We have no active transitions.
            if (info == null) {
                return;
            }

            // The notified activity whose visibility changed is no longer the launched activity.
            // We can still wait to get onWindowsDrawn.
            if (info.launchedActivity != r) {
                return;
            }

            // Check if there is any activity in the task that is visible and not finishing. If the
            // launched activity finished before it is drawn and if there is another activity in
            // the task then that activity will be draw on screen.
            if (hasVisibleNonFinishingActivity(t)) {
                return;
            }

            if (DEBUG_METRICS) Slog.i(TAG, "notifyVisibilityChanged to invisible activity=" + r);
            logAppTransitionCancel(info);
            mWindowingModeTransitionInfo.remove(r.getWindowingMode());
            if (mWindowingModeTransitionInfo.size() == 0) {
@@ -554,7 +571,6 @@ class ActivityMetricsLogger {
            }
        }
    }
    }

    /**
     * Notifies the tracker that we called immediately before we call bindApplication on the client.