Merge "Track latency of user switch journey" into sc-v2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
e5d0befd2c
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user