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

Commit e5d0befd authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Track latency of user switch journey" into sc-v2-dev

parents 349f251a 54adb0f8
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -117,6 +117,11 @@ public class LatencyTracker {
     */
    public static final int ACTION_LOCKSCREEN_UNLOCK = 11;

    /**
     * Time it takes to switch users.
     */
    public static final int ACTION_USER_SWITCH = 12;

    private static final int[] ACTIONS_ALL = {
        ACTION_EXPAND_PANEL,
        ACTION_TOGGLE_RECENTS,
@@ -129,7 +134,8 @@ public class LatencyTracker {
        ACTION_START_RECENTS_ANIMATION,
        ACTION_ROTATE_SCREEN_SENSOR,
        ACTION_ROTATE_SCREEN_CAMERA_CHECK,
        ACTION_LOCKSCREEN_UNLOCK
        ACTION_LOCKSCREEN_UNLOCK,
        ACTION_USER_SWITCH
    };

    /** @hide */
@@ -145,7 +151,8 @@ public class LatencyTracker {
        ACTION_START_RECENTS_ANIMATION,
        ACTION_ROTATE_SCREEN_SENSOR,
        ACTION_ROTATE_SCREEN_CAMERA_CHECK,
        ACTION_LOCKSCREEN_UNLOCK
        ACTION_LOCKSCREEN_UNLOCK,
        ACTION_USER_SWITCH
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface Action {
@@ -163,7 +170,8 @@ public class LatencyTracker {
            FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_START_RECENTS_ANIMATION,
            FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_SENSOR,
            FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_CAMERA_CHECK,
            FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_LOCKSCREEN_UNLOCK
            FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_LOCKSCREEN_UNLOCK,
            FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_USER_SWITCH
    };

    private static LatencyTracker sLatencyTracker;
@@ -247,6 +255,8 @@ public class LatencyTracker {
                return "ACTION_ROTATE_SCREEN_SENSOR";
            case 12:
                return "ACTION_LOCKSCREEN_UNLOCK";
            case 13:
                return "ACTION_USER_SWITCH";
            default:
                throw new IllegalArgumentException("Invalid action");
        }
@@ -424,7 +434,7 @@ public class LatencyTracker {
            // start counting timeout.
            mTimeoutRunnable = timeoutAction;
            BackgroundThread.getHandler()
                    .postDelayed(mTimeoutRunnable, TimeUnit.SECONDS.toMillis(2));
                    .postDelayed(mTimeoutRunnable, TimeUnit.SECONDS.toMillis(15));
        }

        void end() {
+6 −2
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ import androidx.lifecycle.Observer;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.WirelessUtils;
import com.android.settingslib.fuelgauge.BatteryStatus;
@@ -314,6 +315,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
    private final DevicePolicyManager mDevicePolicyManager;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final InteractionJankMonitor mInteractionJankMonitor;
    private final LatencyTracker mLatencyTracker;
    private boolean mLogoutEnabled;
    // cached value to avoid IPCs
    private boolean mIsUdfpsEnrolled;
@@ -1740,8 +1742,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
            AuthController authController,
            TelephonyListenerManager telephonyListenerManager,
            FeatureFlags featureFlags,
            InteractionJankMonitor interactionJankMonitor
    ) {
            InteractionJankMonitor interactionJankMonitor,
            LatencyTracker latencyTracker) {
        mContext = context;
        mSubscriptionManager = SubscriptionManager.from(context);
        mTelephonyListenerManager = telephonyListenerManager;
@@ -1750,6 +1752,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
        mBackgroundExecutor = backgroundExecutor;
        mBroadcastDispatcher = broadcastDispatcher;
        mInteractionJankMonitor = interactionJankMonitor;
        mLatencyTracker = latencyTracker;
        mRingerModeTracker = ringerModeTracker;
        mStatusBarStateController = statusBarStateController;
        mStatusBarStateController.addCallback(mStatusBarStateControllerListener);
@@ -2605,6 +2608,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
            }
        }
        mInteractionJankMonitor.end(InteractionJankMonitor.CUJ_USER_SWITCH);
        mLatencyTracker.onActionEnd(LatencyTracker.ACTION_USER_SWITCH);
    }

    /**
+5 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.systemui.Dumpable;
import com.android.systemui.GuestResumeSessionReceiver;
@@ -128,6 +129,7 @@ public class UserSwitcherController implements Dumpable {
    private final TelephonyListenerManager mTelephonyListenerManager;
    private final IActivityTaskManager mActivityTaskManager;
    private final InteractionJankMonitor mInteractionJankMonitor;
    private final LatencyTracker mLatencyTracker;

    private ArrayList<UserRecord> mUsers = new ArrayList<>();
    @VisibleForTesting
@@ -174,6 +176,7 @@ public class UserSwitcherController implements Dumpable {
            SecureSettings secureSettings,
            @Background Executor bgExecutor,
            InteractionJankMonitor interactionJankMonitor,
            LatencyTracker latencyTracker,
            DumpManager dumpManager) {
        mContext = context;
        mActivityManager = activityManager;
@@ -184,6 +187,7 @@ public class UserSwitcherController implements Dumpable {
        mUiEventLogger = uiEventLogger;
        mFalsingManager = falsingManager;
        mInteractionJankMonitor = interactionJankMonitor;
        mLatencyTracker = latencyTracker;
        mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(
                this, mUserTracker, mUiEventLogger, secureSettings);
        mUserDetailAdapter = userDetailAdapter;
@@ -499,6 +503,7 @@ public class UserSwitcherController implements Dumpable {
            mInteractionJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
                    .withView(InteractionJankMonitor.CUJ_USER_SWITCH, mRootView)
                    .setTimeout(MULTI_USER_JOURNEY_TIMEOUT));
            mLatencyTracker.onActionStart(LatencyTracker.ACTION_USER_SWITCH);
            pauseRefreshUsers();
            mActivityManager.switchUser(id);
        } catch (RemoteException e) {
+6 −2
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ import androidx.lifecycle.Observer;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.ILockSettings;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor.BiometricAuthenticated;
@@ -172,6 +173,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
    private FeatureFlags mFeatureFlags;
    @Mock
    private InteractionJankMonitor mInteractionJankMonitor;
    @Mock
    private LatencyTracker mLatencyTracker;
    @Captor
    private ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor;
    // Direct executor
@@ -741,7 +744,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
            public void sendResult(Bundle data) {} // do nothing
        };
        mKeyguardUpdateMonitor.handleUserSwitchComplete(10 /* user */);
        verify(mInteractionJankMonitor).end(eq(InteractionJankMonitor.CUJ_USER_SWITCH));
        verify(mInteractionJankMonitor).end(InteractionJankMonitor.CUJ_USER_SWITCH);
        verify(mLatencyTracker).onActionEnd(LatencyTracker.ACTION_USER_SWITCH);
    }

    @Test
