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

Commit 13fdfd28 authored by Louis Chang's avatar Louis Chang
Browse files

Allows propagating launch cookies to next launching visible activity

The launch cookie failed to pass to the next launching activity because
the metrics logger was aborted early while the next launching activity
was already visible.

Bug: 433389861
Test: ActivityMetricsLaunchObserverTests
Flag: EXEMPT bugfix
Change-Id: Icbfa8a6b1b7a107ddc64c6d34e10ff794a82800b
parent 0e81c75a
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -749,12 +749,6 @@ class ActivityMetricsLogger {
                    + " newActivityCreated=" + newActivityCreated + " info=" + info);
        }

        if (launchedActivity.isReportedDrawn() && launchedActivity.isVisible()) {
            // Launched activity is already visible. We cannot measure windows drawn delay.
            abort(launchingState, "launched activity already visible");
            return;
        }

        // If the launched activity is started from an existing active transition, it will be put
        // into the transition info.
        if (info != null && info.canCoalesce(launchedActivity)) {
@@ -777,6 +771,11 @@ class ActivityMetricsLogger {
                startLaunchTrace(info);
            }
            scheduleCheckActivityToBeDrawnIfSleeping(launchedActivity);
            abortIfAlreadyVisible(launchedActivity, launchingState);
            return;
        }

        if (abortIfAlreadyVisible(launchedActivity, launchingState)) {
            return;
        }

@@ -824,6 +823,19 @@ class ActivityMetricsLogger {
        }
    }

    /**
     * Returns {@code true} if the launched activity is already visible, indicating that window
     * draw delay cannot be measured and the operation should be aborted.
     */
    private boolean abortIfAlreadyVisible(@NonNull ActivityRecord launchedActivity,
            @NonNull LaunchingState launchingState) {
        if (launchedActivity.isReportedDrawn() && launchedActivity.isVisible()) {
            abort(launchingState, "launched activity already visible");
            return true;
        }
        return false;
    }

    /**
     * Updates all transition infos including the given {@param info} if they are a part of a
     * split pair launch.
+34 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.wm;

import static android.app.ActivityManager.START_DELIVERED_TO_TOP;
import static android.app.ActivityManager.START_SUCCESS;
import static android.app.ActivityManager.START_TASK_TO_FRONT;
import static android.content.ComponentName.createRelative;
@@ -563,6 +564,39 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
                activityOnNewTask.mLaunchRootTask).isEqualTo(launchRootTask);
    }

    @Test
    public void testConsecutiveLaunchVisibleTaskCancelled_hasDrawn() {
        final ActivityRecord activityOnNewTask = new ActivityBuilder(mAtm)
                .setCreateTask(true)
                .build();
        onActivityLaunched(activityOnNewTask);
        activityOnNewTask.setVisibleRequested(true);
        doReturn(true).when(activityOnNewTask).isReportedDrawn();
        final IBinder launchCookie = mock(IBinder.class);
        final WindowContainerToken launchRootTask = mock(WindowContainerToken.class);
        mTrampolineActivity.setIsNoDisplay(true);
        mTrampolineActivity.mLaunchCookie = launchCookie;
        mTrampolineActivity.mLaunchRootTask = launchRootTask;
        onActivityLaunched(mTrampolineActivity);
        mActivityMetricsLogger.notifyActivityLaunching(activityOnNewTask.intent,
                mTrampolineActivity /* caller */, mTrampolineActivity.getUid());
        notifyActivityLaunched(START_DELIVERED_TO_TOP, activityOnNewTask);

        verifyAsync(mLaunchObserver).onActivityLaunchCancelled(
                eqLastStartedId(mTrampolineActivity));
        verifyNoMoreInteractions(mLaunchObserver);

        // Ensure that the trampoline's cookie still transferred.
        assertWithMessage("Trampoline's cookie must be transferred").that(
                mTrampolineActivity.mLaunchCookie).isNull();
        assertWithMessage("The last launch task has the transferred cookie").that(
                activityOnNewTask.mLaunchCookie).isEqualTo(launchCookie);
        assertWithMessage("Trampoline's launch root task must be transferred").that(
                mTrampolineActivity.mLaunchRootTask).isNull();
        assertWithMessage("The last launch task has the transferred launch root task").that(
                activityOnNewTask.mLaunchRootTask).isEqualTo(launchRootTask);
    }

    @Test
    public void testConsecutiveLaunchOnDifferentDisplay() {
        onActivityLaunched(mTopActivity);