Merge "Add multi-user jank monitoring" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-09-29 22:31:47 +00:00
committed by Android (Google) Code Review
7 changed files with 66 additions and 5 deletions

View File

@@ -59,6 +59,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_ROW_SWIPE; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_ROW_SWIPE;
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_SCROLL_FLING; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_SCROLL_FLING;
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP;
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__USER_SWITCH;
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__WALLPAPER_TRANSITION; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__WALLPAPER_TRANSITION;
import android.annotation.IntDef; import android.annotation.IntDef;
@@ -171,6 +172,7 @@ public class InteractionJankMonitor {
public static final int CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP = 34; public static final int CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP = 34;
public static final int CUJ_PIP_TRANSITION = 35; public static final int CUJ_PIP_TRANSITION = 35;
public static final int CUJ_WALLPAPER_TRANSITION = 36; public static final int CUJ_WALLPAPER_TRANSITION = 36;
public static final int CUJ_USER_SWITCH = 37;
private static final int NO_STATSD_LOGGING = -1; private static final int NO_STATSD_LOGGING = -1;
@@ -216,6 +218,7 @@ public class InteractionJankMonitor {
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP,
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__PIP_TRANSITION, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__PIP_TRANSITION,
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__WALLPAPER_TRANSITION, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__WALLPAPER_TRANSITION,
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__USER_SWITCH,
}; };
private static volatile InteractionJankMonitor sInstance; private static volatile InteractionJankMonitor sInstance;
@@ -272,6 +275,7 @@ public class InteractionJankMonitor {
CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP, CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP,
CUJ_PIP_TRANSITION, CUJ_PIP_TRANSITION,
CUJ_WALLPAPER_TRANSITION, CUJ_WALLPAPER_TRANSITION,
CUJ_USER_SWITCH,
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface CujType { public @interface CujType {
@@ -642,6 +646,8 @@ public class InteractionJankMonitor {
return "PIP_TRANSITION"; return "PIP_TRANSITION";
case CUJ_WALLPAPER_TRANSITION: case CUJ_WALLPAPER_TRANSITION:
return "WALLPAPER_TRANSITION"; return "WALLPAPER_TRANSITION";
case CUJ_USER_SWITCH:
return "USER_SWITCH";
} }
return "UNKNOWN"; return "UNKNOWN";
} }

View File

