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

This commit is contained in:
TreeHugger Robot
2021-10-18 21:45:15 +00:00
committed by Android (Google) Code Review
5 changed files with 35 additions and 8 deletions

View File

@@ -117,6 +117,11 @@ public class LatencyTracker {
*/ */
public static final int ACTION_LOCKSCREEN_UNLOCK = 11; 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 = { private static final int[] ACTIONS_ALL = {
ACTION_EXPAND_PANEL, ACTION_EXPAND_PANEL,
ACTION_TOGGLE_RECENTS, ACTION_TOGGLE_RECENTS,
@@ -129,7 +134,8 @@ public class LatencyTracker {
ACTION_START_RECENTS_ANIMATION, ACTION_START_RECENTS_ANIMATION,
ACTION_ROTATE_SCREEN_SENSOR, ACTION_ROTATE_SCREEN_SENSOR,
ACTION_ROTATE_SCREEN_CAMERA_CHECK, ACTION_ROTATE_SCREEN_CAMERA_CHECK,
ACTION_LOCKSCREEN_UNLOCK ACTION_LOCKSCREEN_UNLOCK,
ACTION_USER_SWITCH
}; };
/** @hide */ /** @hide */
@@ -145,7 +151,8 @@ public class LatencyTracker {
ACTION_START_RECENTS_ANIMATION, ACTION_START_RECENTS_ANIMATION,
ACTION_ROTATE_SCREEN_SENSOR, ACTION_ROTATE_SCREEN_SENSOR,
ACTION_ROTATE_SCREEN_CAMERA_CHECK, ACTION_ROTATE_SCREEN_CAMERA_CHECK,
ACTION_LOCKSCREEN_UNLOCK ACTION_LOCKSCREEN_UNLOCK,
ACTION_USER_SWITCH
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface Action { 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_START_RECENTS_ANIMATION,
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_SENSOR, 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_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; private static LatencyTracker sLatencyTracker;
@@ -247,6 +255,8 @@ public class LatencyTracker {
return "ACTION_ROTATE_SCREEN_SENSOR"; return "ACTION_ROTATE_SCREEN_SENSOR";
case 12: case 12:
return "ACTION_LOCKSCREEN_UNLOCK"; return "ACTION_LOCKSCREEN_UNLOCK";
case 13:
return "ACTION_USER_SWITCH";
default: default:
throw new IllegalArgumentException("Invalid action"); throw new IllegalArgumentException("Invalid action");
} }
@@ -424,7 +434,7 @@ public class LatencyTracker {
// start counting timeout. // start counting timeout.
mTimeoutRunnable = timeoutAction; mTimeoutRunnable = timeoutAction;
BackgroundThread.getHandler() BackgroundThread.getHandler()
.postDelayed(mTimeoutRunnable, TimeUnit.SECONDS.toMillis(2)); .postDelayed(mTimeoutRunnable, TimeUnit.SECONDS.toMillis(15));
} }
void end() { void end() {

View File

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

View File

@@ -59,6 +59,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.GuestResumeSessionReceiver; import com.android.systemui.GuestResumeSessionReceiver;
@@ -128,6 +129,7 @@ public class UserSwitcherController implements Dumpable {
private final TelephonyListenerManager mTelephonyListenerManager; private final TelephonyListenerManager mTelephonyListenerManager;
private final IActivityTaskManager mActivityTaskManager; private final IActivityTaskManager mActivityTaskManager;
private final InteractionJankMonitor mInteractionJankMonitor; private final InteractionJankMonitor mInteractionJankMonitor;
private final LatencyTracker mLatencyTracker;
private ArrayList<UserRecord> mUsers = new ArrayList<>(); private ArrayList<UserRecord> mUsers = new ArrayList<>();
@VisibleForTesting @VisibleForTesting
@@ -174,6 +176,7 @@ public class UserSwitcherController implements Dumpable {
SecureSettings secureSettings, SecureSettings secureSettings,
@Background Executor bgExecutor, @Background Executor bgExecutor,
InteractionJankMonitor interactionJankMonitor, InteractionJankMonitor interactionJankMonitor,
LatencyTracker latencyTracker,
DumpManager dumpManager) { DumpManager dumpManager) {
mContext = context; mContext = context;
mActivityManager = activityManager; mActivityManager = activityManager;
@@ -184,6 +187,7 @@ public class UserSwitcherController implements Dumpable {
mUiEventLogger = uiEventLogger; mUiEventLogger = uiEventLogger;
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mInteractionJankMonitor = interactionJankMonitor; mInteractionJankMonitor = interactionJankMonitor;
mLatencyTracker = latencyTracker;
mGuestResumeSessionReceiver = new GuestResumeSessionReceiver( mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(
this, mUserTracker, mUiEventLogger, secureSettings); this, mUserTracker, mUiEventLogger, secureSettings);
mUserDetailAdapter = userDetailAdapter; mUserDetailAdapter = userDetailAdapter;
@@ -499,6 +503,7 @@ public class UserSwitcherController implements Dumpable {
mInteractionJankMonitor.begin(InteractionJankMonitor.Configuration.Builder mInteractionJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
.withView(InteractionJankMonitor.CUJ_USER_SWITCH, mRootView) .withView(InteractionJankMonitor.CUJ_USER_SWITCH, mRootView)
.setTimeout(MULTI_USER_JOURNEY_TIMEOUT)); .setTimeout(MULTI_USER_JOURNEY_TIMEOUT));
mLatencyTracker.onActionStart(LatencyTracker.ACTION_USER_SWITCH);
pauseRefreshUsers(); pauseRefreshUsers();
mActivityManager.switchUser(id); mActivityManager.switchUser(id);
} catch (RemoteException e) { } catch (RemoteException e) {

View File

@@ -79,6 +79,7 @@ import androidx.lifecycle.Observer;
import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.dx.mockito.inline.extended.ExtendedMockito;
import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.ILockSettings; import com.android.internal.widget.ILockSettings;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor.BiometricAuthenticated; import com.android.keyguard.KeyguardUpdateMonitor.BiometricAuthenticated;
@@ -172,6 +173,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
private FeatureFlags mFeatureFlags; private FeatureFlags mFeatureFlags;
@Mock @Mock
private InteractionJankMonitor mInteractionJankMonitor; private InteractionJankMonitor mInteractionJankMonitor;
@Mock
private LatencyTracker mLatencyTracker;
@Captor @Captor
private ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor; private ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor;
// Direct executor // Direct executor
@@ -741,7 +744,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
public void sendResult(Bundle data) {} // do nothing public void sendResult(Bundle data) {} // do nothing
}; };
mKeyguardUpdateMonitor.handleUserSwitchComplete(10 /* user */); 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 @Test
@@ -1059,7 +1063,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
mRingerModeTracker, mBackgroundExecutor, mRingerModeTracker, mBackgroundExecutor,
mStatusBarStateController, mLockPatternUtils, mStatusBarStateController, mLockPatternUtils,
mAuthController, mTelephonyListenerManager, mFeatureFlags, mAuthController, mTelephonyListenerManager, mFeatureFlags,
mInteractionJankMonitor); mInteractionJankMonitor, mLatencyTracker);
setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker);
} }

