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

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

Do not abort launch logger by invisible drawn activity

For a special complex case: A no-display trampoline activity
launches main activity in the same task (no starting window),
and then the main activity launches trampoline and main again
consecutively. If the drawn event of main is reported before
the 2nd launch of main, the launch event log will be canceled
by seeing the drawn state before transition.

Because there will be a transition to commit window visibility,
the case can be addressed by allowing invisible drawn activity
as a valid launch event. Then the launch time can be reported
when notifying transition starting.

Bug: 176687862
Test: ActivityMetricsLaunchObserverTests#testActivityDrawnBeforeTransition

Change-Id: I81ec1695038216490537bdac6defcd9e6d75e1f8
parent 8af09844
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -288,7 +288,7 @@ class ActivityMetricsLogger {
                return;
            }
            mLastLaunchedActivity = r;
            if (!r.noDisplay) {
            if (!r.noDisplay && !r.isReportedDrawn()) {
                if (DEBUG_METRICS) Slog.i(TAG, "Add pending draw " + r);
                mPendingDrawActivities.add(r);
            }
@@ -576,7 +576,7 @@ class ActivityMetricsLogger {
                    + " processSwitch=" + processSwitch + " info=" + info);
        }

        if (launchedActivity.isReportedDrawn()) {
        if (launchedActivity.isReportedDrawn() && launchedActivity.isVisible()) {
            // Launched activity is already visible. We cannot measure windows drawn delay.
            abort(info, "launched activity already visible");
            return;
+16 −0
Original line number Diff line number Diff line
@@ -350,6 +350,22 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
        verifyNoMoreInteractions(mLaunchObserver);
    }

    @Test
    public void testActivityDrawnBeforeTransition() {
        mTopActivity.setVisible(false);
        notifyActivityLaunching(mTopActivity.intent);
        // Assume the activity is launched the second time consecutively. The drawn event is from
        // the first time (omitted in test) launch that is earlier than transition.
        doReturn(true).when(mTopActivity).isReportedDrawn();
        notifyWindowsDrawn(mTopActivity);
        notifyActivityLaunched(START_SUCCESS, mTopActivity);
        // If the launching activity was drawn when starting transition, the launch event should
        // be reported successfully.
        notifyTransitionStarting(mTopActivity);

        verifyOnActivityLaunchFinished(mTopActivity);
    }

    @Test
    public void testActivityRecordProtoIsNotTooBig() {
        // The ActivityRecordProto must not be too big, otherwise converting it at runtime