Merge "Track latency of user switch journey" into sc-v2-dev am: e5d0befd2c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16049167 Change-Id: Ic59af9e1e2fbd2175ba00a3e470079adf5e83b9d
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user