Merge "User switcher - Update when multiple users enabled/disabled" into tm-dev
This commit is contained in:
@@ -63,7 +63,6 @@ public final class Prefs {
|
|||||||
Key.QS_WORK_ADDED,
|
Key.QS_WORK_ADDED,
|
||||||
Key.QS_NIGHTDISPLAY_ADDED,
|
Key.QS_NIGHTDISPLAY_ADDED,
|
||||||
Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT,
|
Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT,
|
||||||
Key.SEEN_MULTI_USER,
|
|
||||||
Key.SEEN_RINGER_GUIDANCE_COUNT,
|
Key.SEEN_RINGER_GUIDANCE_COUNT,
|
||||||
Key.QS_HAS_TURNED_OFF_MOBILE_DATA,
|
Key.QS_HAS_TURNED_OFF_MOBILE_DATA,
|
||||||
Key.TOUCHED_RINGER_TOGGLE,
|
Key.TOUCHED_RINGER_TOGGLE,
|
||||||
@@ -106,7 +105,6 @@ public final class Prefs {
|
|||||||
* Settings panel.
|
* Settings panel.
|
||||||
*/
|
*/
|
||||||
String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount";
|
String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount";
|
||||||
String SEEN_MULTI_USER = "HasSeenMultiUser";
|
|
||||||
String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount";
|
String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount";
|
||||||
String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed";
|
String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed";
|
||||||
String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData";
|
String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData";
|
||||||
|
|||||||
@@ -64,8 +64,6 @@ import com.android.settingslib.users.UserCreatingDialog;
|
|||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
import com.android.systemui.Dumpable;
|
import com.android.systemui.Dumpable;
|
||||||
import com.android.systemui.GuestResumeSessionReceiver;
|
import com.android.systemui.GuestResumeSessionReceiver;
|
||||||
import com.android.systemui.Prefs;
|
|
||||||
import com.android.systemui.Prefs.Key;
|
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.SystemUISecondaryUserService;
|
import com.android.systemui.SystemUISecondaryUserService;
|
||||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||||
@@ -84,6 +82,7 @@ import com.android.systemui.settings.UserTracker;
|
|||||||
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;
|
||||||
|
import com.android.systemui.util.settings.GlobalSettings;
|
||||||
import com.android.systemui.util.settings.SecureSettings;
|
import com.android.systemui.util.settings.SecureSettings;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
@@ -144,6 +143,7 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
// When false, there won't be any visual affordance to add a new user from the keyguard even if
|
// When false, there won't be any visual affordance to add a new user from the keyguard even if
|
||||||
// the user is unlocked
|
// the user is unlocked
|
||||||
private boolean mAddUsersFromLockScreen;
|
private boolean mAddUsersFromLockScreen;
|
||||||
|
private boolean mUserSwitcherEnabled;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean mPauseRefreshUsers;
|
boolean mPauseRefreshUsers;
|
||||||
private int mSecondaryUser = UserHandle.USER_NULL;
|
private int mSecondaryUser = UserHandle.USER_NULL;
|
||||||
@@ -160,6 +160,7 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
private FalsingManager mFalsingManager;
|
private FalsingManager mFalsingManager;
|
||||||
private View mView;
|
private View mView;
|
||||||
private String mCreateSupervisedUserPackage;
|
private String mCreateSupervisedUserPackage;
|
||||||
|
private GlobalSettings mGlobalSettings;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public UserSwitcherController(Context context,
|
public UserSwitcherController(Context context,
|
||||||
@@ -177,6 +178,7 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
FalsingManager falsingManager,
|
FalsingManager falsingManager,
|
||||||
TelephonyListenerManager telephonyListenerManager,
|
TelephonyListenerManager telephonyListenerManager,
|
||||||
SecureSettings secureSettings,
|
SecureSettings secureSettings,
|
||||||
|
GlobalSettings globalSettings,
|
||||||
@Background Executor bgExecutor,
|
@Background Executor bgExecutor,
|
||||||
@LongRunning Executor longRunningExecutor,
|
@LongRunning Executor longRunningExecutor,
|
||||||
@Main Executor uiExecutor,
|
@Main Executor uiExecutor,
|
||||||
@@ -194,6 +196,7 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
mFalsingManager = falsingManager;
|
mFalsingManager = falsingManager;
|
||||||
mInteractionJankMonitor = interactionJankMonitor;
|
mInteractionJankMonitor = interactionJankMonitor;
|
||||||
mLatencyTracker = latencyTracker;
|
mLatencyTracker = latencyTracker;
|
||||||
|
mGlobalSettings = globalSettings;
|
||||||
mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(
|
mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(
|
||||||
this, mUserTracker, mUiEventLogger, secureSettings);
|
this, mUserTracker, mUiEventLogger, secureSettings);
|
||||||
mBgExecutor = bgExecutor;
|
mBgExecutor = bgExecutor;
|
||||||
@@ -237,14 +240,19 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange) {
|
public void onChange(boolean selfChange) {
|
||||||
mSimpleUserSwitcher = shouldUseSimpleUserSwitcher();
|
mSimpleUserSwitcher = shouldUseSimpleUserSwitcher();
|
||||||
mAddUsersFromLockScreen = Settings.Global.getInt(mContext.getContentResolver(),
|
mAddUsersFromLockScreen = mGlobalSettings.getIntForUser(
|
||||||
Settings.Global.ADD_USERS_WHEN_LOCKED, 0) != 0;
|
Settings.Global.ADD_USERS_WHEN_LOCKED, 0, UserHandle.USER_SYSTEM) != 0;
|
||||||
|
mUserSwitcherEnabled = mGlobalSettings.getIntForUser(
|
||||||
|
Settings.Global.USER_SWITCHER_ENABLED, 0, UserHandle.USER_SYSTEM) != 0;
|
||||||
refreshUsers(UserHandle.USER_NULL);
|
refreshUsers(UserHandle.USER_NULL);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
mContext.getContentResolver().registerContentObserver(
|
mContext.getContentResolver().registerContentObserver(
|
||||||
Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true,
|
Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true,
|
||||||
mSettingsObserver);
|
mSettingsObserver);
|
||||||
|
mContext.getContentResolver().registerContentObserver(
|
||||||
|
Settings.Global.getUriFor(Settings.Global.USER_SWITCHER_ENABLED), true,
|
||||||
|
mSettingsObserver);
|
||||||
mContext.getContentResolver().registerContentObserver(
|
mContext.getContentResolver().registerContentObserver(
|
||||||
Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true,
|
Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true,
|
||||||
mSettingsObserver);
|
mSettingsObserver);
|
||||||
@@ -314,6 +322,10 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
for (UserInfo info : infos) {
|
for (UserInfo info : infos) {
|
||||||
boolean isCurrent = currentId == info.id;
|
boolean isCurrent = currentId == info.id;
|
||||||
boolean switchToEnabled = canSwitchUsers || isCurrent;
|
boolean switchToEnabled = canSwitchUsers || isCurrent;
|
||||||
|
if (!mUserSwitcherEnabled && !info.isPrimary()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (info.isEnabled()) {
|
if (info.isEnabled()) {
|
||||||
if (info.isGuest()) {
|
if (info.isGuest()) {
|
||||||
// Tapping guest icon triggers remove and a user switch therefore
|
// Tapping guest icon triggers remove and a user switch therefore
|
||||||
@@ -340,9 +352,6 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (records.size() > 1 || guestRecord != null) {
|
|
||||||
Prefs.putBoolean(mContext, Key.SEEN_MULTI_USER, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (guestRecord == null) {
|
if (guestRecord == null) {
|
||||||
if (mGuestUserAutoCreated) {
|
if (mGuestUserAutoCreated) {
|
||||||
@@ -411,12 +420,14 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean canCreateGuest(boolean hasExistingGuest) {
|
boolean canCreateGuest(boolean hasExistingGuest) {
|
||||||
return (currentUserCanCreateUsers() || anyoneCanCreateUsers())
|
return mUserSwitcherEnabled
|
||||||
|
&& (currentUserCanCreateUsers() || anyoneCanCreateUsers())
|
||||||
&& !hasExistingGuest;
|
&& !hasExistingGuest;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean canCreateUser() {
|
boolean canCreateUser() {
|
||||||
return (currentUserCanCreateUsers() || anyoneCanCreateUsers())
|
return mUserSwitcherEnabled
|
||||||
|
&& (currentUserCanCreateUsers() || anyoneCanCreateUsers())
|
||||||
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY);
|
&& mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1034,8 +1045,8 @@ public class UserSwitcherController implements Dumpable {
|
|||||||
private boolean shouldUseSimpleUserSwitcher() {
|
private boolean shouldUseSimpleUserSwitcher() {
|
||||||
int defaultSimpleUserSwitcher = mContext.getResources().getBoolean(
|
int defaultSimpleUserSwitcher = mContext.getResources().getBoolean(
|
||||||
com.android.internal.R.bool.config_expandLockScreenUserSwitcher) ? 1 : 0;
|
com.android.internal.R.bool.config_expandLockScreenUserSwitcher) ? 1 : 0;
|
||||||
return Settings.Global.getInt(mContext.getContentResolver(),
|
return mGlobalSettings.getIntForUser(SIMPLE_USER_SWITCHER_GLOBAL_SETTING,
|
||||||
SIMPLE_USER_SWITCHER_GLOBAL_SETTING, defaultSimpleUserSwitcher) != 0;
|
defaultSimpleUserSwitcher, UserHandle.USER_SYSTEM) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startActivity(Intent intent) {
|
public void startActivity(Intent intent) {
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import android.hardware.fingerprint.FingerprintManager
|
|||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.UserHandle
|
import android.os.UserHandle
|
||||||
import android.os.UserManager
|
import android.os.UserManager
|
||||||
|
import android.provider.Settings
|
||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
import android.testing.TestableLooper
|
import android.testing.TestableLooper
|
||||||
import android.view.ThreadedRenderer
|
import android.view.ThreadedRenderer
|
||||||
@@ -51,6 +52,7 @@ import com.android.systemui.settings.UserTracker
|
|||||||
import com.android.systemui.statusbar.phone.NotificationShadeWindowView
|
import com.android.systemui.statusbar.phone.NotificationShadeWindowView
|
||||||
import com.android.systemui.telephony.TelephonyListenerManager
|
import com.android.systemui.telephony.TelephonyListenerManager
|
||||||
import com.android.systemui.util.concurrency.FakeExecutor
|
import com.android.systemui.util.concurrency.FakeExecutor
|
||||||
|
import com.android.systemui.util.settings.GlobalSettings
|
||||||
import com.android.systemui.util.settings.SecureSettings
|
import com.android.systemui.util.settings.SecureSettings
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
@@ -67,6 +69,7 @@ import org.mockito.Mockito.`when`
|
|||||||
import org.mockito.Mockito.any
|
import org.mockito.Mockito.any
|
||||||
import org.mockito.Mockito.doNothing
|
import org.mockito.Mockito.doNothing
|
||||||
import org.mockito.Mockito.doReturn
|
import org.mockito.Mockito.doReturn
|
||||||
|
import org.mockito.Mockito.eq
|
||||||
import org.mockito.Mockito.mock
|
import org.mockito.Mockito.mock
|
||||||
import org.mockito.Mockito.verify
|
import org.mockito.Mockito.verify
|
||||||
import org.mockito.MockitoAnnotations
|
import org.mockito.MockitoAnnotations
|
||||||
@@ -95,6 +98,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
|
|||||||
@Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView
|
@Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView
|
||||||
@Mock private lateinit var threadedRenderer: ThreadedRenderer
|
@Mock private lateinit var threadedRenderer: ThreadedRenderer
|
||||||
@Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator
|
@Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator
|
||||||
|
@Mock private lateinit var globalSettings: GlobalSettings
|
||||||
private lateinit var testableLooper: TestableLooper
|
private lateinit var testableLooper: TestableLooper
|
||||||
private lateinit var bgExecutor: FakeExecutor
|
private lateinit var bgExecutor: FakeExecutor
|
||||||
private lateinit var longRunningExecutor: FakeExecutor
|
private lateinit var longRunningExecutor: FakeExecutor
|
||||||
@@ -148,6 +152,22 @@ class UserSwitcherControllerTest : SysuiTestCase() {
|
|||||||
`when`(userTracker.userId).thenReturn(ownerId)
|
`when`(userTracker.userId).thenReturn(ownerId)
|
||||||
`when`(userTracker.userInfo).thenReturn(ownerInfo)
|
`when`(userTracker.userInfo).thenReturn(ownerInfo)
|
||||||
|
|
||||||
|
`when`(
|
||||||
|
globalSettings.getIntForUser(
|
||||||
|
eq(Settings.Global.ADD_USERS_WHEN_LOCKED),
|
||||||
|
anyInt(),
|
||||||
|
eq(UserHandle.USER_SYSTEM)
|
||||||
|
)
|
||||||
|
).thenReturn(0)
|
||||||
|
|
||||||
|
`when`(
|
||||||
|
globalSettings.getIntForUser(
|
||||||
|
eq(Settings.Global.USER_SWITCHER_ENABLED),
|
||||||
|
anyInt(),
|
||||||
|
eq(UserHandle.USER_SYSTEM)
|
||||||
|
)
|
||||||
|
).thenReturn(1)
|
||||||
|
|
||||||
setupController()
|
setupController()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,6 +188,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
|
|||||||
falsingManager,
|
falsingManager,
|
||||||
telephonyListenerManager,
|
telephonyListenerManager,
|
||||||
secureSettings,
|
secureSettings,
|
||||||
|
globalSettings,
|
||||||
bgExecutor,
|
bgExecutor,
|
||||||
longRunningExecutor,
|
longRunningExecutor,
|
||||||
uiExecutor,
|
uiExecutor,
|
||||||
@@ -469,4 +490,43 @@ class UserSwitcherControllerTest : SysuiTestCase() {
|
|||||||
// THEN a supervised user can NOT be constructed
|
// THEN a supervised user can NOT be constructed
|
||||||
assertFalse(userSwitcherController.canCreateSupervisedUser())
|
assertFalse(userSwitcherController.canCreateSupervisedUser())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCannotCreateUserWhenUserSwitcherDisabled() {
|
||||||
|
`when`(
|
||||||
|
globalSettings.getIntForUser(
|
||||||
|
eq(Settings.Global.USER_SWITCHER_ENABLED),
|
||||||
|
anyInt(),
|
||||||
|
eq(UserHandle.USER_SYSTEM)
|
||||||
|
)
|
||||||
|
).thenReturn(0)
|
||||||
|
setupController()
|
||||||
|
assertFalse(userSwitcherController.canCreateUser())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCannotCreateGuestUserWhenUserSwitcherDisabled() {
|
||||||
|
`when`(
|
||||||
|
globalSettings.getIntForUser(
|
||||||
|
eq(Settings.Global.USER_SWITCHER_ENABLED),
|
||||||
|
anyInt(),
|
||||||
|
eq(UserHandle.USER_SYSTEM)
|
||||||
|
)
|
||||||
|
).thenReturn(0)
|
||||||
|
setupController()
|
||||||
|
assertFalse(userSwitcherController.canCreateGuest(false))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCannotCreateSupervisedUserWhenUserSwitcherDisabled() {
|
||||||
|
`when`(
|
||||||
|
globalSettings.getIntForUser(
|
||||||
|
eq(Settings.Global.USER_SWITCHER_ENABLED),
|
||||||
|
anyInt(),
|
||||||
|
eq(UserHandle.USER_SYSTEM)
|
||||||
|
)
|
||||||
|
).thenReturn(0)
|
||||||
|
setupController()
|
||||||
|
assertFalse(userSwitcherController.canCreateSupervisedUser())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user