Clear invisible undrawn activities when reporting drawn

There may have initializing activities put in the same launch stack
without state and visibility change. The case happens when using
startActivities to start multiple activities at once.

Without clearing the invisible pending draw activities, the launch
event cannot end to report launch time and stop trace.

Bug: 196917563
Bug: 192043869
Test: ActivityMetricsLaunchObserverTests#testConsecutiveLaunch
Change-Id: If511a1526b803455a967f6bc1358a23e15a4234d
This commit is contained in:
Riddle Hsu
2021-08-23 21:54:44 +08:00
parent ca7eb3f9ad
commit a3beedb37e
2 changed files with 11 additions and 0 deletions

View File

@@ -703,6 +703,7 @@ class ActivityMetricsLogger {
// Always calculate the delay because the caller may need to know the individual drawn time.
info.mWindowsDrawnDelayMs = info.calculateDelay(timestampNs);
info.removePendingDrawActivity(r);
info.updatePendingDraw(false /* keepInitializing */);
final TransitionInfoSnapshot infoSnapshot = new TransitionInfoSnapshot(info);
if (info.mLoggedTransitionStarting && info.allDrawn()) {
done(false /* abort */, info, "notifyWindowsDrawn - all windows drawn", timestampNs);

View File

@@ -475,6 +475,16 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
transitToDrawnAndVerifyOnLaunchFinished(mTopActivity);
}
@Test
public void testConsecutiveLaunch() {
mTrampolineActivity.setState(ActivityRecord.State.INITIALIZING, "test");
onActivityLaunched(mTrampolineActivity);
mActivityMetricsLogger.notifyActivityLaunching(mTopActivity.intent,
mTrampolineActivity /* caller */, mTrampolineActivity.getUid());
notifyActivityLaunched(START_SUCCESS, mTopActivity);
transitToDrawnAndVerifyOnLaunchFinished(mTopActivity);
}
@Test
public void testConsecutiveLaunchNewTask() {
final IBinder launchCookie = mock(IBinder.class);