@@ -90,6 +90,7 @@ import androidx.annotation.Nullable;
import androidx.lifecycle.Observer; 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.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;
@@ -321,6 +322,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private boolean mIsDreaming; private boolean mIsDreaming;
private final DevicePolicyManager mDevicePolicyManager; private final DevicePolicyManager mDevicePolicyManager;
private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher;
private final InteractionJankMonitor mInteractionJankMonitor;
private boolean mLogoutEnabled; private boolean mLogoutEnabled;
// cached value to avoid IPCs // cached value to avoid IPCs
private boolean mIsUdfpsEnrolled; private boolean mIsUdfpsEnrolled;
@@ -1770,6 +1772,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
AuthController authController, AuthController authController,
TelephonyListenerManager telephonyListenerManager, TelephonyListenerManager telephonyListenerManager,
FeatureFlags featureFlags, FeatureFlags featureFlags,
InteractionJankMonitor interactionJankMonitor,
@Nullable Vibrator vibrator) { @Nullable Vibrator vibrator) {
mContext = context; mContext = context;
mSubscriptionManager = SubscriptionManager.from(context); mSubscriptionManager = SubscriptionManager.from(context);
@@ -1778,6 +1781,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged); mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged);
mBackgroundExecutor = backgroundExecutor; mBackgroundExecutor = backgroundExecutor;
mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher;
mInteractionJankMonitor = interactionJankMonitor;
mRingerModeTracker = ringerModeTracker; mRingerModeTracker = ringerModeTracker;
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
mStatusBarStateController.addCallback(mStatusBarStateControllerListener); mStatusBarStateController.addCallback(mStatusBarStateControllerListener);
@@ -2637,7 +2641,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
/** /**
* Handle {@link #MSG_USER_SWITCH_COMPLETE} * Handle {@link #MSG_USER_SWITCH_COMPLETE}
*/ */
private void handleUserSwitchComplete(int userId) { @VisibleForTesting
void handleUserSwitchComplete(int userId) {
Assert.isMainThread(); Assert.isMainThread();
for (int i = 0; i < mCallbacks.size(); i++) { for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -2645,6 +2650,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
cb.onUserSwitchComplete(userId); cb.onUserSwitchComplete(userId);
} }
} }
mInteractionJankMonitor.end(InteractionJankMonitor.CUJ_USER_SWITCH);
} }
/** /**

View File

@@ -74,6 +74,7 @@ import android.view.inputmethod.InputMethodManager;
import com.android.internal.app.IBatteryStats; import com.android.internal.app.IBatteryStats;
import com.android.internal.appwidget.IAppWidgetService; import com.android.internal.appwidget.IAppWidgetService;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.LatencyTracker; import com.android.internal.util.LatencyTracker;
import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.DisplayId;
@@ -218,6 +219,12 @@ public class FrameworkServicesModule {
return context.getSystemService(FingerprintManager.class); return context.getSystemService(FingerprintManager.class);
} }
@Provides
@Singleton
static InteractionJankMonitor provideInteractionJankMonitor() {
return InteractionJankMonitor.getInstance();
}
@Provides @Provides
@Singleton @Singleton
static InputMethodManager provideInputMethodManager(Context context) { static InputMethodManager provideInputMethodManager(Context context) {

View File

@@ -1145,6 +1145,8 @@ public class StatusBar extends SystemUI implements
mNotificationPanelViewController.addExpansionListener( mNotificationPanelViewController.addExpansionListener(
this::dispatchPanelExpansionForKeyguardDismiss); this::dispatchPanelExpansionForKeyguardDismiss);
mUserSwitcherController.init(mNotificationShadeWindowView);
// Allow plugins to reference DarkIconDispatcher and StatusBarStateController // Allow plugins to reference DarkIconDispatcher and StatusBarStateController
mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class); mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class);
mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class); mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class);

View File

@@ -25,6 +25,7 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.IActivityManager;
import android.app.IActivityTaskManager; import android.app.IActivityTaskManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -55,6 +56,7 @@ import android.view.WindowManagerGlobal;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
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.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
@@ -75,6 +77,7 @@ import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.qs.QSUserSwitcherEvent; import com.android.systemui.qs.QSUserSwitcherEvent;
import com.android.systemui.qs.tiles.UserDetailView; import com.android.systemui.qs.tiles.UserDetailView;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.user.CreateUserActivity; import com.android.systemui.user.CreateUserActivity;
@@ -107,6 +110,7 @@ public class UserSwitcherController implements Dumpable {
private static final int PAUSE_REFRESH_USERS_TIMEOUT_MS = 3000; private static final int PAUSE_REFRESH_USERS_TIMEOUT_MS = 3000;
private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF"; private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF";
private static final long MULTI_USER_JOURNEY_TIMEOUT = 20000l;
protected final Context mContext; protected final Context mContext;
protected final UserTracker mUserTracker; protected final UserTracker mUserTracker;
@@ -123,6 +127,7 @@ public class UserSwitcherController implements Dumpable {
private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher;
private final TelephonyListenerManager mTelephonyListenerManager; private final TelephonyListenerManager mTelephonyListenerManager;
private final IActivityTaskManager mActivityTaskManager; private final IActivityTaskManager mActivityTaskManager;
private final InteractionJankMonitor mInteractionJankMonitor;
private ArrayList<UserRecord> mUsers = new ArrayList<>(); private ArrayList<UserRecord> mUsers = new ArrayList<>();
@VisibleForTesting @VisibleForTesting
@@ -141,15 +146,18 @@ public class UserSwitcherController implements Dumpable {
private Intent mSecondaryUserServiceIntent; private Intent mSecondaryUserServiceIntent;
private SparseBooleanArray mForcePictureLoadForUserId = new SparseBooleanArray(2); private SparseBooleanArray mForcePictureLoadForUserId = new SparseBooleanArray(2);
private final UiEventLogger mUiEventLogger; private final UiEventLogger mUiEventLogger;
private final IActivityManager mActivityManager;
public final DetailAdapter mUserDetailAdapter; public final DetailAdapter mUserDetailAdapter;
private final Executor mBgExecutor; private final Executor mBgExecutor;
private final boolean mGuestUserAutoCreated; private final boolean mGuestUserAutoCreated;
private final AtomicBoolean mGuestIsResetting; private final AtomicBoolean mGuestIsResetting;
private final AtomicBoolean mGuestCreationScheduled; private final AtomicBoolean mGuestCreationScheduled;
private FalsingManager mFalsingManager; private FalsingManager mFalsingManager;
private NotificationShadeWindowView mRootView;
@Inject @Inject
public UserSwitcherController(Context context, public UserSwitcherController(Context context,
IActivityManager activityManager,
UserManager userManager, UserManager userManager,
UserTracker userTracker, UserTracker userTracker,
KeyguardStateController keyguardStateController, KeyguardStateController keyguardStateController,
@@ -165,14 +173,17 @@ public class UserSwitcherController implements Dumpable {
UserDetailAdapter userDetailAdapter, UserDetailAdapter userDetailAdapter,
SecureSettings secureSettings, SecureSettings secureSettings,
@Background Executor bgExecutor, @Background Executor bgExecutor,
InteractionJankMonitor interactionJankMonitor,
DumpManager dumpManager) { DumpManager dumpManager) {
mContext = context; mContext = context;
mActivityManager = activityManager;
mUserTracker = userTracker; mUserTracker = userTracker;
mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher;
mTelephonyListenerManager = telephonyListenerManager; mTelephonyListenerManager = telephonyListenerManager;
mActivityTaskManager = activityTaskManager; mActivityTaskManager = activityTaskManager;
mUiEventLogger = uiEventLogger; mUiEventLogger = uiEventLogger;
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mInteractionJankMonitor = interactionJankMonitor;
mGuestResumeSessionReceiver = new GuestResumeSessionReceiver( mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(
this, mUserTracker, mUiEventLogger, secureSettings); this, mUserTracker, mUiEventLogger, secureSettings);
mUserDetailAdapter = userDetailAdapter; mUserDetailAdapter = userDetailAdapter;
@@ -485,8 +496,11 @@ public class UserSwitcherController implements Dumpable {
protected void switchToUserId(int id) { protected void switchToUserId(int id) {
try { try {
mInteractionJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
.withView(InteractionJankMonitor.CUJ_USER_SWITCH, mRootView)
.setTimeout(MULTI_USER_JOURNEY_TIMEOUT));
pauseRefreshUsers(); pauseRefreshUsers();
ActivityManager.getService().switchUser(id); mActivityManager.switchUser(id);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Couldn't switch user.", e); Log.e(TAG, "Couldn't switch user.", e);
} }
@@ -793,6 +807,10 @@ public class UserSwitcherController implements Dumpable {
return guest.id; return guest.id;
} }
public void init(NotificationShadeWindowView notificationShadeWindowView) {
mRootView = notificationShadeWindowView;
}
public static abstract class BaseUserAdapter extends BaseAdapter { public static abstract class BaseUserAdapter extends BaseAdapter {
final UserSwitcherController mController; final UserSwitcherController mController;

View File

@@ -78,6 +78,7 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer; 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.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.widget.ILockSettings; import com.android.internal.widget.ILockSettings;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
@@ -171,6 +172,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
@Mock @Mock
private FeatureFlags mFeatureFlags; private FeatureFlags mFeatureFlags;
@Mock @Mock
private InteractionJankMonitor mInteractionJankMonitor;
@Mock
private Vibrator mVibrator; private Vibrator mVibrator;
@Captor @Captor
private ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor; private ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateListenerCaptor;
@@ -736,6 +739,16 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
assertThat(mKeyguardUpdateMonitor.mUserFaceAuthenticated.size()).isEqualTo(0); assertThat(mKeyguardUpdateMonitor.mUserFaceAuthenticated.size()).isEqualTo(0);
} }
@Test
public void testMultiUserJankMonitor_whenUserSwitches() throws Exception {
final IRemoteCallback reply = new IRemoteCallback.Stub() {
@Override
public void sendResult(Bundle data) {} // do nothing
};
mKeyguardUpdateMonitor.handleUserSwitchComplete(10 /* user */);
verify(mInteractionJankMonitor).end(eq(InteractionJankMonitor.CUJ_USER_SWITCH));
}
@Test @Test
public void testGetUserCanSkipBouncer_whenTrust() { public void testGetUserCanSkipBouncer_whenTrust() {
int user = KeyguardUpdateMonitor.getCurrentUser(); int user = KeyguardUpdateMonitor.getCurrentUser();
@@ -1051,7 +1064,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
mRingerModeTracker, mBackgroundExecutor, mRingerModeTracker, mBackgroundExecutor,
mStatusBarStateController, mLockPatternUtils, mStatusBarStateController, mLockPatternUtils,
mAuthController, mTelephonyListenerManager, mFeatureFlags, mAuthController, mTelephonyListenerManager, mFeatureFlags,
mVibrator); mInteractionJankMonitor, mVibrator);
setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker);
} }

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.policy package com.android.systemui.statusbar.policy
import android.app.IActivityManager
import android.app.IActivityTaskManager import android.app.IActivityTaskManager
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.Context import android.content.Context
@@ -31,6 +32,7 @@ import android.os.UserManager
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.testing.TestableLooper import android.testing.TestableLooper
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
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.UserIcons import com.android.internal.util.UserIcons
import com.android.systemui.GuestResumeSessionReceiver import com.android.systemui.GuestResumeSessionReceiver
@@ -54,10 +56,11 @@ import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.eq import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.any import org.mockito.Mockito.any
import org.mockito.Mockito.anyString import org.mockito.Mockito.anyString
import org.mockito.Mockito.mock import org.mockito.Mockito.mock
import org.mockito.Mockito.`when` import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class)
@@ -65,6 +68,7 @@ import org.mockito.MockitoAnnotations
@SmallTest @SmallTest
class UserSwitcherControllerTest : SysuiTestCase() { class UserSwitcherControllerTest : SysuiTestCase() {
@Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var keyguardStateController: KeyguardStateController
@Mock private lateinit var activityManager: IActivityManager
@Mock private lateinit var deviceProvisionedController: DeviceProvisionedController @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController
@Mock private lateinit var devicePolicyManager: DevicePolicyManager @Mock private lateinit var devicePolicyManager: DevicePolicyManager
@Mock private lateinit var handler: Handler @Mock private lateinit var handler: Handler
@@ -78,6 +82,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
@Mock private lateinit var secureSettings: SecureSettings @Mock private lateinit var secureSettings: SecureSettings
@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
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
@@ -110,6 +115,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
userSwitcherController = UserSwitcherController( userSwitcherController = UserSwitcherController(
context, context,
activityManager,
userManager, userManager,
userTracker, userTracker,
keyguardStateController, keyguardStateController,
@@ -125,6 +131,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
userDetailAdapter, userDetailAdapter,
secureSettings, secureSettings,
uiBgExecutor, uiBgExecutor,
interactionJankMonitor,
dumpManager) dumpManager)
userSwitcherController.mPauseRefreshUsers = true userSwitcherController.mPauseRefreshUsers = true
@@ -132,7 +139,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
} }
@Test @Test
fun testAddGuest_okButtonPressed_isLogged() { fun testAddGuest_okButtonPressed() {
val emptyGuestUserRecord = UserSwitcherController.UserRecord( val emptyGuestUserRecord = UserSwitcherController.UserRecord(
null, null,
null, null,
@@ -148,6 +155,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
userSwitcherController.onUserListItemClicked(emptyGuestUserRecord) userSwitcherController.onUserListItemClicked(emptyGuestUserRecord)
testableLooper.processAllMessages() testableLooper.processAllMessages()
verify(interactionJankMonitor).begin(any())
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))
} }