• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.shadows;
2 
3 import static android.os.Build.VERSION_CODES.M;
4 import static android.os.Build.VERSION_CODES.N;
5 import static android.os.Build.VERSION_CODES.N_MR1;
6 import static android.os.Build.VERSION_CODES.O;
7 import static android.os.Build.VERSION_CODES.Q;
8 import static android.os.Build.VERSION_CODES.R;
9 import static android.os.Build.VERSION_CODES.S;
10 import static android.os.Build.VERSION_CODES.TIRAMISU;
11 import static com.google.common.truth.Truth.assertThat;
12 import static org.junit.Assert.fail;
13 import static org.robolectric.Shadows.shadowOf;
14 
15 import android.Manifest.permission;
16 import android.app.Application;
17 import android.content.BroadcastReceiver;
18 import android.content.Context;
19 import android.content.Intent;
20 import android.content.IntentFilter;
21 import android.content.pm.PackageInfo;
22 import android.content.pm.UserInfo;
23 import android.graphics.Bitmap;
24 import android.os.Build;
25 import android.os.Bundle;
26 import android.os.Looper;
27 import android.os.Parcel;
28 import android.os.PersistableBundle;
29 import android.os.Process;
30 import android.os.UserHandle;
31 import android.os.UserManager;
32 import android.os.UserManager.EnforcingUser;
33 import androidx.test.core.app.ApplicationProvider;
34 import androidx.test.ext.junit.runners.AndroidJUnit4;
35 import java.util.List;
36 import java.util.concurrent.atomic.AtomicReference;
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.junit.runner.RunWith;
40 import org.robolectric.annotation.Config;
41 import org.robolectric.shadow.api.Shadow;
42 import org.robolectric.shadows.ShadowUserManager.UserState;
43 
44 @RunWith(AndroidJUnit4.class)
45 public class ShadowUserManagerTest {
46 
47   private UserManager userManager;
48   private Context context;
49 
50   private static final int TEST_USER_HANDLE = 0;
51   private static final int PROFILE_USER_HANDLE = 2;
52   private static final String PROFILE_USER_NAME = "profile";
53   private static final String SEED_ACCOUNT_NAME = "seed_account_name";
54   private static final String SEED_ACCOUNT_TYPE = "seed_account_type";
55   private static final int PROFILE_USER_FLAGS = 0;
56   private static final Bitmap TEST_USER_ICON = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
57 
58   @Before
setUp()59   public void setUp() {
60     context = ApplicationProvider.getApplicationContext();
61     userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
62   }
63 
64   @Test
shouldGetUserProfiles()65   public void shouldGetUserProfiles() {
66     assertThat(userManager.getUserProfiles()).contains(Process.myUserHandle());
67 
68     UserHandle anotherProfile = newUserHandle(2);
69     shadowOf(userManager).addUserProfile(anotherProfile);
70 
71     assertThat(userManager.getUserProfiles())
72         .containsExactly(Process.myUserHandle(), anotherProfile);
73   }
74 
75   @Test
getUserProfiles_calledFromProfile_shouldReturnList()76   public void getUserProfiles_calledFromProfile_shouldReturnList() {
77     ShadowProcess.setUid(2 * 100000);
78     assertThat(userManager.getUserProfiles()).contains(new UserHandle(2));
79 
80     shadowOf(userManager).addProfile(0, 2, "profile", /* profileFlags= */ 0);
81 
82     assertThat(userManager.getUserProfiles()).containsExactly(new UserHandle(0), new UserHandle(2));
83   }
84 
85   @Test
getUserProfiles_noProfiles_shouldReturnListOfSelf()86   public void getUserProfiles_noProfiles_shouldReturnListOfSelf() {
87     assertThat(userManager.getUserProfiles()).containsExactly(new UserHandle(0));
88   }
89 
90   @Test
testGetApplicationRestrictions()91   public void testGetApplicationRestrictions() {
92     String packageName = context.getPackageName();
93     assertThat(userManager.getApplicationRestrictions(packageName).size()).isEqualTo(0);
94 
95     Bundle restrictions = new Bundle();
96     restrictions.putCharSequence("test_key", "test_value");
97     shadowOf(userManager).setApplicationRestrictions(packageName, restrictions);
98 
99     assertThat(
100             userManager
101                 .getApplicationRestrictions(packageName)
102                 .getCharSequence("test_key")
103                 .toString())
104         .isEqualTo("test_value");
105   }
106 
107   @Test
108   @Config(minSdk = N)
isUserUnlocked()109   public void isUserUnlocked() {
110     assertThat(userManager.isUserUnlocked()).isTrue();
111     shadowOf(userManager).setUserUnlocked(false);
112     assertThat(userManager.isUserUnlocked()).isFalse();
113   }
114 
115   @Test
hasUserRestriction()116   public void hasUserRestriction() {
117     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse();
118 
119     UserHandle userHandle = Process.myUserHandle();
120     shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true);
121 
122     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue();
123   }
124 
125   @Test
setUserRestriction_forGivenUserHandle_setsTheRestriction()126   public void setUserRestriction_forGivenUserHandle_setsTheRestriction() {
127     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse();
128 
129     UserHandle userHandle = Process.myUserHandle();
130     shadowOf(userManager).setUserRestriction(UserManager.ENSURE_VERIFY_APPS, true, userHandle);
131 
132     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue();
133   }
134 
135   @Test
setUserRestriction_forCurrentUser_setsTheRestriction()136   public void setUserRestriction_forCurrentUser_setsTheRestriction() {
137     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse();
138 
139     userManager.setUserRestriction(UserManager.ENSURE_VERIFY_APPS, true);
140 
141     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue();
142   }
143 
144   @Test
getUserRestrictions()145   public void getUserRestrictions() {
146     assertThat(userManager.getUserRestrictions().size()).isEqualTo(0);
147 
148     UserHandle userHandle = Process.myUserHandle();
149     shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true);
150 
151     Bundle restrictions = userManager.getUserRestrictions();
152     assertThat(restrictions.size()).isEqualTo(1);
153     assertThat(restrictions.getBoolean(UserManager.ENSURE_VERIFY_APPS)).isTrue();
154 
155     // make sure that the bundle is not an internal state
156     restrictions.putBoolean("something", true);
157     restrictions = userManager.getUserRestrictions();
158     assertThat(restrictions.size()).isEqualTo(1);
159 
160     shadowOf(userManager).setUserRestriction(newUserHandle(10), UserManager.DISALLOW_CAMERA, true);
161 
162     assertThat(userManager.hasUserRestriction(UserManager.DISALLOW_CAMERA)).isFalse();
163   }
164 
165   @Test
clearUserRestrictions()166   public void clearUserRestrictions() {
167     assertThat(userManager.getUserRestrictions().size()).isEqualTo(0);
168     shadowOf(userManager)
169         .setUserRestriction(Process.myUserHandle(), UserManager.ENSURE_VERIFY_APPS, true);
170     assertThat(userManager.getUserRestrictions().size()).isEqualTo(1);
171 
172     shadowOf(userManager).clearUserRestrictions(Process.myUserHandle());
173     assertThat(userManager.getUserRestrictions().size()).isEqualTo(0);
174   }
175 
176   @Test
isManagedProfile()177   public void isManagedProfile() {
178     assertThat(userManager.isManagedProfile()).isFalse();
179     shadowOf(userManager).setManagedProfile(true);
180     assertThat(userManager.isManagedProfile()).isTrue();
181   }
182 
183   @Test
184   @Config(minSdk = R)
isManagedProfile_usesContextUser()185   public void isManagedProfile_usesContextUser() {
186     shadowOf(userManager)
187         .addProfile(
188             0, PROFILE_USER_HANDLE, PROFILE_USER_NAME, ShadowUserManager.FLAG_MANAGED_PROFILE);
189     assertThat(userManager.isManagedProfile()).isFalse();
190 
191     setUserIdInContext(PROFILE_USER_HANDLE);
192     assertThat(userManager.isManagedProfile()).isTrue();
193   }
194 
195   @Test
196   @Config(minSdk = N)
isManagedProfileWithHandle()197   public void isManagedProfileWithHandle() {
198     shadowOf(userManager).addUser(12, "secondary user", 0);
199     shadowOf(userManager)
200         .addProfile(12, 13, "another managed profile", ShadowUserManager.FLAG_MANAGED_PROFILE);
201     assertThat(userManager.isManagedProfile(13)).isTrue();
202   }
203 
204   @Test
205   @Config(minSdk = S)
isCloneProfile_withSetter()206   public void isCloneProfile_withSetter() {
207     shadowOf(userManager).setCloneProfile(false);
208     assertThat(userManager.isCloneProfile()).isFalse();
209 
210     shadowOf(userManager).setCloneProfile(true);
211     assertThat(userManager.isCloneProfile()).isTrue();
212   }
213 
214   @Test
215   @Config(minSdk = S)
isCloneProfile_usesContextUser()216   public void isCloneProfile_usesContextUser() {
217     assertThat(userManager.isCloneProfile()).isFalse();
218 
219     UserInfo profileUserInfo =
220         new UserInfo(
221             PROFILE_USER_HANDLE,
222             PROFILE_USER_NAME,
223             /* iconPath= */ null,
224             /* profileFlags= */ 0,
225             UserManager.USER_TYPE_PROFILE_CLONE);
226     shadowOf(userManager).addProfile(0, PROFILE_USER_HANDLE, profileUserInfo);
227     assertThat(userManager.isCloneProfile()).isFalse();
228 
229     setUserIdInContext(PROFILE_USER_HANDLE);
230     assertThat(userManager.isCloneProfile()).isTrue();
231   }
232 
233   @Test
234   @Config(minSdk = R)
isProfile_fullUser_returnsFalse()235   public void isProfile_fullUser_returnsFalse() {
236     assertThat(userManager.isProfile()).isFalse();
237   }
238 
239   @Test
240   @Config(minSdk = R)
isProfile_profileUser_returnsTrue()241   public void isProfile_profileUser_returnsTrue() {
242     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
243     shadowOf(userManager).setMaxSupportedUsers(2);
244     UserHandle profileHandle =
245         userManager.createProfile(PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null);
246     assertThat(userManager.isProfile()).isFalse();
247 
248     setUserIdInContext(profileHandle.getIdentifier());
249     assertThat(userManager.isProfile()).isTrue();
250   }
251 
252   @Test
enforcePermissionChecks()253   public void enforcePermissionChecks() {
254     shadowOf(userManager).enforcePermissionChecks(true);
255 
256     try {
257       userManager.isManagedProfile();
258       fail("Expected exception");
259     } catch (SecurityException expected) {
260     }
261 
262     setPermissions(permission.MANAGE_USERS);
263 
264     shadowOf(userManager).setManagedProfile(true);
265 
266     assertThat(userManager.isManagedProfile()).isTrue();
267   }
268 
269   @Test
shouldGetSerialNumberForUser()270   public void shouldGetSerialNumberForUser() {
271     long serialNumberInvalid = -1L;
272 
273     UserHandle userHandle = newUserHandle(10);
274     assertThat(userManager.getSerialNumberForUser(userHandle)).isEqualTo(serialNumberInvalid);
275     assertThat(userManager.getUserSerialNumber(userHandle.getIdentifier()))
276         .isEqualTo(serialNumberInvalid);
277 
278     shadowOf(userManager).addUserProfile(userHandle);
279 
280     assertThat(userManager.getSerialNumberForUser(userHandle)).isNotEqualTo(serialNumberInvalid);
281     assertThat(userManager.getUserSerialNumber(userHandle.getIdentifier()))
282         .isNotEqualTo(serialNumberInvalid);
283   }
284 
285   @Test
getUserForNonExistSerialNumber()286   public void getUserForNonExistSerialNumber() {
287     long nonExistSerialNumber = 121;
288     assertThat(userManager.getUserForSerialNumber(nonExistSerialNumber)).isNull();
289     assertThat(userManager.getUserHandle((int) nonExistSerialNumber)).isEqualTo(-1);
290   }
291 
292   @Test
shouldGetSerialNumberForProfile()293   public void shouldGetSerialNumberForProfile() {
294     long serialNumberInvalid = -1L;
295 
296     assertThat(userManager.getUserSerialNumber(11)).isEqualTo(serialNumberInvalid);
297     shadowOf(userManager).addProfile(10, 11, "profile", 0);
298     assertThat(userManager.getUserSerialNumber(11)).isNotEqualTo(serialNumberInvalid);
299   }
300 
301   @Test
shouldGetUserHandleFromSerialNumberForProfile()302   public void shouldGetUserHandleFromSerialNumberForProfile() {
303     long serialNumberInvalid = -1L;
304 
305     shadowOf(userManager).addProfile(10, 11, "profile", 0);
306     long serialNumber = userManager.getUserSerialNumber(11);
307     assertThat(serialNumber).isNotEqualTo(serialNumberInvalid);
308     assertThat(userManager.getUserHandle((int) serialNumber)).isEqualTo(11);
309   }
310 
311   @Test
getSerialNumberForUser_returnsSetSerialNumberForUser()312   public void getSerialNumberForUser_returnsSetSerialNumberForUser() {
313     UserHandle userHandle = newUserHandle(0);
314     shadowOf(userManager).setSerialNumberForUser(userHandle, 123L);
315     assertThat(userManager.getSerialNumberForUser(userHandle)).isEqualTo(123L);
316   }
317 
318   @Test
getUserHandle()319   public void getUserHandle() {
320     UserHandle expectedUserHandle = shadowOf(userManager).addUser(10, "secondary_user", 0);
321 
322     long serialNumber = userManager.getUserSerialNumber(10);
323     int actualUserHandle = shadowOf(userManager).getUserHandle((int) serialNumber);
324     assertThat(actualUserHandle).isEqualTo(expectedUserHandle.getIdentifier());
325   }
326 
327   @Test
328   @Config(minSdk = R)
getUserHandles()329   public void getUserHandles() {
330     assertThat(shadowOf(userManager).getUserHandles(/* excludeDying= */ true).size()).isEqualTo(1);
331     shadowOf(userManager).getUserHandles(/* excludeDying= */ true).get(0);
332     assertThat(UserHandle.myUserId()).isEqualTo(UserHandle.USER_SYSTEM);
333 
334     UserHandle expectedUserHandle = shadowOf(userManager).addUser(10, "secondary_user", 0);
335     assertThat(shadowOf(userManager).getUserHandles(/* excludeDying= */ true).size()).isEqualTo(2);
336     assertThat(shadowOf(userManager).getUserHandles(/* excludeDying= */ true).get(1))
337         .isEqualTo(expectedUserHandle);
338   }
339 
340   @Test
341   @Config(minSdk = N_MR1, maxSdk = Q)
isDemoUser()342   public void isDemoUser() {
343     // All methods are based on the current user, so no need to pass a UserHandle.
344     assertThat(userManager.isDemoUser()).isFalse();
345 
346     shadowOf(userManager).setIsDemoUser(true);
347     assertThat(userManager.isDemoUser()).isTrue();
348 
349     shadowOf(userManager).setIsDemoUser(false);
350     assertThat(userManager.isDemoUser()).isFalse();
351   }
352 
353   @Test
354   @Config(minSdk = M)
isSystemUser()355   public void isSystemUser() {
356     assertThat(userManager.isSystemUser()).isTrue();
357 
358     shadowOf(userManager).setIsSystemUser(false);
359     assertThat(userManager.isSystemUser()).isFalse();
360 
361     shadowOf(userManager).setIsSystemUser(true);
362     assertThat(userManager.isSystemUser()).isTrue();
363   }
364 
365   @Test
366   @Config(minSdk = N)
isPrimaryUser()367   public void isPrimaryUser() {
368     assertThat(userManager.isPrimaryUser()).isTrue();
369 
370     shadowOf(userManager).setIsPrimaryUser(false);
371     assertThat(userManager.isPrimaryUser()).isFalse();
372 
373     shadowOf(userManager).setIsPrimaryUser(true);
374     assertThat(userManager.isPrimaryUser()).isTrue();
375   }
376 
377   @Test
isLinkedUser()378   public void isLinkedUser() {
379     assertThat(userManager.isLinkedUser()).isFalse();
380 
381     shadowOf(userManager).setIsLinkedUser(true);
382     assertThat(userManager.isLinkedUser()).isTrue();
383 
384     shadowOf(userManager).setIsLinkedUser(false);
385     assertThat(userManager.isLinkedUser()).isFalse();
386   }
387 
388   @Test
389   @Config(minSdk = Build.VERSION_CODES.Q)
isRestrictedProfile()390   public void isRestrictedProfile() {
391     assertThat(userManager.isRestrictedProfile()).isFalse();
392 
393     shadowOf(userManager).setIsRestrictedProfile(true);
394     assertThat(userManager.isRestrictedProfile()).isTrue();
395 
396     shadowOf(userManager).setIsRestrictedProfile(false);
397     assertThat(userManager.isRestrictedProfile()).isFalse();
398   }
399 
400   @Test
401   @Config(minSdk = Build.VERSION_CODES.N)
setSeedAccountName()402   public void setSeedAccountName() {
403     assertThat(userManager.getSeedAccountName()).isNull();
404 
405     shadowOf(userManager).setSeedAccountName(SEED_ACCOUNT_NAME);
406     assertThat(userManager.getSeedAccountName()).isEqualTo(SEED_ACCOUNT_NAME);
407   }
408 
409   @Test
410   @Config(minSdk = Build.VERSION_CODES.N)
setSeedAccountType()411   public void setSeedAccountType() {
412     assertThat(userManager.getSeedAccountType()).isNull();
413 
414     shadowOf(userManager).setSeedAccountType(SEED_ACCOUNT_TYPE);
415     assertThat(userManager.getSeedAccountType()).isEqualTo(SEED_ACCOUNT_TYPE);
416   }
417 
418   @Test
419   @Config(minSdk = Build.VERSION_CODES.N)
setSeedAccountOptions()420   public void setSeedAccountOptions() {
421     assertThat(userManager.getSeedAccountOptions()).isNull();
422 
423     PersistableBundle options = new PersistableBundle();
424     shadowOf(userManager).setSeedAccountOptions(options);
425     assertThat(userManager.getSeedAccountOptions()).isEqualTo(options);
426   }
427 
428   @Test
429   @Config(minSdk = Build.VERSION_CODES.N)
clearSeedAccountData()430   public void clearSeedAccountData() {
431     shadowOf(userManager).setSeedAccountName(SEED_ACCOUNT_NAME);
432     shadowOf(userManager).setSeedAccountType(SEED_ACCOUNT_TYPE);
433     shadowOf(userManager).setSeedAccountOptions(new PersistableBundle());
434 
435     assertThat(userManager.getSeedAccountName()).isNotNull();
436     assertThat(userManager.getSeedAccountType()).isNotNull();
437     assertThat(userManager.getSeedAccountOptions()).isNotNull();
438 
439     userManager.clearSeedAccountData();
440 
441     assertThat(userManager.getSeedAccountName()).isNull();
442     assertThat(userManager.getSeedAccountType()).isNull();
443     assertThat(userManager.getSeedAccountOptions()).isNull();
444   }
445 
446   @Test
isGuestUser()447   public void isGuestUser() {
448     assertThat(userManager.isGuestUser()).isFalse();
449 
450     shadowOf(userManager).setIsGuestUser(true);
451     assertThat(userManager.isGuestUser()).isTrue();
452 
453     shadowOf(userManager).setIsGuestUser(false);
454     assertThat(userManager.isGuestUser()).isFalse();
455   }
456 
457   @Test
isUserRunning()458   public void isUserRunning() {
459     UserHandle userHandle = newUserHandle(0);
460 
461     assertThat(userManager.isUserRunning(userHandle)).isFalse();
462 
463     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED);
464     assertThat(userManager.isUserRunning(userHandle)).isTrue();
465 
466     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED);
467     assertThat(userManager.isUserRunning(userHandle)).isTrue();
468 
469     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING);
470     assertThat(userManager.isUserRunning(userHandle)).isTrue();
471 
472     shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING);
473     assertThat(userManager.isUserRunning(userHandle)).isFalse();
474 
475     shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING);
476     assertThat(userManager.isUserRunning(userHandle)).isFalse();
477 
478     shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN);
479     assertThat(userManager.isUserRunning(userHandle)).isFalse();
480   }
481 
482   @Test
isUserRunningOrStopping()483   public void isUserRunningOrStopping() {
484     UserHandle userHandle = newUserHandle(0);
485 
486     assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse();
487 
488     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED);
489     assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue();
490 
491     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED);
492     assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue();
493 
494     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING);
495     assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue();
496 
497     shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING);
498     assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue();
499 
500     shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING);
501     assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse();
502 
503     shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN);
504     assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse();
505   }
506 
507   @Test
508   @Config(minSdk = R)
isUserUnlockingOrUnlocked()509   public void isUserUnlockingOrUnlocked() {
510     UserHandle userHandle = newUserHandle(0);
511 
512     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse();
513 
514     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED);
515     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isTrue();
516 
517     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED);
518     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse();
519 
520     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING);
521     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isTrue();
522 
523     shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING);
524     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse();
525 
526     shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING);
527     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse();
528 
529     shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN);
530     assertThat(userManager.isUserUnlockingOrUnlocked(userHandle)).isFalse();
531   }
532 
533   @Test
534   @Config(minSdk = 24)
isUserUnlockedByUserHandle()535   public void isUserUnlockedByUserHandle() {
536     UserHandle userHandle = newUserHandle(0);
537 
538     assertThat(userManager.isUserUnlocked(userHandle)).isFalse();
539 
540     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED);
541     assertThat(userManager.isUserUnlocked(userHandle)).isTrue();
542 
543     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED);
544     assertThat(userManager.isUserUnlocked(userHandle)).isFalse();
545 
546     shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING);
547     assertThat(userManager.isUserUnlocked(userHandle)).isFalse();
548 
549     shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING);
550     assertThat(userManager.isUserUnlocked(userHandle)).isFalse();
551 
552     shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING);
553     assertThat(userManager.isUserUnlocked(userHandle)).isFalse();
554 
555     shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN);
556     assertThat(userManager.isUserUnlocked(userHandle)).isFalse();
557   }
558 
559   @Test
addSecondaryUser()560   public void addSecondaryUser() {
561     assertThat(userManager.getUserCount()).isEqualTo(1);
562     UserHandle userHandle = shadowOf(userManager).addUser(10, "secondary_user", 0);
563     assertThat(userHandle.getIdentifier()).isEqualTo(10);
564     assertThat(userManager.getUserCount()).isEqualTo(2);
565   }
566 
567   @Test
removeSecondaryUser()568   public void removeSecondaryUser() {
569     shadowOf(userManager).addUser(10, "secondary_user", 0);
570     assertThat(shadowOf(userManager).removeUser(10)).isTrue();
571     assertThat(userManager.getUserCount()).isEqualTo(1);
572   }
573 
574   @Test
575   @Config(minSdk = Q)
removeSecondaryUser_withUserHandle()576   public void removeSecondaryUser_withUserHandle() {
577     shadowOf(userManager).addUser(10, "secondary_user", 0);
578     assertThat(shadowOf(userManager).removeUser(UserHandle.of(10))).isTrue();
579     assertThat(userManager.getUserCount()).isEqualTo(1);
580   }
581 
582   @Test
583   @Config(minSdk = Q)
removeSecondaryUser_noExistingUser_doesNotRemove()584   public void removeSecondaryUser_noExistingUser_doesNotRemove() {
585     assertThat(shadowOf(userManager).removeUser(UserHandle.of(10))).isFalse();
586     assertThat(userManager.getUserCount()).isEqualTo(1);
587   }
588 
589   @Test
590   @Config(minSdk = TIRAMISU)
removeUserWhenPossible_twoUsersRemoveOne_hasOneUserLeft()591   public void removeUserWhenPossible_twoUsersRemoveOne_hasOneUserLeft() {
592     shadowOf(userManager).addUser(10, "secondary_user", 0);
593     assertThat(
594             userManager.removeUserWhenPossible(
595                 UserHandle.of(10), /* overrideDevicePolicy= */ false))
596         .isEqualTo(UserManager.REMOVE_RESULT_REMOVED);
597     assertThat(userManager.getUserCount()).isEqualTo(1);
598   }
599 
600   @Test
601   @Config(minSdk = TIRAMISU)
removeUserWhenPossible_nonExistingUser_fails()602   public void removeUserWhenPossible_nonExistingUser_fails() {
603     assertThat(
604             userManager.removeUserWhenPossible(
605                 UserHandle.of(10), /* overrideDevicePolicy= */ false))
606         .isEqualTo(UserManager.REMOVE_RESULT_ERROR_UNKNOWN);
607     assertThat(userManager.getUserCount()).isEqualTo(1);
608   }
609 
610   @Test
switchToSecondaryUser()611   public void switchToSecondaryUser() {
612     shadowOf(userManager).addUser(10, "secondary_user", 0);
613     shadowOf(userManager).switchUser(10);
614     assertThat(UserHandle.myUserId()).isEqualTo(10);
615   }
616 
617   @Test
618   @Config(minSdk = M)
switchToSecondaryUser_system()619   public void switchToSecondaryUser_system() {
620     assertThat(userManager.isSystemUser()).isTrue();
621     shadowOf(userManager).addUser(10, "secondary_user", 0);
622     shadowOf(userManager).switchUser(10);
623 
624     assertThat(userManager.isSystemUser()).isFalse();
625   }
626 
627   @Test
628   @Config(minSdk = N)
canSwitchUsers()629   public void canSwitchUsers() {
630     shadowOf(userManager).setCanSwitchUser(false);
631     assertThat(shadowOf(userManager).canSwitchUsers()).isFalse();
632     shadowOf(userManager).setCanSwitchUser(true);
633     assertThat(shadowOf(userManager).canSwitchUsers()).isTrue();
634   }
635 
636   @Test
637   @Config(minSdk = N)
getSerialNumbersOfUsers()638   public void getSerialNumbersOfUsers() {
639     assertThat(userManager.getSerialNumbersOfUsers(true)).hasLength(userManager.getUserCount());
640 
641     UserHandle userHandle = shadowOf(userManager).addUser(10, "secondary_user", 0);
642     int userSerialNumber = userManager.getUserSerialNumber(userHandle.getIdentifier());
643     long[] serialNumbers = userManager.getSerialNumbersOfUsers(true);
644 
645     assertThat(userHandle.getIdentifier()).isEqualTo(10);
646     assertThat(serialNumbers).hasLength(userManager.getUserCount());
647     assertThat(serialNumbers[0] == userSerialNumber || serialNumbers[1] == userSerialNumber)
648         .isTrue();
649   }
650 
651   @Test
getUsers()652   public void getUsers() {
653     assertThat(userManager.getUsers()).hasSize(1);
654     shadowOf(userManager).addUser(10, "secondary_user", 0);
655     assertThat(userManager.getUsers()).hasSize(2);
656     shadowOf(userManager).addProfile(10, 11, "profile", 0);
657     assertThat(userManager.getUsers()).hasSize(3);
658   }
659 
660   @Test
getUserInfo()661   public void getUserInfo() {
662     shadowOf(userManager).addUser(10, "secondary_user", 0);
663     assertThat(userManager.getUserInfo(10)).isNotNull();
664     assertThat(userManager.getUserInfo(10).name).isEqualTo("secondary_user");
665   }
666 
667   @Test
getUserInfoOfProfile()668   public void getUserInfoOfProfile() {
669     shadowOf(userManager).addProfile(10, 11, "profile_user", 0);
670     shadowOf(userManager).addProfile(10, 12, "profile_user_2", 0);
671     shadowOf(userManager).addProfile(13, 14, "profile_user_3", 0);
672     assertThat(userManager.getUserInfo(11)).isNotNull();
673     assertThat(userManager.getUserInfo(11).name).isEqualTo("profile_user");
674     assertThat(userManager.getUserInfo(12)).isNotNull();
675     assertThat(userManager.getUserInfo(12).name).isEqualTo("profile_user_2");
676     assertThat(userManager.getUserInfo(14)).isNotNull();
677     assertThat(userManager.getUserInfo(14).name).isEqualTo("profile_user_3");
678   }
679 
680   @Test
681   @Config(minSdk = N)
switchToUserNotAddedShouldThrowException()682   public void switchToUserNotAddedShouldThrowException() {
683     try {
684       shadowOf(userManager).switchUser(10);
685       fail("Switching to the user that was never added should throw UnsupportedOperationException");
686     } catch (UnsupportedOperationException e) {
687       assertThat(e).hasMessageThat().isEqualTo("Must add user before switching to it");
688     }
689   }
690 
691   @Test
getProfiles_addedProfile_containsProfile()692   public void getProfiles_addedProfile_containsProfile() {
693     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
694     shadowOf(userManager)
695         .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
696 
697     // getProfiles(userId) include user itself and asssociated profiles.
698     assertThat(userManager.getProfiles(TEST_USER_HANDLE).get(0).id).isEqualTo(TEST_USER_HANDLE);
699     assertThat(userManager.getProfiles(TEST_USER_HANDLE).get(1).id).isEqualTo(PROFILE_USER_HANDLE);
700   }
701 
702   @Test
703   @Config(minSdk = R)
getEnabledProfiles()704   public void getEnabledProfiles() {
705     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
706     shadowOf(userManager).addProfile(TEST_USER_HANDLE, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
707     shadowOf(userManager).addProfile(TEST_USER_HANDLE, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
708     shadowOf(userManager).setIsUserEnabled(11, false);
709 
710     assertThat(userManager.getEnabledProfiles()).hasSize(2);
711     assertThat(userManager.getEnabledProfiles().get(0).getIdentifier()).isEqualTo(TEST_USER_HANDLE);
712     assertThat(userManager.getEnabledProfiles().get(1).getIdentifier()).isEqualTo(10);
713   }
714 
715   @Test
716   @Config(minSdk = R)
getAllProfiles()717   public void getAllProfiles() {
718     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
719     shadowOf(userManager).addProfile(TEST_USER_HANDLE, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
720     shadowOf(userManager).addProfile(TEST_USER_HANDLE, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
721     shadowOf(userManager).setIsUserEnabled(11, false);
722 
723     assertThat(userManager.getAllProfiles()).hasSize(3);
724     assertThat(userManager.getAllProfiles().get(0).getIdentifier()).isEqualTo(TEST_USER_HANDLE);
725     assertThat(userManager.getAllProfiles().get(1).getIdentifier()).isEqualTo(10);
726     assertThat(userManager.getAllProfiles().get(2).getIdentifier()).isEqualTo(11);
727   }
728 
729   @Test
730   @Config(minSdk = R)
createProfile_maxUsersReached_returnsNull()731   public void createProfile_maxUsersReached_returnsNull() {
732     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
733     shadowOf(userManager).setMaxSupportedUsers(1);
734     assertThat(
735             userManager.createProfile(
736                 PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null))
737         .isNull();
738   }
739 
740   @Test
741   @Config(minSdk = R)
createProfile_setsGivenUserName()742   public void createProfile_setsGivenUserName() {
743     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
744     shadowOf(userManager).setMaxSupportedUsers(2);
745     userManager.createProfile(PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null);
746 
747     setUserIdInContext(ShadowUserManager.DEFAULT_SECONDARY_USER_ID);
748     assertThat(userManager.getUserName()).isEqualTo(PROFILE_USER_NAME);
749   }
750 
751   @Test
752   @Config(minSdk = R)
createProfile_userIdIncreasesFromDefault()753   public void createProfile_userIdIncreasesFromDefault() {
754     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
755     shadowOf(userManager).setMaxSupportedUsers(3);
756     UserHandle newUser1 =
757         userManager.createProfile("profile A", UserManager.USER_TYPE_PROFILE_MANAGED, null);
758     UserHandle newUser2 =
759         userManager.createProfile("profile B", UserManager.USER_TYPE_PROFILE_MANAGED, null);
760 
761     assertThat(newUser1.getIdentifier()).isEqualTo(ShadowUserManager.DEFAULT_SECONDARY_USER_ID);
762     assertThat(newUser2.getIdentifier()).isEqualTo(ShadowUserManager.DEFAULT_SECONDARY_USER_ID + 1);
763   }
764 
765   @Test
766   @Config(minSdk = Q)
getProfileParent_returnsNullForUser()767   public void getProfileParent_returnsNullForUser() {
768     assertThat(userManager.getProfileParent(UserHandle.of(0))).isNull();
769   }
770 
771   @Test
772   @Config(minSdk = Q)
getProfileParent_returnsNullForParent()773   public void getProfileParent_returnsNullForParent() {
774     shadowOf(userManager)
775         .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
776     assertThat(userManager.getProfileParent(UserHandle.of(TEST_USER_HANDLE))).isNull();
777   }
778 
779   @Test
780   @Config(minSdk = Q)
getProfileParent_returnsParentForProfile()781   public void getProfileParent_returnsParentForProfile() {
782     shadowOf(userManager)
783         .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
784     assertThat(userManager.getProfileParent(UserHandle.of(PROFILE_USER_HANDLE)))
785         .isEqualTo(UserHandle.of(TEST_USER_HANDLE));
786   }
787 
788   @Test
789   @Config(minSdk = R)
isSameProfileGroup_sameNonParentUser_returnsFalse()790   public void isSameProfileGroup_sameNonParentUser_returnsFalse() {
791     assertThat(
792             userManager.isSameProfileGroup(
793                 UserHandle.of(TEST_USER_HANDLE), UserHandle.of(TEST_USER_HANDLE)))
794         .isFalse();
795   }
796 
797   @Test
798   @Config(minSdk = R)
isSameProfileGroup_sameParentUser_returnsTrue()799   public void isSameProfileGroup_sameParentUser_returnsTrue() {
800     shadowOf(userManager)
801         .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
802     assertThat(
803             userManager.isSameProfileGroup(
804                 UserHandle.of(TEST_USER_HANDLE), UserHandle.of(TEST_USER_HANDLE)))
805         .isTrue();
806   }
807 
808   @Test
809   @Config(minSdk = R)
isSameProfileGroup_parentAndProfile_returnsTrue()810   public void isSameProfileGroup_parentAndProfile_returnsTrue() {
811     shadowOf(userManager)
812         .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
813     assertThat(
814             userManager.isSameProfileGroup(
815                 UserHandle.of(PROFILE_USER_HANDLE), UserHandle.of(TEST_USER_HANDLE)))
816         .isTrue();
817   }
818 
819   @Test
820   @Config(minSdk = R)
isSameProfileGroup_twoProfilesOfSameUser_returnsTrue()821   public void isSameProfileGroup_twoProfilesOfSameUser_returnsTrue() {
822     shadowOf(userManager).addProfile(TEST_USER_HANDLE, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
823     shadowOf(userManager).addProfile(TEST_USER_HANDLE, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
824 
825     assertThat(userManager.isSameProfileGroup(UserHandle.of(10), UserHandle.of(11))).isTrue();
826   }
827 
828   @Test
829   @Config(minSdk = R)
isSameProfileGroup_profilesOfDifferentUsers_returnsFalse()830   public void isSameProfileGroup_profilesOfDifferentUsers_returnsFalse() {
831     shadowOf(userManager).addProfile(0, 10, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
832     shadowOf(userManager).addProfile(1, 11, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
833 
834     assertThat(userManager.isSameProfileGroup(UserHandle.of(10), UserHandle.of(11))).isFalse();
835   }
836 
837   @Test
838   @Config(minSdk = R)
setUserName()839   public void setUserName() {
840     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
841     shadowOf(userManager)
842         .addProfile(TEST_USER_HANDLE, PROFILE_USER_HANDLE, PROFILE_USER_NAME, PROFILE_USER_FLAGS);
843 
844     userManager.setUserName("new user name");
845 
846     setUserIdInContext(PROFILE_USER_HANDLE);
847     userManager.setUserName("new profile name");
848     assertThat(userManager.getUserName()).isEqualTo("new profile name");
849 
850     setUserIdInContext(TEST_USER_HANDLE);
851     assertThat(userManager.getUserName()).isEqualTo("new user name");
852   }
853 
854   @Test
855   @Config(minSdk = R)
isUserOfType()856   public void isUserOfType() {
857     shadowOf(userManager).addUser(TEST_USER_HANDLE, "", 0);
858     shadowOf(userManager).setMaxSupportedUsers(2);
859     UserHandle newUser =
860         userManager.createProfile(PROFILE_USER_NAME, UserManager.USER_TYPE_PROFILE_MANAGED, null);
861     assertThat(userManager.isUserOfType(UserManager.USER_TYPE_PROFILE_MANAGED)).isFalse();
862 
863     setUserIdInContext(newUser.getIdentifier());
864     assertThat(userManager.isUserOfType(UserManager.USER_TYPE_PROFILE_MANAGED)).isTrue();
865   }
866 
867   @Test
getMaxSupportedUsers()868   public void getMaxSupportedUsers() {
869     assertThat(UserManager.getMaxSupportedUsers()).isEqualTo(1);
870     shadowOf(userManager).setMaxSupportedUsers(5);
871     assertThat(UserManager.getMaxSupportedUsers()).isEqualTo(5);
872   }
873 
874   @Test
875   @Config(minSdk = N)
supportsMultipleUsers()876   public void supportsMultipleUsers() {
877     assertThat(UserManager.supportsMultipleUsers()).isFalse();
878 
879     shadowOf(userManager).setSupportsMultipleUsers(true);
880     assertThat(UserManager.supportsMultipleUsers()).isTrue();
881   }
882 
883   @Test
884   @Config(minSdk = Q)
getUserSwitchability_shouldReturnLastSetSwitchability()885   public void getUserSwitchability_shouldReturnLastSetSwitchability() {
886     assertThat(userManager.getUserSwitchability()).isEqualTo(UserManager.SWITCHABILITY_STATUS_OK);
887     shadowOf(userManager)
888         .setUserSwitchability(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED);
889     assertThat(userManager.getUserSwitchability())
890         .isEqualTo(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED);
891     shadowOf(userManager).setUserSwitchability(UserManager.SWITCHABILITY_STATUS_OK);
892     assertThat(userManager.getUserSwitchability()).isEqualTo(UserManager.SWITCHABILITY_STATUS_OK);
893   }
894 
895   @Test
896   @Config(minSdk = Q)
setCanSwitchUser_shouldChangeSwitchabilityState()897   public void setCanSwitchUser_shouldChangeSwitchabilityState() {
898     shadowOf(userManager).setCanSwitchUser(false);
899     assertThat(userManager.getUserSwitchability())
900         .isEqualTo(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED);
901     shadowOf(userManager).setCanSwitchUser(true);
902     assertThat(userManager.getUserSwitchability()).isEqualTo(UserManager.SWITCHABILITY_STATUS_OK);
903   }
904 
905   @Test
906   @Config(minSdk = N, maxSdk = Q)
canSwitchUser_shouldReflectSwitchabilityState()907   public void canSwitchUser_shouldReflectSwitchabilityState() {
908     shadowOf(userManager)
909         .setUserSwitchability(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED);
910     assertThat(userManager.canSwitchUsers()).isFalse();
911     shadowOf(userManager).setUserSwitchability(UserManager.SWITCHABILITY_STATUS_OK);
912     assertThat(userManager.canSwitchUsers()).isTrue();
913   }
914 
915   @Test
916   @Config(minSdk = Q)
getUserName_shouldReturnSetUserName()917   public void getUserName_shouldReturnSetUserName() {
918     shadowOf(userManager).setUserSwitchability(UserManager.SWITCHABILITY_STATUS_OK);
919     shadowOf(userManager).addUser(10, PROFILE_USER_NAME, /* flags= */ 0);
920     shadowOf(userManager).switchUser(10);
921     assertThat(userManager.getUserName()).isEqualTo(PROFILE_USER_NAME);
922   }
923 
924   @Test
925   @Config(minSdk = Q)
getUserIcon_shouldReturnSetUserIcon()926   public void getUserIcon_shouldReturnSetUserIcon() {
927     userManager.setUserIcon(TEST_USER_ICON);
928     assertThat(userManager.getUserIcon()).isEqualTo(TEST_USER_ICON);
929 
930     shadowOf(userManager).addUser(10, PROFILE_USER_NAME, /* flags= */ 0);
931     shadowOf(userManager).switchUser(10);
932     assertThat(userManager.getUserIcon()).isNull();
933   }
934 
935   @Test
936   @Config(minSdk = N)
isQuietModeEnabled_shouldReturnFalse()937   public void isQuietModeEnabled_shouldReturnFalse() {
938     assertThat(userManager.isQuietModeEnabled(Process.myUserHandle())).isFalse();
939   }
940 
941   @Test
942   @Config(minSdk = N)
isQuietModeEnabled_withProfile_shouldReturnFalse()943   public void isQuietModeEnabled_withProfile_shouldReturnFalse() {
944     shadowOf(userManager).addProfile(0, 10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE);
945 
946     assertThat(userManager.isQuietModeEnabled(new UserHandle(10))).isFalse();
947   }
948 
949   @Test
950   @Config(minSdk = N)
isQuietModeEnabled_withProfileQuietMode_shouldReturnTrue()951   public void isQuietModeEnabled_withProfileQuietMode_shouldReturnTrue() {
952     shadowOf(userManager)
953         .addProfile(
954             0, 10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE);
955 
956     assertThat(userManager.isQuietModeEnabled(new UserHandle(10))).isTrue();
957   }
958 
959   @Test
960   @Config(minSdk = Q)
requestQuietModeEnabled_withoutPermission_shouldThrowException()961   public void requestQuietModeEnabled_withoutPermission_shouldThrowException() {
962     shadowOf(userManager).enforcePermissionChecks(true);
963 
964     shadowOf(userManager).addProfile(0, 10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE);
965 
966     UserHandle workHandle = new UserHandle(10);
967     try {
968       userManager.requestQuietModeEnabled(true, workHandle);
969       fail("Expected SecurityException.");
970     } catch (SecurityException expected) {
971     }
972   }
973 
974   @Test
975   @Config(minSdk = Q)
requestQuietModeEnabled_withManagedProfile_shouldStopProfileAndEmitBroadcast()976   public void requestQuietModeEnabled_withManagedProfile_shouldStopProfileAndEmitBroadcast() {
977     shadowOf(userManager).enforcePermissionChecks(true);
978     setPermissions(permission.MODIFY_QUIET_MODE);
979 
980     UserHandle workHandle =
981         shadowOf(userManager).addUser(10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE);
982     shadowOf(userManager).setUserState(workHandle, UserState.STATE_RUNNING_UNLOCKED);
983 
984     final AtomicReference<String> receivedAction = new AtomicReference<>();
985     final AtomicReference<UserHandle> receivedHandle = new AtomicReference<>();
986 
987     BroadcastReceiver receiver =
988         new BroadcastReceiver() {
989           @Override
990           public void onReceive(Context context, Intent intent) {
991             receivedAction.set(intent.getAction());
992             receivedHandle.set(intent.getParcelableExtra(Intent.EXTRA_USER));
993           }
994         };
995     IntentFilter intentFilter = new IntentFilter();
996     intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
997     intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
998     context.registerReceiver(receiver, intentFilter);
999 
1000     assertThat(userManager.requestQuietModeEnabled(true, workHandle)).isTrue();
1001     shadowOf(Looper.getMainLooper()).idle();
1002 
1003     assertThat(userManager.isQuietModeEnabled(workHandle)).isTrue();
1004     assertThat(userManager.isUserRunning(workHandle)).isFalse();
1005     assertThat(userManager.getUserInfo(10).flags & UserInfo.FLAG_QUIET_MODE)
1006         .isEqualTo(UserInfo.FLAG_QUIET_MODE);
1007     assertThat(receivedAction.get()).isEqualTo(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
1008     assertThat(receivedHandle.get()).isEqualTo(workHandle);
1009   }
1010 
1011   @Test
1012   @Config(minSdk = Q)
requestQuietModeDisabled_withManagedProfile_shouldStartProfileAndEmitBroadcast()1013   public void requestQuietModeDisabled_withManagedProfile_shouldStartProfileAndEmitBroadcast() {
1014     shadowOf(userManager).enforcePermissionChecks(true);
1015     setPermissions(permission.MODIFY_QUIET_MODE);
1016 
1017     UserHandle workHandle =
1018         shadowOf(userManager)
1019             .addUser(10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE);
1020     shadowOf(userManager).setUserState(workHandle, UserState.STATE_SHUTDOWN);
1021 
1022     final AtomicReference<String> receivedAction = new AtomicReference<>();
1023     final AtomicReference<UserHandle> receivedHandle = new AtomicReference<>();
1024 
1025     BroadcastReceiver receiver =
1026         new BroadcastReceiver() {
1027           @Override
1028           public void onReceive(Context context, Intent intent) {
1029             receivedAction.set(intent.getAction());
1030             receivedHandle.set(intent.getParcelableExtra(Intent.EXTRA_USER));
1031           }
1032         };
1033     IntentFilter intentFilter = new IntentFilter();
1034     intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
1035     intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
1036     context.registerReceiver(receiver, intentFilter);
1037 
1038     assertThat(userManager.requestQuietModeEnabled(false, workHandle)).isTrue();
1039     shadowOf(Looper.getMainLooper()).idle();
1040 
1041     assertThat(userManager.isQuietModeEnabled(workHandle)).isFalse();
1042     assertThat(userManager.isUserRunning(workHandle)).isTrue();
1043     assertThat(userManager.getUserInfo(10).flags & UserInfo.FLAG_QUIET_MODE).isEqualTo(0);
1044     assertThat(receivedAction.get()).isEqualTo(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
1045     assertThat(receivedHandle.get()).isEqualTo(workHandle);
1046   }
1047 
1048   @Test
1049   @Config(minSdk = Q)
requestQuietModeDisabled_withLockedManagedProfile_shouldNotDoAnything()1050   public void requestQuietModeDisabled_withLockedManagedProfile_shouldNotDoAnything() {
1051     shadowOf(userManager).enforcePermissionChecks(true);
1052     setPermissions(permission.MODIFY_QUIET_MODE);
1053 
1054     UserHandle workHandle =
1055         shadowOf(userManager)
1056             .addUser(10, "Work profile", UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_QUIET_MODE);
1057 
1058     final AtomicReference<String> receivedAction = new AtomicReference<>();
1059     final AtomicReference<UserHandle> receivedHandle = new AtomicReference<>();
1060 
1061     BroadcastReceiver receiver =
1062         new BroadcastReceiver() {
1063           @Override
1064           public void onReceive(Context context, Intent intent) {
1065             receivedAction.set(intent.getAction());
1066             receivedHandle.set(intent.getParcelableExtra(Intent.EXTRA_USER));
1067           }
1068         };
1069     IntentFilter intentFilter = new IntentFilter();
1070     intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
1071     intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
1072     context.registerReceiver(receiver, intentFilter);
1073 
1074     shadowOf(userManager).setProfileIsLocked(workHandle, true);
1075 
1076     assertThat(userManager.requestQuietModeEnabled(false, workHandle)).isFalse();
1077     shadowOf(Looper.getMainLooper()).idle();
1078 
1079     assertThat(userManager.isQuietModeEnabled(workHandle)).isTrue();
1080     assertThat(userManager.isUserRunning(workHandle)).isFalse();
1081     assertThat(userManager.getUserInfo(10).flags & UserInfo.FLAG_QUIET_MODE)
1082         .isEqualTo(UserInfo.FLAG_QUIET_MODE);
1083     assertThat(receivedAction.get()).isNull();
1084     assertThat(receivedHandle.get()).isNull();
1085   }
1086 
1087   @Test
1088   @Config(minSdk = TIRAMISU)
someUserHasAccount()1089   public void someUserHasAccount() {
1090     assertThat(userManager.someUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE)).isFalse();
1091 
1092     shadowOf(userManager).setSomeUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE);
1093     assertThat(userManager.someUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE)).isTrue();
1094 
1095     shadowOf(userManager).removeSomeUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE);
1096     assertThat(userManager.someUserHasAccount(SEED_ACCOUNT_NAME, SEED_ACCOUNT_TYPE)).isFalse();
1097   }
1098 
1099   @Test
1100   @Config(minSdk = S)
isUserForeground_defaultValue_returnsTrue()1101   public void isUserForeground_defaultValue_returnsTrue() {
1102     assertThat(userManager.isUserForeground()).isTrue();
1103   }
1104 
1105   @Test
1106   @Config(minSdk = S)
isUserForeground_overridden_returnsNewValue()1107   public void isUserForeground_overridden_returnsNewValue() {
1108     shadowOf(userManager).setUserForeground(false);
1109 
1110     assertThat(userManager.isUserForeground()).isFalse();
1111   }
1112 
1113   @Test
1114   @Config(minSdk = S)
isUserForeground_valueToggled_returnsLatestValue()1115   public void isUserForeground_valueToggled_returnsLatestValue() {
1116     shadowOf(userManager).setUserForeground(false);
1117     shadowOf(userManager).setUserForeground(true);
1118 
1119     assertThat(userManager.isUserForeground()).isTrue();
1120   }
1121 
1122   @Test
1123   @Config(minSdk = O)
getEnforcingUsers()1124   public void getEnforcingUsers() {
1125     UserHandle userHandle = Process.myUserHandle();
1126 
1127     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse();
1128     assertThat(userManager.getUserRestrictionSources(UserManager.ENSURE_VERIFY_APPS, userHandle))
1129         .isEmpty();
1130 
1131     shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true);
1132     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue();
1133 
1134     List<EnforcingUser> sources =
1135         userManager.getUserRestrictionSources(UserManager.ENSURE_VERIFY_APPS, userHandle);
1136     assertThat(sources.get(0).getUserRestrictionSource())
1137         .isEqualTo(UserManager.RESTRICTION_SOURCE_SYSTEM);
1138 
1139     shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, false);
1140     assertThat(userManager.getUserRestrictionSources(UserManager.ENSURE_VERIFY_APPS, userHandle))
1141         .isEmpty();
1142   }
1143 
1144   // Create user handle from parcel since UserHandle.of() was only added in later APIs.
newUserHandle(int uid)1145   private static UserHandle newUserHandle(int uid) {
1146     Parcel userParcel = Parcel.obtain();
1147     userParcel.writeInt(uid);
1148     userParcel.setDataPosition(0);
1149     return new UserHandle(userParcel);
1150   }
1151 
setUserIdInContext(int userId)1152   private static void setUserIdInContext(int userId) {
1153     Application application = ApplicationProvider.getApplicationContext();
1154     ShadowContextImpl shadowContext = Shadow.extract(application.getBaseContext());
1155     shadowContext.setUserId(userId);
1156   }
1157 
setPermissions(String... permissions)1158   private static void setPermissions(String... permissions) {
1159     Application context = ApplicationProvider.getApplicationContext();
1160     PackageInfo packageInfo =
1161         shadowOf(context.getPackageManager())
1162             .getInternalMutablePackageInfo(context.getPackageName());
1163     packageInfo.requestedPermissions = permissions;
1164   }
1165 }
1166