From 2e00a2856772256889ed97d81ac7acfab30ce7d0 Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Tue, 20 Sep 2022 22:03:21 +0000 Subject: [PATCH] Move part of UserManager method isUserSwitcherEnabled to UserManagerService Bug: 242812503 Test: atest UserManagerServiceTest Change-Id: I513ba7a9060e3fd5bca365f8354850ca1cfce542 --- core/java/android/os/IUserManager.aidl | 2 +- core/java/android/os/UserManager.java | 28 +--------------- .../android/server/pm/UserManagerService.java | 32 +++++++++++++++++-- .../server/pm/UserManagerServiceTest.java | 19 +++++++++++ 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index 88649cbf9e425..933769a352e98 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -76,7 +76,7 @@ interface IUserManager { String getUserAccount(int userId); void setUserAccount(int userId, String accountName); long getUserCreationTime(int userId); - boolean isUserSwitcherEnabled(int mUserId); + boolean isUserSwitcherEnabled(boolean showEvenIfNotActionable, int mUserId); boolean isRestricted(int userId); boolean canHaveRestrictedProfile(int userId); int getUserSerialNumber(int userId); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 1e91700fcf01e..5c809a1bac1c6 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -5265,36 +5265,10 @@ public class UserManager { public boolean isUserSwitcherEnabled(boolean showEvenIfNotActionable) { try { - if (!mService.isUserSwitcherEnabled(mUserId)) { - return false; - } + return mService.isUserSwitcherEnabled(showEvenIfNotActionable, mUserId); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } - - // The feature is enabled. But is it worth showing? - return showEvenIfNotActionable - || areThereUsersToWhichToSwitch() // There are switchable users. - || !hasUserRestrictionForUser(DISALLOW_ADD_USER, mUserId); // New users can be added - } - - /** Returns whether there are any users (other than the current user) to which to switch. */ - @RequiresPermission(anyOf = { - android.Manifest.permission.MANAGE_USERS, - android.Manifest.permission.CREATE_USERS - }) - private boolean areThereUsersToWhichToSwitch() { - final List users = getAliveUsers(); - if (users == null) { - return false; - } - int switchableUserCount = 0; - for (UserInfo user : users) { - if (user.supportsSwitchToByUser()) { - ++switchableUserCount; - } - } - return switchableUserCount > 1; } /** diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 3b3e1db0f35dc..c77459da8cecc 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2048,8 +2048,8 @@ public class UserManagerService extends IUserManager.Stub { } } - @Override - public boolean isUserSwitcherEnabled(@UserIdInt int mUserId) { + @VisibleForTesting + boolean isUserSwitcherEnabled(@UserIdInt int mUserId) { boolean multiUserSettingOn = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED, Resources.getSystem().getBoolean(com.android.internal @@ -2061,6 +2061,33 @@ public class UserManagerService extends IUserManager.Stub { && multiUserSettingOn; } + @Override + public boolean isUserSwitcherEnabled(boolean showEvenIfNotActionable, + @UserIdInt int mUserId) { + if (!isUserSwitcherEnabled(mUserId)) { + return false; + } + // The feature is enabled. But is it worth showing? + return showEvenIfNotActionable + || !hasUserRestriction(UserManager.DISALLOW_ADD_USER, mUserId) // Can add new user + || areThereMultipleSwitchableUsers(); // There are switchable users + } + + /** Returns true if there is more than one user that can be switched to. */ + private boolean areThereMultipleSwitchableUsers() { + List aliveUsers = getUsers(true, true, true); + boolean isAnyAliveUser = false; + for (UserInfo userInfo : aliveUsers) { + if (userInfo.supportsSwitchToByUser()) { + if (isAnyAliveUser) { + return true; + } + isAnyAliveUser = true; + } + } + return false; + } + @Override public boolean isRestricted(@UserIdInt int userId) { if (userId != UserHandle.getCallingUserId()) { @@ -7072,4 +7099,5 @@ public class UserManagerService extends IUserManager.Stub { } return mAmInternal; } + } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java index e04edc6d7db21..96707fde8edb2 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -216,6 +216,25 @@ public class UserManagerServiceTest { assertThat(mUserManagerService.isUserSwitcherEnabled(userId)).isTrue(); } + @Test + public void assertIsUserSwitcherEnabled() throws Exception { + int userId = ActivityManager.getCurrentUser(); + setMaxSupportedUsers(8); + assertThat(mUserManagerService.isUserSwitcherEnabled(true, userId)).isTrue(); + + setUserSwitch(false); + assertThat(mUserManagerService.isUserSwitcherEnabled(true, userId)).isFalse(); + + setUserSwitch(true); + assertThat(mUserManagerService.isUserSwitcherEnabled(false, userId)).isTrue(); + + mUserManagerService.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, userId); + assertThat(mUserManagerService.isUserSwitcherEnabled(false, userId)).isFalse(); + + mUserManagerService.setUserRestriction(UserManager.DISALLOW_ADD_USER, false, userId); + setMaxSupportedUsers(1); + assertThat(mUserManagerService.isUserSwitcherEnabled(true, userId)).isFalse(); + } @Test public void assertIsUserSwitcherEnabledOnShowMultiuserUI() throws Exception {