View File

@@ -34,6 +34,7 @@ import android.testing.TestableLooper
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.jank.InteractionJankMonitor import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.testing.UiEventLoggerFake import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.internal.util.LatencyTracker
import com.android.internal.util.UserIcons import com.android.internal.util.UserIcons
import com.android.systemui.GuestResumeSessionReceiver import com.android.systemui.GuestResumeSessionReceiver
import com.android.systemui.R import com.android.systemui.R
@@ -83,6 +84,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
@Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var falsingManager: FalsingManager
@Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var dumpManager: DumpManager
@Mock private lateinit var interactionJankMonitor: InteractionJankMonitor @Mock private lateinit var interactionJankMonitor: InteractionJankMonitor
@Mock private lateinit var latencyTracker: LatencyTracker
private lateinit var testableLooper: TestableLooper private lateinit var testableLooper: TestableLooper
private lateinit var uiBgExecutor: FakeExecutor private lateinit var uiBgExecutor: FakeExecutor
private lateinit var uiEventLogger: UiEventLoggerFake private lateinit var uiEventLogger: UiEventLoggerFake
@@ -132,6 +134,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
secureSettings, secureSettings,
uiBgExecutor, uiBgExecutor,
interactionJankMonitor, interactionJankMonitor,
latencyTracker,
dumpManager) dumpManager)
userSwitcherController.mPauseRefreshUsers = true userSwitcherController.mPauseRefreshUsers = true
@@ -156,6 +159,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
userSwitcherController.onUserListItemClicked(emptyGuestUserRecord) userSwitcherController.onUserListItemClicked(emptyGuestUserRecord)
testableLooper.processAllMessages() testableLooper.processAllMessages()
verify(interactionJankMonitor).begin(any()) verify(interactionJankMonitor).begin(any())
verify(latencyTracker).onActionStart(LatencyTracker.ACTION_USER_SWITCH)
verify(activityManager).switchUser(guestInfo.id) verify(activityManager).switchUser(guestInfo.id)
assertEquals(1, uiEventLogger.numLogs()) assertEquals(1, uiEventLogger.numLogs())
assertEquals(QSUserSwitcherEvent.QS_USER_GUEST_ADD.id, uiEventLogger.eventId(0)) assertEquals(QSUserSwitcherEvent.QS_USER_GUEST_ADD.id, uiEventLogger.eventId(0))