diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ee33d48768c5b..fcc81da4e5908 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3529,6 +3529,12 @@
false
+
+ false
+
Remove guest
+
+ Reset guest
Guest
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 93ce8f3c2a96f..83dbad1677aa7 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1148,12 +1148,18 @@
Remove guest?
+
+ Reset guest?
+
All apps and data in this session will be deleted.
Remove
+
+ Reset
+
Welcome back, guest!
diff --git a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java
index 45a0ea19c8dc8..0ae89bc102902 100644
--- a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java
@@ -27,15 +27,14 @@ import android.content.IntentFilter;
import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.os.UserManager;
import android.provider.Settings;
import android.util.Log;
-import android.view.WindowManagerGlobal;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.qs.QSUserSwitcherEvent;
import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
/**
* Manages notification when a guest session is resumed.
@@ -47,9 +46,12 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
private static final String SETTING_GUEST_HAS_LOGGED_IN = "systemui.guest_has_logged_in";
private Dialog mNewSessionDialog;
+ private final UserSwitcherController mUserSwitcherController;
private final UiEventLogger mUiEventLogger;
- public GuestResumeSessionReceiver(UiEventLogger uiEventLogger) {
+ public GuestResumeSessionReceiver(UserSwitcherController userSwitcherController,
+ UiEventLogger uiEventLogger) {
+ mUserSwitcherController = userSwitcherController;
mUiEventLogger = uiEventLogger;
}
@@ -90,7 +92,8 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
int notFirstLogin = Settings.System.getIntForUser(
cr, SETTING_GUEST_HAS_LOGGED_IN, 0, userId);
if (notFirstLogin != 0) {
- mNewSessionDialog = new ResetSessionDialog(context, mUiEventLogger, userId);
+ mNewSessionDialog = new ResetSessionDialog(context, mUserSwitcherController,
+ mUiEventLogger, userId);
mNewSessionDialog.show();
} else {
Settings.System.putIntForUser(
@@ -99,54 +102,6 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
}
}
- /**
- * Wipes the guest session.
- *
- * The guest must be the current user and its id must be {@param userId}.
- */
- private static void wipeGuestSession(Context context, int userId) {
- UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
- UserInfo currentUser;
- try {
- currentUser = ActivityManager.getService().getCurrentUser();
- } catch (RemoteException e) {
- Log.e(TAG, "Couldn't wipe session because ActivityManager is dead");
- return;
- }
- if (currentUser.id != userId) {
- Log.w(TAG, "User requesting to start a new session (" + userId + ")"
- + " is not current user (" + currentUser.id + ")");
- return;
- }
- if (!currentUser.isGuest()) {
- Log.w(TAG, "User requesting to start a new session (" + userId + ")"
- + " is not a guest");
- return;
- }
-
- boolean marked = userManager.markGuestForDeletion(currentUser.id);
- if (!marked) {
- Log.w(TAG, "Couldn't mark the guest for deletion for user " + userId);
- return;
- }
- UserInfo newGuest = userManager.createGuest(context, currentUser.name);
-
- try {
- if (newGuest == null) {
- Log.e(TAG, "Could not create new guest, switching back to system user");
- ActivityManager.getService().switchUser(UserHandle.USER_SYSTEM);
- userManager.removeUser(currentUser.id);
- WindowManagerGlobal.getWindowManagerService().lockNow(null /* options */);
- return;
- }
- ActivityManager.getService().switchUser(newGuest.id);
- userManager.removeUser(currentUser.id);
- } catch (RemoteException e) {
- Log.e(TAG, "Couldn't wipe session because ActivityManager or WindowManager is dead");
- return;
- }
- }
-
private void cancelDialog() {
if (mNewSessionDialog != null && mNewSessionDialog.isShowing()) {
mNewSessionDialog.cancel();
@@ -160,10 +115,12 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
private static final int BUTTON_WIPE = BUTTON_NEGATIVE;
private static final int BUTTON_DONTWIPE = BUTTON_POSITIVE;
+ private final UserSwitcherController mUserSwitcherController;
private final UiEventLogger mUiEventLogger;
private final int mUserId;
- ResetSessionDialog(Context context, UiEventLogger uiEventLogger, int userId) {
+ ResetSessionDialog(Context context, UserSwitcherController userSwitcherController,
+ UiEventLogger uiEventLogger, int userId) {
super(context);
setTitle(context.getString(R.string.guest_wipe_session_title));
@@ -175,6 +132,7 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
setButton(BUTTON_DONTWIPE,
context.getString(R.string.guest_wipe_session_dontwipe), this);
+ mUserSwitcherController = userSwitcherController;
mUiEventLogger = uiEventLogger;
mUserId = userId;
}
@@ -183,7 +141,7 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
public void onClick(DialogInterface dialog, int which) {
if (which == BUTTON_WIPE) {
mUiEventLogger.log(QSUserSwitcherEvent.QS_USER_GUEST_WIPE);
- wipeGuestSession(getContext(), mUserId);
+ mUserSwitcherController.removeGuestUser(mUserId, UserHandle.USER_NULL);
dismiss();
} else if (which == BUTTON_DONTWIPE) {
mUiEventLogger.log(QSUserSwitcherEvent.QS_USER_GUEST_CONTINUE);
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 327698392ac73..88e9f69620ed0 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -119,6 +119,7 @@ import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.util.DeviceConfigProxy;
import java.io.FileDescriptor;
@@ -257,6 +258,9 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
/** TrustManager for letting it know when we change visibility */
private final TrustManager mTrustManager;
+ /** UserSwitcherController for creating guest user on boot complete */
+ private final UserSwitcherController mUserSwitcherController;
+
/**
* Used to keep the device awake while to ensure the keyguard finishes opening before
* we sleep.
@@ -805,6 +809,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
KeyguardUpdateMonitor keyguardUpdateMonitor, DumpManager dumpManager,
@UiBackground Executor uiBgExecutor, PowerManager powerManager,
TrustManager trustManager,
+ UserSwitcherController userSwitcherController,
DeviceConfigProxy deviceConfig,
NavigationModeController navigationModeController,
KeyguardDisplayManager keyguardDisplayManager,
@@ -825,6 +830,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
mUpdateMonitor = keyguardUpdateMonitor;
mPM = powerManager;
mTrustManager = trustManager;
+ mUserSwitcherController = userSwitcherController;
mKeyguardDisplayManager = keyguardDisplayManager;
dumpManager.registerDumpable(getClass().getName(), this);
mDeviceConfig = deviceConfig;
@@ -2558,6 +2564,11 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
@Override
public void onBootCompleted() {
synchronized (this) {
+ if (mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_guestUserAutoCreated)) {
+ // TODO(b/191067027): Move post-boot guest creation to system_server
+ mUserSwitcherController.guaranteeGuestPresent();
+ }
mBootCompleted = true;
adjustStatusBarLocked(false, true);
if (mBootSendUserPresent) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
index 05d1361c3ab83..8a383b974d77b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
@@ -54,6 +54,7 @@ import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.settings.GlobalSettings;
@@ -92,6 +93,7 @@ public class KeyguardModule {
DumpManager dumpManager,
PowerManager powerManager,
TrustManager trustManager,
+ UserSwitcherController userSwitcherController,
@UiBackground Executor uiBgExecutor,
DeviceConfigProxy deviceConfig,
NavigationModeController navigationModeController,
@@ -114,6 +116,7 @@ public class KeyguardModule {
uiBgExecutor,
powerManager,
trustManager,
+ userSwitcherController,
deviceConfig,
navigationModeController,
keyguardDisplayManager,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 5c440173e547b..1ebb9ddc02624 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -21,6 +21,7 @@ import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import static com.android.systemui.DejankUtils.whitelistIpcs;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.Dialog;
import android.app.IActivityTaskManager;
@@ -48,6 +49,7 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowManagerGlobal;
import android.widget.BaseAdapter;
import com.android.internal.annotations.VisibleForTesting;
@@ -63,6 +65,7 @@ import com.android.systemui.SystemUISecondaryUserService;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.qs.QSUserSwitcherEvent;
@@ -76,6 +79,8 @@ import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
import javax.inject.Inject;
import javax.inject.Provider;
@@ -123,23 +128,35 @@ public class UserSwitcherController implements Dumpable {
private SparseBooleanArray mForcePictureLoadForUserId = new SparseBooleanArray(2);
private final UiEventLogger mUiEventLogger;
public final DetailAdapter mUserDetailAdapter;
+ private final Executor mUiBgExecutor;
+ private final boolean mGuestUserAutoCreated;
+ private final AtomicBoolean mGuestCreationScheduled;
@Inject
- public UserSwitcherController(Context context, KeyguardStateController keyguardStateController,
- @Main Handler handler, ActivityStarter activityStarter,
- BroadcastDispatcher broadcastDispatcher, UiEventLogger uiEventLogger,
+ public UserSwitcherController(Context context,
+ KeyguardStateController keyguardStateController,
+ @Main Handler handler,
+ ActivityStarter activityStarter,
+ BroadcastDispatcher broadcastDispatcher,
+ UiEventLogger uiEventLogger,
TelephonyListenerManager telephonyListenerManager,
- IActivityTaskManager activityTaskManager, UserDetailAdapter userDetailAdapter) {
+ IActivityTaskManager activityTaskManager,
+ UserDetailAdapter userDetailAdapter,
+ @UiBackground Executor uiBgExecutor) {
mContext = context;
mBroadcastDispatcher = broadcastDispatcher;
mTelephonyListenerManager = telephonyListenerManager;
mActivityTaskManager = activityTaskManager;
mUiEventLogger = uiEventLogger;
- mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(mUiEventLogger);
+ mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(this, mUiEventLogger);
mUserDetailAdapter = userDetailAdapter;
+ mUiBgExecutor = uiBgExecutor;
if (!UserManager.isGuestUserEphemeral()) {
mGuestResumeSessionReceiver.register(mBroadcastDispatcher);
}
+ mGuestUserAutoCreated = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_guestUserAutoCreated);
+ mGuestCreationScheduled = new AtomicBoolean();
mKeyguardStateController = keyguardStateController;
mHandler = handler;
mActivityStarter = activityStarter;
@@ -379,21 +396,13 @@ public class UserSwitcherController implements Dumpable {
int id;
if (record.isGuest && record.info == null) {
// No guest user. Create one.
- UserInfo guest;
- try {
- guest = mUserManager.createGuest(mContext,
- mContext.getString(com.android.settingslib.R.string.guest_nickname));
- } catch (UserManager.UserOperationException e) {
- Log.e(TAG, "Couldn't create guest user", e);
- return;
- }
- if (guest == null) {
- // Couldn't create guest, most likely because there already exists one, we just
- // haven't reloaded the user list yet.
+ int guestId = createGuest();
+ if (guestId == UserHandle.USER_NULL) {
+ // This may happen if we haven't reloaded the user list yet.
return;
}
mUiEventLogger.log(QSUserSwitcherEvent.QS_USER_GUEST_ADD);
- id = guest.id;
+ id = guestId;
} else if (record.isAddUser) {
showAddUserDialog();
return;
@@ -457,11 +466,6 @@ public class UserSwitcherController implements Dumpable {
mAddUserDialog.show();
}
- protected void exitGuest(int id, int targetId) {
- switchToUserId(targetId);
- mUserManager.removeUser(id);
- }
-
private void listenForCallState() {
mTelephonyListenerManager.addCallStateListener(mPhoneStateListener);
}
@@ -576,6 +580,7 @@ public class UserSwitcherController implements Dumpable {
pw.print(" "); pw.println(u.toString());
}
pw.println("mSimpleUserSwitcher=" + mSimpleUserSwitcher);
+ pw.println("mGuestUserAutoCreated=" + mGuestUserAutoCreated);
}
/** Returns the name of the current user of the phone. */
@@ -602,6 +607,126 @@ public class UserSwitcherController implements Dumpable {
return mUsers;
}
+ /**
+ * Removes guest user and switches to target user. The guest must be the current user and its id
+ * must be {@code guestUserId}.
+ *
+ *
If {@code targetUserId} is {@link UserHandle.USER_NULL}, then create a new guest user in
+ * the foreground, and immediately switch to it. This is used for wiping the current guest and
+ * replacing it with a new one.
+ *
+ *
If {@code targetUserId} is specified, then remove the guest in the background while
+ * switching to {@code targetUserId}.
+ *
+ *
If device is configured with {@link
+ * com.android.internal.R.bool.config_guestUserAutoCreated}, then after guest user is removed, a
+ * new one is created in the background. This has no effect if {@code targetUserId} is {@link
+ * UserHandle.USER_NULL}.
+ *
+ * @param guestUserId id of the guest user to remove
+ * @param targetUserId id of the user to switch to after guest is removed. If {@link
+ * UserHandle.USER_NULL}, then switch immediately to the newly created guest user.
+ */
+ public void removeGuestUser(@UserIdInt int guestUserId, @UserIdInt int targetUserId) {
+ UserInfo currentUser;
+ try {
+ currentUser = ActivityManager.getService().getCurrentUser();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Couldn't remove guest because ActivityManager is dead");
+ return;
+ }
+ if (currentUser.id != guestUserId) {
+ Log.w(TAG, "User requesting to start a new session (" + guestUserId + ")"
+ + " is not current user (" + currentUser.id + ")");
+ return;
+ }
+ if (!currentUser.isGuest()) {
+ Log.w(TAG, "User requesting to start a new session (" + guestUserId + ")"
+ + " is not a guest");
+ return;
+ }
+
+ boolean marked = mUserManager.markGuestForDeletion(currentUser.id);
+ if (!marked) {
+ Log.w(TAG, "Couldn't mark the guest for deletion for user " + guestUserId);
+ return;
+ }
+
+ try {
+ if (targetUserId == UserHandle.USER_NULL) {
+ // Create a new guest in the foreground, and then immediately switch to it
+ int newGuestId = createGuest();
+ if (newGuestId == UserHandle.USER_NULL) {
+ Log.e(TAG, "Could not create new guest, switching back to system user");
+ switchToUserId(UserHandle.USER_SYSTEM);
+ mUserManager.removeUser(currentUser.id);
+ WindowManagerGlobal.getWindowManagerService().lockNow(/* options= */ null);
+ return;
+ }
+ switchToUserId(newGuestId);
+ mUserManager.removeUser(currentUser.id);
+ } else {
+ if (mGuestUserAutoCreated) {
+ // TODO(b/191067027): Move guest recreation to system_server
+ scheduleGuestCreation();
+ }
+ switchToUserId(targetUserId);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Couldn't remove guest because ActivityManager or WindowManager is dead");
+ return;
+ }
+ }
+
+ private void scheduleGuestCreation() {
+ if (!mGuestCreationScheduled.compareAndSet(false, true)) {
+ return;
+ }
+
+ mUiBgExecutor.execute(() -> {
+ int newGuestId = createGuest();
+ if (newGuestId == UserHandle.USER_NULL) {
+ Log.w(TAG, "Could not create new guest while exiting existing guest");
+ }
+ mGuestCreationScheduled.set(false);
+ });
+
+ }
+
+ /**
+ * If there is no guest on the device, schedule creation of a new guest user in the background.
+ */
+ public void guaranteeGuestPresent() {
+ if (mUserManager.findCurrentGuestUser() == null) {
+ scheduleGuestCreation();
+ }
+ }
+
+ /**
+ * Creates a guest user and return its multi-user user ID.
+ *
+ * This method does not check if a guest already exists before it makes a call to
+ * {@link UserManager} to create a new one.
+ *
+ * @return The multi-user user ID of the newly created guest user, or
+ * {@link UserHandle.USER_NULL} if the guest couldn't be created.
+ */
+ public @UserIdInt int createGuest() {
+ UserInfo guest;
+ try {
+ guest = mUserManager.createGuest(mContext,
+ mContext.getString(com.android.settingslib.R.string.guest_nickname));
+ } catch (UserManager.UserOperationException e) {
+ Log.e(TAG, "Couldn't create guest user", e);
+ return UserHandle.USER_NULL;
+ }
+ if (guest == null) {
+ Log.e(TAG, "Couldn't create guest, most likely because there already exists one");
+ return UserHandle.USER_NULL;
+ }
+ return guest.id;
+ }
+
public static abstract class BaseUserAdapter extends BaseAdapter {
final UserSwitcherController mController;
@@ -662,10 +787,15 @@ public class UserSwitcherController implements Dumpable {
public String getName(Context context, UserRecord item) {
if (item.isGuest) {
if (item.isCurrent) {
- return context.getString(com.android.settingslib.R.string.guest_exit_guest);
+ return context.getString(mController.mGuestUserAutoCreated
+ ? com.android.settingslib.R.string.guest_reset_guest
+ : com.android.settingslib.R.string.guest_exit_guest);
} else {
+ // If config_guestUserAutoCreated, always show guest nickname instead of "Add
+ // guest" to make it seem as though the device always has a guest ready for use
return context.getString(
- item.info == null ? com.android.settingslib.R.string.guest_new_guest
+ item.info == null && !mController.mGuestUserAutoCreated
+ ? com.android.settingslib.R.string.guest_new_guest
: com.android.settingslib.R.string.guest_nickname);
}
} else if (item.isAddUser) {
@@ -882,12 +1012,15 @@ public class UserSwitcherController implements Dumpable {
public ExitGuestDialog(Context context, int guestId, int targetId) {
super(context);
- setTitle(R.string.guest_exit_guest_dialog_title);
+ setTitle(mGuestUserAutoCreated ? R.string.guest_reset_guest_dialog_title
+ : R.string.guest_exit_guest_dialog_title);
setMessage(context.getString(R.string.guest_exit_guest_dialog_message));
setButton(DialogInterface.BUTTON_NEGATIVE,
context.getString(android.R.string.cancel), this);
setButton(DialogInterface.BUTTON_POSITIVE,
- context.getString(R.string.guest_exit_guest_dialog_remove), this);
+ context.getString(
+ mGuestUserAutoCreated ? R.string.guest_reset_guest_dialog_remove
+ : R.string.guest_exit_guest_dialog_remove), this);
SystemUIDialog.setWindowOnTop(this);
setCanceledOnTouchOutside(false);
mGuestId = guestId;
@@ -901,7 +1034,7 @@ public class UserSwitcherController implements Dumpable {
} else {
mUiEventLogger.log(QSUserSwitcherEvent.QS_USER_GUEST_REMOVE);
dismiss();
- exitGuest(mGuestId, mTargetId);
+ removeGuestUser(mGuestId, mTargetId);
}
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index d9b56a49f12a8..1dacc6245d841 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -52,6 +52,7 @@ import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.DeviceConfigProxyFake;
import com.android.systemui.util.concurrency.FakeExecutor;
@@ -78,6 +79,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
private @Mock DumpManager mDumpManager;
private @Mock PowerManager mPowerManager;
private @Mock TrustManager mTrustManager;
+ private @Mock UserSwitcherController mUserSwitcherController;
private @Mock NavigationModeController mNavigationModeController;
private @Mock KeyguardDisplayManager mKeyguardDisplayManager;
private @Mock DozeParameters mDozeParameters;
@@ -100,13 +102,27 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
when(mPowerManager.newWakeLock(anyInt(), any())).thenReturn(mock(WakeLock.class));
mViewMediator = new KeyguardViewMediator(
- mContext, mFalsingCollector, mLockPatternUtils, mBroadcastDispatcher,
+ mContext,
+ mFalsingCollector,
+ mLockPatternUtils,
+ mBroadcastDispatcher,
() -> mStatusBarKeyguardViewManager,
- mDismissCallbackRegistry, mUpdateMonitor, mDumpManager, mUiBgExecutor,
- mPowerManager, mTrustManager, mDeviceConfig, mNavigationModeController,
- mKeyguardDisplayManager, mDozeParameters, mStatusBarStateController,
- mKeyguardStateController, () -> mKeyguardUnlockAnimationController,
- mUnlockedScreenOffAnimationController, () -> mNotificationShadeDepthController);
+ mDismissCallbackRegistry,
+ mUpdateMonitor,
+ mDumpManager,
+ mUiBgExecutor,
+ mPowerManager,
+ mTrustManager,
+ mUserSwitcherController,
+ mDeviceConfig,
+ mNavigationModeController,
+ mKeyguardDisplayManager,
+ mDozeParameters,
+ mStatusBarStateController,
+ mKeyguardStateController,
+ () -> mKeyguardUnlockAnimationController,
+ mUnlockedScreenOffAnimationController,
+ () -> mNotificationShadeDepthController);
mViewMediator.start();
}