@@ -1059,7 +1063,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
                    mRingerModeTracker, mBackgroundExecutor,
                    mStatusBarStateController, mLockPatternUtils,
                    mAuthController, mTelephonyListenerManager, mFeatureFlags,
                    mInteractionJankMonitor);
                    mInteractionJankMonitor, mLatencyTracker);
            setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker);
        }

+4 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.testing.TestableLooper
import androidx.test.filters.SmallTest
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.internal.util.LatencyTracker
import com.android.internal.util.UserIcons
import com.android.systemui.GuestResumeSessionReceiver
import com.android.systemui.R
@@ -83,6 +84,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
    @Mock private lateinit var falsingManager: FalsingManager
    @Mock private lateinit var dumpManager: DumpManager
    @Mock private lateinit var interactionJankMonitor: InteractionJankMonitor
    @Mock private lateinit var latencyTracker: LatencyTracker
    private lateinit var testableLooper: TestableLooper
    private lateinit var uiBgExecutor: FakeExecutor
    private lateinit var uiEventLogger: UiEventLoggerFake
@@ -132,6 +134,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
                secureSettings,
                uiBgExecutor,
                interactionJankMonitor,
                latencyTracker,
                dumpManager)
        userSwitcherController.mPauseRefreshUsers = true

@@ -156,6 +159,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
        userSwitcherController.onUserListItemClicked(emptyGuestUserRecord)
        testableLooper.processAllMessages()
        verify(interactionJankMonitor).begin(any())
        verify(latencyTracker).onActionStart(LatencyTracker.ACTION_USER_SWITCH)
        verify(activityManager).switchUser(guestInfo.id)
        assertEquals(1, uiEventLogger.numLogs())
        assertEquals(QSUserSwitcherEvent.QS_USER_GUEST_ADD.id, uiEventLogger.eventId(0))