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

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

AM: Fix activity launch metrics for already visible activities 1/2

For a windowing mode, when an activity is launched, AML starts
measuring the delay until it is notified that an activity has drawn
and a app transition has started. If the activity is behind a floating
or translucent app, then AML will not receive a windows drawn
notification and the measurements will continue.
When another activity is launched, the first activity is treated as a
trampoline activity and the metrics are logged against the new
activity. This can cause long delay timings for hot launches.

Handle this case by discarding the metrics if a launching activity
is already visible.

Test: atest CtsActivityManagerDeviceTestCases:ActivityMetricsLoggerTests
Bug: b/117148004
Change-Id: I6985099d3126db634d630897d2bced360f0c73d3
parent d449ee6b
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ import com.android.server.LocalServices;
 * data for Tron, logcat, event logs and {@link android.app.WaitResult}.
 *
 * Tests:
 * atest SystemMetricsFunctionalTests
 * atest CtsActivityManagerDeviceTestCases:ActivityMetricsLoggerTests
 */
class ActivityMetricsLogger {

@@ -351,18 +351,24 @@ class ActivityMetricsLogger {
                + " processRunning=" + processRunning
                + " processSwitch=" + processSwitch);

        // If we are already in an existing transition, only update the activity name, but not the
        // other attributes.
        final int windowingMode = launchedActivity != null
                ? launchedActivity.getWindowingMode()
                : WINDOWING_MODE_UNDEFINED;

        final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
        if (mCurrentTransitionStartTime == INVALID_START_TIME) {
            // No transition is active ignore this launch.
            return;
        }

        if (launchedActivity != null && launchedActivity.nowVisible) {
            // Launched activity is already visible. We cannot measure windows drawn delay.
            reset(true /* abort */, info);
            return;
        }

        final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
        if (launchedActivity != null && info != null) {
            // If we are already in an existing transition, only update the activity name, but not
            // the other attributes.
            info.launchedActivity = launchedActivity;
            return;
        }
@@ -371,7 +377,6 @@ class ActivityMetricsLogger {
                mWindowingModeTransitionInfo.size() > 0 && info == null;
        if ((!isLoggableResultCode(resultCode) || launchedActivity == null || !processSwitch
                || windowingMode == WINDOWING_MODE_UNDEFINED) && !otherWindowModesLaunching) {

            // Failed to launch or it was not a process switch, so we don't care about the timing.
            reset(true /* abort */, info);
            return;