diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index c20ae0b045ac5..ee3d40edc2eb4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2603,7 +2603,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, if (mContext.getResources().getBoolean( com.android.internal.R.bool.config_guestUserAutoCreated)) { // TODO(b/191067027): Move post-boot guest creation to system_server - mUserSwitcherController.guaranteeGuestPresent(); + mUserSwitcherController.schedulePostBootGuestCreation(); } mBootCompleted = true; adjustStatusBarLocked(false, true); 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 8f1a5782e7793..7548d1c435ed9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -26,6 +26,7 @@ import android.app.ActivityManager; import android.app.AlertDialog; import android.app.Dialog; import android.app.IActivityTaskManager; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -114,6 +115,8 @@ public class UserSwitcherController implements Dumpable { @VisibleForTesting final GuestResumeSessionReceiver mGuestResumeSessionReceiver; private final KeyguardStateController mKeyguardStateController; + private final DeviceProvisionedController mDeviceProvisionedController; + private final DevicePolicyManager mDevicePolicyManager; protected final Handler mHandler; private final ActivityStarter mActivityStarter; private final BroadcastDispatcher mBroadcastDispatcher; @@ -149,6 +152,8 @@ public class UserSwitcherController implements Dumpable { UserManager userManager, UserTracker userTracker, KeyguardStateController keyguardStateController, + DeviceProvisionedController deviceProvisionedController, + DevicePolicyManager devicePolicyManager, @Main Handler handler, ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher, @@ -178,6 +183,8 @@ public class UserSwitcherController implements Dumpable { mGuestIsResetting = new AtomicBoolean(); mGuestCreationScheduled = new AtomicBoolean(); mKeyguardStateController = keyguardStateController; + mDeviceProvisionedController = deviceProvisionedController; + mDevicePolicyManager = devicePolicyManager; mHandler = handler; mActivityStarter = activityStarter; mUserManager = userManager; @@ -732,11 +739,28 @@ public class UserSwitcherController implements Dumpable { } + /** + * Guarantee guest is present only if the device is provisioned. Otherwise, create a content + * observer to wait until the device is provisioned, then schedule the guest creation. + */ + public void schedulePostBootGuestCreation() { + if (isDeviceAllowedToAddGuest()) { + guaranteeGuestPresent(); + } else { + mDeviceProvisionedController.addCallback(mGuaranteeGuestPresentAfterProvisioned); + } + } + + private boolean isDeviceAllowedToAddGuest() { + return mDeviceProvisionedController.isDeviceProvisioned() + && !mDevicePolicyManager.isDeviceManaged(); + } + /** * 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) { + private void guaranteeGuestPresent() { + if (isDeviceAllowedToAddGuest() && mUserManager.findCurrentGuestUser() == null) { scheduleGuestCreation(); } } @@ -1056,6 +1080,21 @@ public class UserSwitcherController implements Dumpable { } }; + private final DeviceProvisionedController.DeviceProvisionedListener + mGuaranteeGuestPresentAfterProvisioned = + new DeviceProvisionedController.DeviceProvisionedListener() { + @Override + public void onDeviceProvisionedChanged() { + if (isDeviceAllowedToAddGuest()) { + mBgExecutor.execute( + () -> mDeviceProvisionedController.removeCallback( + mGuaranteeGuestPresentAfterProvisioned)); + guaranteeGuestPresent(); + } + } + }; + + private final class ExitGuestDialog extends SystemUIDialog implements DialogInterface.OnClickListener { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt index ace2c71d9c63e..3431a9d895d31 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.policy import android.app.IActivityTaskManager +import android.app.admin.DevicePolicyManager import android.content.Context import android.content.DialogInterface import android.content.Intent @@ -63,6 +64,8 @@ import org.mockito.MockitoAnnotations @SmallTest class UserSwitcherControllerTest : SysuiTestCase() { @Mock private lateinit var keyguardStateController: KeyguardStateController + @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController + @Mock private lateinit var devicePolicyManager: DevicePolicyManager @Mock private lateinit var handler: Handler @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var userManager: UserManager @@ -107,6 +110,8 @@ class UserSwitcherControllerTest : SysuiTestCase() { userManager, userTracker, keyguardStateController, + deviceProvisionedController, + devicePolicyManager, handler, activityStarter, broadcastDispatcher,