diff options
author | jovanak | 2018-06-26 20:45:30 -0500 |
---|---|---|
committer | jovanak | 2018-06-28 11:37:06 -0500 |
commit | 10e6ff0f6ccadc9661ccbab12e625d9a6648bf27 (patch) | |
tree | b9d743b24ff9abef34e4861efe3828aac6a7d410 | |
parent | 1ab32b66ef7467e536df727b0b9419dd31556a8e (diff) | |
download | platform-packages-services-car-10e6ff0f6ccadc9661ccbab12e625d9a6648bf27.tar.gz platform-packages-services-car-10e6ff0f6ccadc9661ccbab12e625d9a6648bf27.tar.xz platform-packages-services-car-10e6ff0f6ccadc9661ccbab12e625d9a6648bf27.zip |
Adding methods for keeping track of user limits on the device.
Bug:80197830
Test: atest CarUserManagerHelperTest
Change-Id: I32f06fdff713c3f0b71e9c39c3a6db8804643b8f
3 files changed, 192 insertions, 42 deletions
diff --git a/car-lib/src/android/car/user/CarUserManagerHelper.java b/car-lib/src/android/car/user/CarUserManagerHelper.java index c5885477..94c701d2 100644 --- a/car-lib/src/android/car/user/CarUserManagerHelper.java +++ b/car-lib/src/android/car/user/CarUserManagerHelper.java | |||
@@ -184,7 +184,7 @@ public class CarUserManagerHelper { | |||
184 | 184 | ||
185 | /** | 185 | /** |
186 | * Get user id for the initial user to boot into. This is only applicable for headless | 186 | * Get user id for the initial user to boot into. This is only applicable for headless |
187 | * user 0 model. | 187 | * system user model. |
188 | * | 188 | * |
189 | * <p>If failed to retrieve the id stored in global settings or the retrieved id does not | 189 | * <p>If failed to retrieve the id stored in global settings or the retrieved id does not |
190 | * exist on device, then return the user with smallest user id. | 190 | * exist on device, then return the user with smallest user id. |
@@ -339,6 +339,24 @@ public class CarUserManagerHelper { | |||
339 | } | 339 | } |
340 | 340 | ||
341 | /** | 341 | /** |
342 | * Gets all users that are not guests. | ||
343 | * | ||
344 | * @return List of {@code UserInfo} for all users who are not guest users. | ||
345 | */ | ||
346 | public List<UserInfo> getAllUsersExceptGuests() { | ||
347 | List<UserInfo> users = getAllUsers(); | ||
348 | |||
349 | for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) { | ||
350 | UserInfo userInfo = iterator.next(); | ||
351 | if (userInfo.isGuest()) { | ||
352 | // Remove guests. | ||
353 | iterator.remove(); | ||
354 | } | ||
355 | } | ||
356 | return users; | ||
357 | } | ||
358 | |||
359 | /** | ||
342 | * Get all the users except the one with userId passed in. | 360 | * Get all the users except the one with userId passed in. |
343 | * | 361 | * |
344 | * @param userId of the user not to be returned. | 362 | * @param userId of the user not to be returned. |
@@ -376,6 +394,62 @@ public class CarUserManagerHelper { | |||
376 | return users; | 394 | return users; |
377 | } | 395 | } |
378 | 396 | ||
397 | /** | ||
398 | * Maximum number of users allowed on the device. This includes real users, managed profiles | ||
399 | * and restricted users, but excludes guests. | ||
400 | * | ||
401 | * <p> It excludes system user in headless system user model. | ||
402 | * | ||
403 | * @return Maximum number of users that can be present on the device. | ||
404 | */ | ||
405 | public int getMaxSupportedUsers() { | ||
406 | if (isHeadlessSystemUser()) { | ||
407 | return UserManager.getMaxSupportedUsers() - 1; | ||
408 | } | ||
409 | return UserManager.getMaxSupportedUsers(); | ||
410 | } | ||
411 | |||
412 | /** | ||
413 | * Get the maximum number of real (non-guest, non-managed profile) users that can be created on | ||
414 | * the device. This is a dynamic value and it decreases with the increase of the number of | ||
415 | * managed profiles on the device. | ||
416 | * | ||
417 | * <p> It excludes system user in headless system user model. | ||
418 | * | ||
419 | * @return Maximum number of real users that can be created. | ||
420 | */ | ||
421 | public int getMaxSupportedRealUsers() { | ||
422 | return getMaxSupportedUsers() - getManagedProfilesCount(); | ||
423 | } | ||
424 | |||
425 | /** | ||
426 | * Returns true if the maximum number of users on the device has been reached, false otherwise. | ||
427 | */ | ||
428 | public boolean isUserLimitReached() { | ||
429 | int countNonGuestUsers = getAllUsersExceptGuests().size(); | ||
430 | int maxSupportedUsers = UserManager.getMaxSupportedUsers(); | ||
431 | |||
432 | if (countNonGuestUsers > maxSupportedUsers) { | ||
433 | Log.e(TAG, "There are more users on the device than allowed."); | ||
434 | return true; | ||
435 | } | ||
436 | |||
437 | return getAllUsersExceptGuests().size() == UserManager.getMaxSupportedUsers(); | ||
438 | } | ||
439 | |||
440 | private int getManagedProfilesCount() { | ||
441 | List<UserInfo> users = getAllUsers(); | ||
442 | |||
443 | // Count all users that are managed profiles of another user. | ||
444 | int managedProfilesCount = 0; | ||
445 | for (UserInfo user : users) { | ||
446 | if (user.isManagedProfile()) { | ||
447 | managedProfilesCount++; | ||
448 | } | ||
449 | } | ||
450 | return managedProfilesCount; | ||
451 | } | ||
452 | |||
379 | // User information accessors | 453 | // User information accessors |
380 | 454 | ||
381 | /** | 455 | /** |
diff --git a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java index 8fc1eead..da7cc2c3 100644 --- a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java +++ b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java | |||
@@ -51,7 +51,6 @@ import org.mockito.Mockito; | |||
51 | import org.mockito.MockitoAnnotations; | 51 | import org.mockito.MockitoAnnotations; |
52 | 52 | ||
53 | import java.util.ArrayList; | 53 | import java.util.ArrayList; |
54 | import java.util.Arrays; | ||
55 | import java.util.List; | 54 | import java.util.List; |
56 | 55 | ||
57 | /** | 56 | /** |
@@ -128,15 +127,8 @@ public class CarUserManagerHelperTest { | |||
128 | UserInfo otherUser2 = createUserInfoForId(11); | 127 | UserInfo otherUser2 = createUserInfoForId(11); |
129 | UserInfo otherUser3 = createUserInfoForId(12); | 128 | UserInfo otherUser3 = createUserInfoForId(12); |
130 | 129 | ||
131 | List<UserInfo> testUsers = new ArrayList<>(); | 130 | mockGetUsers(mSystemUser, otherUser1, otherUser2, otherUser3); |
132 | testUsers.add(mSystemUser); | ||
133 | testUsers.add(otherUser1); | ||
134 | testUsers.add(otherUser2); | ||
135 | testUsers.add(otherUser3); | ||
136 | |||
137 | doReturn(testUsers).when(mUserManager).getUsers(true); | ||
138 | 131 | ||
139 | assertThat(mCarUserManagerHelper.getAllUsers()).hasSize(3); | ||
140 | assertThat(mCarUserManagerHelper.getAllUsers()) | 132 | assertThat(mCarUserManagerHelper.getAllUsers()) |
141 | .containsExactly(otherUser1, otherUser2, otherUser3); | 133 | .containsExactly(otherUser1, otherUser2, otherUser3); |
142 | } | 134 | } |
@@ -147,15 +139,9 @@ public class CarUserManagerHelperTest { | |||
147 | UserInfo user1 = createUserInfoForId(mForegroundUserId + 1); | 139 | UserInfo user1 = createUserInfoForId(mForegroundUserId + 1); |
148 | UserInfo user2 = createUserInfoForId(mForegroundUserId + 2); | 140 | UserInfo user2 = createUserInfoForId(mForegroundUserId + 2); |
149 | 141 | ||
150 | List<UserInfo> testUsers = Arrays.asList(mForegroundUser, user1, user2); | 142 | mockGetUsers(mForegroundUser, user1, user2); |
151 | |||
152 | doReturn(new ArrayList<>(testUsers)).when(mUserManager).getUsers(true); | ||
153 | |||
154 | // Should return all 3 users. | ||
155 | assertThat(mCarUserManagerHelper.getAllUsers()).hasSize(3); | ||
156 | 143 | ||
157 | // Should return all non-foreground users. | 144 | // Should return all non-foreground users. |
158 | assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).hasSize(2); | ||
159 | assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).containsExactly(user1, user2); | 145 | assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).containsExactly(user1, user2); |
160 | } | 146 | } |
161 | 147 | ||
@@ -170,19 +156,41 @@ public class CarUserManagerHelperTest { | |||
170 | UserInfo user4 = new UserInfo( | 156 | UserInfo user4 = new UserInfo( |
171 | /* id= */mForegroundUserId + 3, /* name = */ "user4", UserInfo.FLAG_EPHEMERAL); | 157 | /* id= */mForegroundUserId + 3, /* name = */ "user4", UserInfo.FLAG_EPHEMERAL); |
172 | 158 | ||
173 | List<UserInfo> testUsers = Arrays.asList(user1, user2, user3, user4); | 159 | mockGetUsers(user1, user2, user3, user4); |
174 | |||
175 | doReturn(new ArrayList<>(testUsers)).when(mUserManager).getUsers(true); | ||
176 | |||
177 | // Should return all 4 users. | ||
178 | assertThat(mCarUserManagerHelper.getAllUsers()).hasSize(4); | ||
179 | 160 | ||
180 | // Should return all non-ephemeral users. | 161 | // Should return all non-ephemeral users. |
181 | assertThat(mCarUserManagerHelper.getAllPersistentUsers()).hasSize(2); | ||
182 | assertThat(mCarUserManagerHelper.getAllPersistentUsers()).containsExactly(user1, user2); | 162 | assertThat(mCarUserManagerHelper.getAllPersistentUsers()).containsExactly(user1, user2); |
183 | } | 163 | } |
184 | 164 | ||
185 | @Test | 165 | @Test |
166 | public void testGetAllAdminUsers() { | ||
167 | // Create two admin, and two non-admin users. | ||
168 | UserInfo user1 = new UserInfo(/* id= */ 10, /* name = */ "user10", UserInfo.FLAG_ADMIN); | ||
169 | UserInfo user2 = createUserInfoForId(11); | ||
170 | UserInfo user3 = createUserInfoForId(12); | ||
171 | UserInfo user4 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_ADMIN); | ||
172 | |||
173 | mockGetUsers(user1, user2, user3, user4); | ||
174 | |||
175 | // Should return only admin users. | ||
176 | assertThat(mCarUserManagerHelper.getAllAdminUsers()).containsExactly(user1, user4); | ||
177 | } | ||
178 | |||
179 | @Test | ||
180 | public void testGetAllUsersExceptGuests() { | ||
181 | // Create two users and a guest user. | ||
182 | UserInfo user1 = createUserInfoForId(10); | ||
183 | UserInfo user2 = createUserInfoForId(12); | ||
184 | UserInfo user3 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_GUEST); | ||
185 | |||
186 | mockGetUsers(user1, user2, user3); | ||
187 | |||
188 | // Should not return guests. | ||
189 | assertThat(mCarUserManagerHelper.getAllUsersExceptGuests()) | ||
190 | .containsExactly(user1, user2); | ||
191 | } | ||
192 | |||
193 | @Test | ||
186 | public void testUserCanBeRemoved() { | 194 | public void testUserCanBeRemoved() { |
187 | UserInfo testInfo = new UserInfo(); | 195 | UserInfo testInfo = new UserInfo(); |
188 | 196 | ||
@@ -256,6 +264,80 @@ public class CarUserManagerHelperTest { | |||
256 | } | 264 | } |
257 | 265 | ||
258 | @Test | 266 | @Test |
267 | public void testGetMaxSupportedUsers() { | ||
268 | SystemProperties.set("fw.max_users", "11"); | ||
269 | |||
270 | assertThat(mCarUserManagerHelper.getMaxSupportedUsers()).isEqualTo(11); | ||
271 | |||
272 | // In headless user 0 model, we want to exclude the system user. | ||
273 | SystemProperties.set("android.car.systemuser.headless", "true"); | ||
274 | assertThat(mCarUserManagerHelper.getMaxSupportedUsers()).isEqualTo(10); | ||
275 | } | ||
276 | |||
277 | @Test | ||
278 | public void testGetMaxSupportedRealUsers() { | ||
279 | SystemProperties.set("fw.max_users", "7"); | ||
280 | |||
281 | // Create three managed profiles, and two normal users. | ||
282 | UserInfo user1 = createUserInfoForId(10); | ||
283 | UserInfo user2 = | ||
284 | new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE); | ||
285 | UserInfo user3 = | ||
286 | new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE); | ||
287 | UserInfo user4 = createUserInfoForId(13); | ||
288 | UserInfo user5 = | ||
289 | new UserInfo(/* id= */ 14, /* name = */ "user14", UserInfo.FLAG_MANAGED_PROFILE); | ||
290 | |||
291 | mockGetUsers(user1, user2, user3, user4, user5); | ||
292 | |||
293 | // Max users - # managed profiles. | ||
294 | assertThat(mCarUserManagerHelper.getMaxSupportedRealUsers()).isEqualTo(4); | ||
295 | } | ||
296 | |||
297 | @Test | ||
298 | public void testIsUserLimitReached() { | ||
299 | UserInfo user1 = createUserInfoForId(10); | ||
300 | UserInfo user2 = | ||
301 | new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE); | ||
302 | UserInfo user3 = | ||
303 | new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE); | ||
304 | UserInfo user4 = createUserInfoForId(13); | ||
305 | |||
306 | mockGetUsers(user1, user2, user3, user4); | ||
307 | |||
308 | SystemProperties.set("fw.max_users", "5"); | ||
309 | assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse(); | ||
310 | |||
311 | SystemProperties.set("fw.max_users", "4"); | ||
312 | assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue(); | ||
313 | } | ||
314 | |||
315 | @Test | ||
316 | public void testIsUserLimitReachedIgnoresGuests() { | ||
317 | SystemProperties.set("fw.max_users", "5"); | ||
318 | |||
319 | UserInfo user1 = createUserInfoForId(10); | ||
320 | UserInfo user2 = | ||
321 | new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE); | ||
322 | UserInfo user3 = | ||
323 | new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE); | ||
324 | UserInfo user4 = createUserInfoForId(13); | ||
325 | UserInfo user5 = new UserInfo(/* id= */ 14, /* name = */ "user14", UserInfo.FLAG_GUEST); | ||
326 | UserInfo user6 = createUserInfoForId(15); | ||
327 | |||
328 | mockGetUsers(user1, user2, user3, user4); | ||
329 | assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse(); | ||
330 | |||
331 | // Add guest user. Verify it doesn't affect the limit. | ||
332 | mockGetUsers(user1, user2, user3, user4, user5); | ||
333 | assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse(); | ||
334 | |||
335 | // Add normal user. Limit is reached | ||
336 | mockGetUsers(user1, user2, user3, user4, user5, user6); | ||
337 | assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue(); | ||
338 | } | ||
339 | |||
340 | @Test | ||
259 | public void testCreateNewAdminUser() { | 341 | public void testCreateNewAdminUser() { |
260 | // Make sure current user is admin, since only admins can create other admins. | 342 | // Make sure current user is admin, since only admins can create other admins. |
261 | doReturn(true).when(mUserManager).isAdminUser(); | 343 | doReturn(true).when(mUserManager).isAdminUser(); |
@@ -366,10 +448,7 @@ public class CarUserManagerHelperTest { | |||
366 | assertThat(mCarUserManagerHelper.removeUser(mSystemUser, mGuestUserName)).isFalse(); | 448 | assertThat(mCarUserManagerHelper.removeUser(mSystemUser, mGuestUserName)).isFalse(); |
367 | 449 | ||
368 | UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN); | 450 | UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN); |
369 | List<UserInfo> users = new ArrayList<UserInfo>(); | 451 | mockGetUsers(adminInfo); |
370 | users.add(adminInfo); | ||
371 | |||
372 | doReturn(users).when(mUserManager).getUsers(true); | ||
373 | 452 | ||
374 | assertThat(mCarUserManagerHelper.removeUser(adminInfo, mGuestUserName)) | 453 | assertThat(mCarUserManagerHelper.removeUser(adminInfo, mGuestUserName)) |
375 | .isEqualTo(false); | 454 | .isEqualTo(false); |
@@ -631,15 +710,9 @@ public class CarUserManagerHelperTest { | |||
631 | UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1); | 710 | UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1); |
632 | UserInfo otherUser3 = createUserInfoForId(lastActiveUserId); | 711 | UserInfo otherUser3 = createUserInfoForId(lastActiveUserId); |
633 | 712 | ||
634 | List<UserInfo> testUsers = new ArrayList<>(); | ||
635 | testUsers.add(mSystemUser); | ||
636 | testUsers.add(otherUser1); | ||
637 | testUsers.add(otherUser2); | ||
638 | testUsers.add(otherUser3); | ||
639 | |||
640 | mCarUserManagerHelper.setLastActiveUser( | 713 | mCarUserManagerHelper.setLastActiveUser( |
641 | lastActiveUserId, /* skipGlobalSettings= */ true); | 714 | lastActiveUserId, /* skipGlobalSettings= */ true); |
642 | doReturn(testUsers).when(mUserManager).getUsers(true); | 715 | mockGetUsers(mSystemUser, otherUser1, otherUser2, otherUser3); |
643 | 716 | ||
644 | assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId); | 717 | assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId); |
645 | } | 718 | } |
@@ -652,14 +725,9 @@ public class CarUserManagerHelperTest { | |||
652 | UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2); | 725 | UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2); |
653 | UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1); | 726 | UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1); |
654 | 727 | ||
655 | List<UserInfo> testUsers = new ArrayList<>(); | ||
656 | testUsers.add(mSystemUser); | ||
657 | testUsers.add(otherUser1); | ||
658 | testUsers.add(otherUser2); | ||
659 | |||
660 | mCarUserManagerHelper.setLastActiveUser( | 728 | mCarUserManagerHelper.setLastActiveUser( |
661 | lastActiveUserId, /* skipGlobalSettings= */ true); | 729 | lastActiveUserId, /* skipGlobalSettings= */ true); |
662 | doReturn(testUsers).when(mUserManager).getUsers(true); | 730 | mockGetUsers(mSystemUser, otherUser1, otherUser2); |
663 | 731 | ||
664 | assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId - 2); | 732 | assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId - 2); |
665 | } | 733 | } |
@@ -669,4 +737,12 @@ public class CarUserManagerHelperTest { | |||
669 | userInfo.id = id; | 737 | userInfo.id = id; |
670 | return userInfo; | 738 | return userInfo; |
671 | } | 739 | } |
740 | |||
741 | private void mockGetUsers(UserInfo... users) { | ||
742 | List<UserInfo> testUsers = new ArrayList<>(); | ||
743 | for (UserInfo user: users) { | ||
744 | testUsers.add(user); | ||
745 | } | ||
746 | doReturn(testUsers).when(mUserManager).getUsers(true); | ||
747 | } | ||
672 | } | 748 | } |
diff --git a/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java b/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java index 9c394459..fcfd6dc0 100644 --- a/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java +++ b/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java | |||
@@ -122,7 +122,7 @@ public class CarUserManagerHelperRoboTest { | |||
122 | } | 122 | } |
123 | 123 | ||
124 | @Test | 124 | @Test |
125 | public void testGetAllUsersExcludesForegroundUser() { | 125 | public void testGetAllUsersExceptForegroundUser() { |
126 | ShadowActivityManager.setCurrentUser(11); | 126 | ShadowActivityManager.setCurrentUser(11); |
127 | ShadowUserManager userManager = ShadowUserManager.getShadow(); | 127 | ShadowUserManager userManager = ShadowUserManager.getShadow(); |
128 | 128 | ||