Loading services/core/java/com/android/server/wm/ActivityMetricsLogger.java +18 −6 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -777,6 +771,11 @@ class ActivityMetricsLogger { startLaunchTrace(info); } scheduleCheckActivityToBeDrawnIfSleeping(launchedActivity); abortIfAlreadyVisible(launchedActivity, launchingState); return; } if (abortIfAlreadyVisible(launchedActivity, launchingState)) { return; } Loading Loading @@ -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. Loading services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +34 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading
services/core/java/com/android/server/wm/ActivityMetricsLogger.java +18 −6 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -777,6 +771,11 @@ class ActivityMetricsLogger { startLaunchTrace(info); } scheduleCheckActivityToBeDrawnIfSleeping(launchedActivity); abortIfAlreadyVisible(launchedActivity, launchingState); return; } if (abortIfAlreadyVisible(launchedActivity, launchingState)) { return; } Loading Loading @@ -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. Loading
services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +34 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading