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