summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjovanak2018-06-26 20:45:30 -0500
committerjovanak2018-06-28 11:37:06 -0500
commit10e6ff0f6ccadc9661ccbab12e625d9a6648bf27 (patch)
treeb9d743b24ff9abef34e4861efe3828aac6a7d410
parent1ab32b66ef7467e536df727b0b9419dd31556a8e (diff)
downloadplatform-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
-rw-r--r--car-lib/src/android/car/user/CarUserManagerHelper.java76
-rw-r--r--tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java156
-rw-r--r--tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java2
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;
51import org.mockito.MockitoAnnotations; 51import org.mockito.MockitoAnnotations;
52 52
53import java.util.ArrayList; 53import java.util.ArrayList;
54import java.util.Arrays;
55import java.util.List; 54import 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