• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.documentsui;
18 
19 import static com.android.documentsui.DevicePolicyResources.Drawables.Style.SOLID_COLORED;
20 import static com.android.documentsui.DevicePolicyResources.Drawables.WORK_PROFILE_ICON;
21 import static com.android.documentsui.DevicePolicyResources.Strings.PERSONAL_TAB;
22 import static com.android.documentsui.DevicePolicyResources.Strings.WORK_TAB;
23 
24 import static com.google.common.truth.Truth.assertWithMessage;
25 
26 import static org.junit.Assume.assumeFalse;
27 import static org.junit.Assume.assumeTrue;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.ArgumentMatchers.eq;
30 import static org.mockito.Mockito.any;
31 import static org.mockito.Mockito.anyInt;
32 import static org.mockito.Mockito.mock;
33 import static org.mockito.Mockito.when;
34 
35 import android.Manifest;
36 import android.app.admin.DevicePolicyManager;
37 import android.app.admin.DevicePolicyResourcesManager;
38 import android.content.Context;
39 import android.content.Intent;
40 import android.content.pm.PackageManager;
41 import android.content.pm.ResolveInfo;
42 import android.content.pm.UserProperties;
43 import android.content.res.Resources;
44 import android.graphics.drawable.Drawable;
45 import android.os.UserHandle;
46 import android.os.UserManager;
47 
48 import androidx.test.filters.SdkSuppress;
49 import androidx.test.filters.SmallTest;
50 import androidx.test.platform.app.InstrumentationRegistry;
51 
52 import com.android.documentsui.base.UserId;
53 import com.android.documentsui.testing.UserManagers;
54 import com.android.documentsui.util.VersionUtils;
55 import com.android.modules.utils.build.SdkLevel;
56 
57 import com.google.common.collect.Lists;
58 
59 import org.junit.Before;
60 import org.junit.Test;
61 
62 import java.util.ArrayList;
63 import java.util.HashMap;
64 import java.util.List;
65 import java.util.Map;
66 
67 @SmallTest
68 @SdkSuppress(minSdkVersion = 31, codeName = "S")
69 public class UserManagerStateTest {
70 
71     /**
72      * Class that exposes the @hide api [targetUserId] in order to supply proper values for
73      * reflection based code that is inspecting this field.
74      *
75      * @property targetUserId
76      */
77     private static class ReflectedResolveInfo extends ResolveInfo {
78 
79         public int targetUserId;
80 
ReflectedResolveInfo(int targetUserId)81         ReflectedResolveInfo(int targetUserId) {
82             this.targetUserId = targetUserId;
83         }
84 
85         @Override
isCrossProfileIntentForwarderActivity()86         public boolean isCrossProfileIntentForwarderActivity() {
87             return true;
88         }
89     }
90 
91     private static final String PERSONAL = "Personal";
92     private static final String WORK = "Work";
93     private static final String PRIVATE = "Private";
94     private static final String PACKAGE_NAME = "com.android.documentsui";
95 
96     /**
97      * Assume that the current user is SYSTEM_USER. For HSUM targets, the primary user is set as the
98      * system user.
99      */
100     private final int mCurrentUserId = UserHandle.myUserId();
101 
102     private final UserHandle mPrimaryUser = UserHandle.of(mCurrentUserId);
103     private final UserHandle mSystemUser = mPrimaryUser == null ? UserHandle.SYSTEM : mPrimaryUser;
104     private final UserHandle mManagedUser = UserHandle.of(mCurrentUserId + 10);
105     private final UserHandle mPrivateUser = UserHandle.of(mCurrentUserId + 20);
106     private final UserHandle mOtherUser = UserHandle.of(mCurrentUserId + 30);
107     private final UserHandle mNormalUser = UserHandle.of(mCurrentUserId + 40);
108 
109     private final ResolveInfo mMockInfoPrimaryUser =
110             new ReflectedResolveInfo(mPrimaryUser.getIdentifier());
111     private final ResolveInfo mMockInfoManagedUser =
112             new ReflectedResolveInfo(mManagedUser.getIdentifier());
113     private final ResolveInfo mMockInfoPrivateUser =
114             new ReflectedResolveInfo(mPrivateUser.getIdentifier());
115 
116     private final Context mMockContext = mock(Context.class);
117     private final Intent mMockIntent = new Intent();
118     private final UserManager mMockUserManager = UserManagers.create();
119     private final PackageManager mMockPackageManager = mock(PackageManager.class);
120     private final DevicePolicyManager mDevicePolicyManager = mock(DevicePolicyManager.class);
121     private UserManagerState mUserManagerState;
122 
123     @Before
setup()124     public void setup() throws Exception {
125         when(mMockContext.getApplicationContext()).thenReturn(mMockContext);
126         when(mMockContext.createContextAsUser(any(UserHandle.class), anyInt()))
127                 .thenReturn(mMockContext);
128 
129         when(mMockUserManager.isManagedProfile(mManagedUser.getIdentifier())).thenReturn(true);
130         when(mMockUserManager.isManagedProfile(mSystemUser.getIdentifier())).thenReturn(false);
131         when(mMockUserManager.isManagedProfile(mPrivateUser.getIdentifier())).thenReturn(false);
132         when(mMockUserManager.isManagedProfile(mOtherUser.getIdentifier())).thenReturn(false);
133 
134         if (SdkLevel.isAtLeastV()) {
135             UserProperties systemUserProperties =
136                     new UserProperties.Builder()
137                             .setShowInSharingSurfaces(
138                                     UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE)
139                             .setCrossProfileContentSharingStrategy(
140                                     UserProperties.CROSS_PROFILE_CONTENT_SHARING_NO_DELEGATION)
141                             .build();
142             UserProperties managedUserProperties =
143                     new UserProperties.Builder()
144                             .setShowInSharingSurfaces(
145                                     UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE)
146                             .setCrossProfileContentSharingStrategy(
147                                     UserProperties.CROSS_PROFILE_CONTENT_SHARING_NO_DELEGATION)
148                             .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_PAUSED)
149                             .build();
150             UserProperties privateUserProperties =
151                     new UserProperties.Builder()
152                             .setShowInSharingSurfaces(
153                                     UserProperties.SHOW_IN_SHARING_SURFACES_SEPARATE)
154                             .setCrossProfileContentSharingStrategy(
155                                     UserProperties
156                                             .CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
157                             .setShowInQuietMode(UserProperties.SHOW_IN_QUIET_MODE_HIDDEN)
158                             .build();
159             UserProperties otherUserProperties =
160                     new UserProperties.Builder()
161                             .setShowInSharingSurfaces(
162                                     UserProperties.SHOW_IN_SHARING_SURFACES_WITH_PARENT)
163                             .setCrossProfileContentSharingStrategy(
164                                     UserProperties
165                                             .CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
166                             .build();
167             UserProperties normalUserProperties =
168                     new UserProperties.Builder()
169                             .setShowInSharingSurfaces(UserProperties.SHOW_IN_SHARING_SURFACES_NO)
170                             .setCrossProfileContentSharingStrategy(
171                                     UserProperties
172                                             .CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
173                             .build();
174             when(mMockUserManager.getUserProperties(mSystemUser)).thenReturn(systemUserProperties);
175             when(mMockUserManager.getUserProperties(mManagedUser))
176                     .thenReturn(managedUserProperties);
177             when(mMockUserManager.getUserProperties(mPrivateUser))
178                     .thenReturn(privateUserProperties);
179             when(mMockUserManager.getUserProperties(mOtherUser)).thenReturn(otherUserProperties);
180             when(mMockUserManager.getUserProperties(mNormalUser)).thenReturn(normalUserProperties);
181         }
182 
183         when(mMockUserManager.getProfileParent(mSystemUser)).thenReturn(null);
184         when(mMockUserManager.getProfileParent(mManagedUser)).thenReturn(mPrimaryUser);
185         when(mMockUserManager.getProfileParent(mPrivateUser)).thenReturn(mPrimaryUser);
186         when(mMockUserManager.getProfileParent(mOtherUser)).thenReturn(mPrimaryUser);
187         when(mMockUserManager.getProfileParent(mNormalUser)).thenReturn(null);
188 
189         when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
190         when(mMockContext.getSystemServiceName(UserManager.class)).thenReturn("mMockUserManager");
191         when(mMockContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
192         when(mMockContext.getSystemServiceName(DevicePolicyManager.class))
193                 .thenReturn(Context.DEVICE_POLICY_SERVICE);
194         when(mMockContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
195                 .thenReturn(mDevicePolicyManager);
196         when(mMockContext.getResources())
197                 .thenReturn(
198                         InstrumentationRegistry.getInstrumentation()
199                                 .getTargetContext()
200                                 .getResources());
201 
202         when(mMockContext.getPackageName()).thenReturn(PACKAGE_NAME);
203         when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, 0, mSystemUser))
204                 .thenReturn(mMockContext);
205         when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, 0, mManagedUser))
206                 .thenReturn(mMockContext);
207         when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, 0, mPrivateUser))
208                 .thenReturn(mMockContext);
209         when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, 0, mOtherUser))
210                 .thenReturn(mMockContext);
211         when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, 0, mNormalUser))
212                 .thenReturn(mMockContext);
213         when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, 0, mPrimaryUser))
214                 .thenReturn(mMockContext);
215     }
216 
217     @Test
testGetUserIds_onlySystemUser_returnsSystemUser()218     public void testGetUserIds_onlySystemUser_returnsSystemUser() {
219         UserId currentUser = UserId.of(mSystemUser);
220         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser));
221 
222         assertWithMessage("getUserIds returns unexpected list of user ids")
223                 .that(mUserManagerState.getUserIds())
224                 .containsExactly(UserId.of(mSystemUser));
225     }
226 
227     @Test
testGetUserIds_allProfilesCurrentUserSystem_allShowInSharingSurfacesSeparate()228     public void testGetUserIds_allProfilesCurrentUserSystem_allShowInSharingSurfacesSeparate() {
229         assumeTrue(SdkLevel.isAtLeastV());
230         UserId currentUser = UserId.of(mSystemUser);
231         initializeUserManagerState(
232                 currentUser,
233                 Lists.newArrayList(
234                         mSystemUser, mManagedUser, mPrivateUser, mOtherUser, mNormalUser));
235 
236         assertWithMessage("getUserIds returns unexpected list of user ids")
237                 .that(mUserManagerState.getUserIds())
238                 .containsExactly(
239                         UserId.of(mSystemUser), UserId.of(mManagedUser), UserId.of(mPrivateUser));
240     }
241 
242     @Test
testGetUserIds_allProfilesCurrentUserManaged_allShowInSharingSurfacesSeparate()243     public void testGetUserIds_allProfilesCurrentUserManaged_allShowInSharingSurfacesSeparate() {
244         assumeTrue(SdkLevel.isAtLeastV());
245         UserId currentUser = UserId.of(mManagedUser);
246         initializeUserManagerState(
247                 currentUser,
248                 Lists.newArrayList(
249                         mSystemUser, mManagedUser, mPrivateUser, mOtherUser, mNormalUser));
250 
251         assertWithMessage("getUserIds returns unexpected list of user ids")
252                 .that(mUserManagerState.getUserIds())
253                 .containsExactly(
254                         UserId.of(mSystemUser), UserId.of(mManagedUser), UserId.of(mPrivateUser));
255     }
256 
257     @Test
testGetUserIds_allProfilesCurrentUserPrivate_allShowInSharingSurfacesSeparate()258     public void testGetUserIds_allProfilesCurrentUserPrivate_allShowInSharingSurfacesSeparate() {
259         assumeTrue(SdkLevel.isAtLeastV());
260         UserId currentUser = UserId.of(mPrivateUser);
261         initializeUserManagerState(
262                 currentUser,
263                 Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser));
264 
265         assertWithMessage("getUserIds returns unexpected list of user ids")
266                 .that(mUserManagerState.getUserIds())
267                 .containsExactly(
268                         UserId.of(mSystemUser), UserId.of(mManagedUser), UserId.of(mPrivateUser));
269     }
270 
271     @Test
testGetUserIds_systemAndManagedUserCurrentUserSystem_returnsBoth()272     public void testGetUserIds_systemAndManagedUserCurrentUserSystem_returnsBoth() {
273         UserId currentUser = UserId.of(mSystemUser);
274         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
275 
276         assertWithMessage("getUserIds returns unexpected list of user ids")
277                 .that(mUserManagerState.getUserIds())
278                 .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser));
279     }
280 
281     @Test
testGetUserIds_systemAndManagedUserCurrentUserManaged_returnsBoth()282     public void testGetUserIds_systemAndManagedUserCurrentUserManaged_returnsBoth() {
283         UserId currentUser = UserId.of(mManagedUser);
284         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
285 
286         assertWithMessage("getUserIds returns unexpected list of user ids")
287                 .that(mUserManagerState.getUserIds())
288                 .containsExactly(UserId.of(mSystemUser), UserId.of(mManagedUser));
289     }
290 
291     @Test
testGetUserIds_systemAndPrivateUserCurrentUserSystem_returnsBoth()292     public void testGetUserIds_systemAndPrivateUserCurrentUserSystem_returnsBoth() {
293         assumeTrue(SdkLevel.isAtLeastV());
294         UserId currentUser = UserId.of(mSystemUser);
295         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
296 
297         assertWithMessage("getUserIds returns unexpected list of user ids")
298                 .that(mUserManagerState.getUserIds())
299                 .containsExactly(UserId.of(mSystemUser), UserId.of(mPrivateUser));
300     }
301 
302     @Test
testGetUserIds_systemAndPrivateUserCurrentUserPrivate_returnsBoth()303     public void testGetUserIds_systemAndPrivateUserCurrentUserPrivate_returnsBoth() {
304         assumeTrue(SdkLevel.isAtLeastV());
305         UserId currentUser = UserId.of(mPrivateUser);
306         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
307 
308         assertWithMessage("getUserIds returns unexpected list of user ids")
309                 .that(mUserManagerState.getUserIds())
310                 .containsExactly(UserId.of(mSystemUser), UserId.of(mPrivateUser));
311     }
312 
313     @Test
testGetUserIds_unsupportedDeviceCurrent_returnsCurrentUser()314     public void testGetUserIds_unsupportedDeviceCurrent_returnsCurrentUser() {
315         // This test only tests for Android R or later. This test case always passes
316         // before R.
317         if (VersionUtils.isAtLeastR()) {
318             // When permission is denied, only returns the current user.
319             when(mMockContext.checkSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS))
320                     .thenReturn(PackageManager.PERMISSION_DENIED);
321             UserId currentUser = UserId.of(mSystemUser);
322             when(mMockUserManager.getUserProfiles())
323                     .thenReturn(
324                             Lists.newArrayList(
325                                     mSystemUser, mManagedUser, mPrivateUser, mOtherUser));
326             mUserManagerState = UserManagerState.create(mMockContext);
327             assertWithMessage("Unsupported device should have returned only the current user")
328                     .that(mUserManagerState.getUserIds())
329                     .containsExactly(currentUser);
330         }
331     }
332 
333     @Test
testGetUserIds_returnCachedList()334     public void testGetUserIds_returnCachedList() {
335         // Returns all three if there are system, managed and private users.
336         UserId currentUser = UserId.of(mSystemUser);
337         initializeUserManagerState(
338                 currentUser,
339                 Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser, mOtherUser));
340         assertWithMessage("getUserIds does not return cached instance")
341                 .that(mUserManagerState.getUserIds())
342                 .isSameInstanceAs(mUserManagerState.getUserIds());
343     }
344 
345     @Test
testGetCanForwardToProfileIdMap_systemUserCanForwardToManaged()346     public void testGetCanForwardToProfileIdMap_systemUserCanForwardToManaged() {
347         UserId currentUser = UserId.of(mSystemUser);
348         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
349         final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfoManagedUser);
350 
351         when(mMockPackageManager.queryIntentActivitiesAsUser(
352                         any(Intent.class), anyInt(), eq(mSystemUser)))
353                 .thenReturn(mMockResolveInfoList);
354 
355         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
356         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
357         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
358 
359         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
360                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
361                 .isEqualTo(expectedCanForwardToProfileIdMap);
362     }
363 
364     @Test
testGetCanForwardToProfileIdMap_systemUserCanAlwaysForwardToPrivate()365     public void testGetCanForwardToProfileIdMap_systemUserCanAlwaysForwardToPrivate() {
366         assumeTrue(SdkLevel.isAtLeastV());
367         UserId currentUser = UserId.of(mSystemUser);
368         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
369 
370         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
371         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
372         expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
373 
374         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
375                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
376                 .isEqualTo(expectedCanForwardToProfileIdMap);
377     }
378 
379     @Test
testGetCanForwardToProfileIdMap_systemUserCanNotForwardToManagedUser()380     public void testGetCanForwardToProfileIdMap_systemUserCanNotForwardToManagedUser() {
381         UserId currentUser = UserId.of(mSystemUser);
382         final List<ResolveInfo> mMockResolveInfoList =
383                 Lists.newArrayList(mMockInfoPrivateUser, mMockInfoPrimaryUser);
384         if (SdkLevel.isAtLeastV()) {
385             initializeUserManagerState(
386                     currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
387             when(mMockPackageManager.queryIntentActivitiesAsUser(
388                             mMockIntent, PackageManager.MATCH_DEFAULT_ONLY, mSystemUser))
389                     .thenReturn(mMockResolveInfoList);
390         } else {
391             initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
392             when(mMockPackageManager.queryIntentActivitiesAsUser(
393                             mMockIntent, PackageManager.MATCH_DEFAULT_ONLY, mSystemUser))
394                     .thenReturn(mMockResolveInfoList);
395         }
396 
397         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
398         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
399         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), false);
400         if (SdkLevel.isAtLeastV()) {
401             expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
402         }
403 
404         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
405                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
406                 .isEqualTo(expectedCanForwardToProfileIdMap);
407     }
408 
409     @Test
testGetCanForwardToProfileIdMap_managedCanForwardToAllVPlus()410     public void testGetCanForwardToProfileIdMap_managedCanForwardToAllVPlus() {
411         assumeTrue(SdkLevel.isAtLeastV());
412 
413         UserId currentUser = UserId.of(mManagedUser);
414         final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfoPrimaryUser);
415         when(mMockPackageManager.queryIntentActivitiesAsUser(
416                         any(Intent.class), anyInt(), eq(mManagedUser)))
417                 .thenReturn(mMockResolveInfoList);
418 
419         initializeUserManagerState(
420                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
421 
422         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
423         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
424         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
425         expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
426 
427         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
428                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
429                 .isEqualTo(expectedCanForwardToProfileIdMap);
430     }
431 
432     @Test
testGetCanForwardToProfileIdMap_managedCanForwardToAllUMinus()433     public void testGetCanForwardToProfileIdMap_managedCanForwardToAllUMinus() {
434         assumeFalse(SdkLevel.isAtLeastV());
435 
436         UserId currentUser = UserId.of(mManagedUser);
437         final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfoPrimaryUser);
438         when(mMockPackageManager.queryIntentActivitiesAsUser(
439                         any(Intent.class), anyInt(), eq(mManagedUser)))
440                 .thenReturn(mMockResolveInfoList);
441 
442         initializeUserManagerState(
443                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
444 
445         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
446         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
447         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
448 
449         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
450                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
451                 .isEqualTo(expectedCanForwardToProfileIdMap);
452     }
453 
454     @Test
testGetCanForwardToProfileIdMap_managedCanNotForwardToAll()455     public void testGetCanForwardToProfileIdMap_managedCanNotForwardToAll() {
456         UserId currentUser = UserId.of(mManagedUser);
457         final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfoPrimaryUser);
458 
459         if (SdkLevel.isAtLeastV()) {
460             initializeUserManagerState(
461                     currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
462             when(mMockPackageManager.queryIntentActivitiesAsUser(
463                             mMockIntent, PackageManager.MATCH_DEFAULT_ONLY, mSystemUser))
464                     .thenReturn(mMockResolveInfoList);
465         } else {
466             initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
467             when(mMockPackageManager.queryIntentActivities(
468                             mMockIntent, PackageManager.MATCH_DEFAULT_ONLY))
469                     .thenReturn(mMockResolveInfoList);
470         }
471 
472         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
473         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), false);
474         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
475         if (SdkLevel.isAtLeastV()) {
476             expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), false);
477         }
478 
479         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
480                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
481                 .isEqualTo(expectedCanForwardToProfileIdMap);
482     }
483 
484     @Test
testGetCanForwardToProfileIdMap_privateCanForwardToAll()485     public void testGetCanForwardToProfileIdMap_privateCanForwardToAll() {
486         assumeTrue(SdkLevel.isAtLeastV());
487         UserId currentUser = UserId.of(mPrivateUser);
488         initializeUserManagerState(
489                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
490         final List<ResolveInfo> mMockResolveInfoList =
491                 Lists.newArrayList(mMockInfoPrimaryUser, mMockInfoManagedUser);
492         when(mMockPackageManager.queryIntentActivitiesAsUser(
493                         any(Intent.class), anyInt(), eq(mSystemUser)))
494                 .thenReturn(mMockResolveInfoList);
495 
496         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
497         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
498         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), true);
499         expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
500 
501         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
502                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
503                 .isEqualTo(expectedCanForwardToProfileIdMap);
504     }
505 
506     @Test
testGetCanForwardToProfileIdMap_privateCanNotForwardToManagedUser()507     public void testGetCanForwardToProfileIdMap_privateCanNotForwardToManagedUser() {
508         assumeTrue(SdkLevel.isAtLeastV());
509         UserId currentUser = UserId.of(mPrivateUser);
510         initializeUserManagerState(
511                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
512         final List<ResolveInfo> mMockResolveInfoList =
513                 Lists.newArrayList(mMockInfoPrivateUser, mMockInfoPrimaryUser);
514         when(mMockPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
515                 .thenReturn(mMockResolveInfoList);
516 
517         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
518         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
519         expectedCanForwardToProfileIdMap.put(UserId.of(mManagedUser), false);
520         expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
521 
522         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
523                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
524                 .isEqualTo(expectedCanForwardToProfileIdMap);
525     }
526 
527     @Test
testGetCanForwardToProfileIdMap_privateCanAlwaysForwardToSystemUser()528     public void testGetCanForwardToProfileIdMap_privateCanAlwaysForwardToSystemUser() {
529         assumeTrue(SdkLevel.isAtLeastV());
530         UserId currentUser = UserId.of(mPrivateUser);
531         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mPrivateUser));
532 
533         final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfoPrimaryUser);
534         when(mMockPackageManager.queryIntentActivities(any(Intent.class), anyInt()))
535                 .thenReturn(mMockResolveInfoList);
536 
537         Map<UserId, Boolean> expectedCanForwardToProfileIdMap = new HashMap<>();
538         expectedCanForwardToProfileIdMap.put(UserId.of(mSystemUser), true);
539         expectedCanForwardToProfileIdMap.put(UserId.of(mPrivateUser), true);
540 
541         assertWithMessage("getCanForwardToProfileIdMap returns incorrect mappings")
542                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
543                 .isEqualTo(expectedCanForwardToProfileIdMap);
544     }
545 
546     @Test
testOnProfileStatusChange_anyIntentActionForManagedProfile()547     public void testOnProfileStatusChange_anyIntentActionForManagedProfile() {
548         assumeTrue(SdkLevel.isAtLeastV());
549         UserId currentUser = UserId.of(mSystemUser);
550         initializeUserManagerState(
551                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
552 
553         // UserManagerState#mUserId and UserManagerState#mCanForwardToProfileIdMap will
554         // empty
555         // by default if the getters of these member variables have not been called
556         List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
557         Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent =
558                 new HashMap<>(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
559 
560         String action = "any_intent";
561         mUserManagerState.onProfileActionStatusChange(action, UserId.of(mManagedUser));
562 
563         assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
564                 .that(mUserManagerState.getUserIds())
565                 .isEqualTo(userIdsBeforeIntent);
566         assertWithMessage(
567                         "Unexpected changes to canForwardToProfileIdMap on receiving intent: "
568                                 + action)
569                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
570                 .isEqualTo(canForwardToProfileIdMapBeforeIntent);
571     }
572 
573     @Test
testOnProfileStatusChange_actionProfileUnavailableForPrivateProfile()574     public void testOnProfileStatusChange_actionProfileUnavailableForPrivateProfile() {
575         assumeTrue(SdkLevel.isAtLeastV());
576         UserId currentUser = UserId.of(mSystemUser);
577         UserId managedUser = UserId.of(mManagedUser);
578         UserId privateUser = UserId.of(mPrivateUser);
579         final List<ResolveInfo> mMockResolveInfoList =
580                 Lists.newArrayList(mMockInfoManagedUser, mMockInfoPrivateUser);
581         when(mMockPackageManager.queryIntentActivitiesAsUser(
582                         mMockIntent, PackageManager.MATCH_DEFAULT_ONLY, mSystemUser))
583                 .thenReturn(mMockResolveInfoList);
584         initializeUserManagerState(
585                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
586 
587         // UserManagerState#mUserId and UserManagerState#mCanForwardToProfileIdMap will
588         // empty by default if the getters of these member variables have not been called
589         List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
590         Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent =
591                 new HashMap<>(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
592 
593         List<UserId> expectedUserIdsAfterIntent = Lists.newArrayList(currentUser, managedUser);
594 
595         String action = Intent.ACTION_PROFILE_UNAVAILABLE;
596         mUserManagerState.onProfileActionStatusChange(action, privateUser);
597 
598         assertWithMessage(
599                         "UserIds list should not be same before and after receiving intent: "
600                                 + action)
601                 .that(mUserManagerState.getUserIds())
602                 .isNotEqualTo(userIdsBeforeIntent);
603         assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
604                 .that(mUserManagerState.getUserIds())
605                 .isEqualTo(expectedUserIdsAfterIntent);
606         assertWithMessage(
607                         "CanForwardToLabelMap should be same before and after receiving intent: "
608                                 + action)
609                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
610                 .isEqualTo(canForwardToProfileIdMapBeforeIntent);
611     }
612 
613     @Test
testOnProfileStatusChange_actionProfileAvailable_profileInitialised()614     public void testOnProfileStatusChange_actionProfileAvailable_profileInitialised() {
615         assumeTrue(SdkLevel.isAtLeastV());
616         UserId currentUser = UserId.of(mSystemUser);
617         UserId managedUser = UserId.of(mManagedUser);
618         UserId privateUser = UserId.of(mPrivateUser);
619         final List<ResolveInfo> mMockResolveInfoList =
620                 Lists.newArrayList(mMockInfoManagedUser);
621         when(mMockPackageManager.queryIntentActivitiesAsUser(
622                         mMockIntent, PackageManager.MATCH_DEFAULT_ONLY, mSystemUser))
623                 .thenReturn(mMockResolveInfoList);
624         initializeUserManagerState(
625                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
626 
627         // initialising the userIds list and canForwardToProfileIdMap
628         mUserManagerState.getUserIds();
629         mUserManagerState.getCanForwardToProfileIdMap(mMockIntent);
630 
631         // Making the private profile unavailable after it has been initialised
632         mUserManagerState.onProfileActionStatusChange(
633                 Intent.ACTION_PROFILE_UNAVAILABLE, privateUser);
634 
635         List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
636         Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent =
637                 new HashMap<>(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
638 
639         List<UserId> expectedUserIdsAfterIntent =
640                 Lists.newArrayList(currentUser, managedUser, privateUser);
641 
642         String action = Intent.ACTION_PROFILE_AVAILABLE;
643         mUserManagerState.onProfileActionStatusChange(action, privateUser);
644 
645         assertWithMessage(
646                         "UserIds list should not be same before and after receiving intent: "
647                                 + action)
648                 .that(mUserManagerState.getUserIds())
649                 .isNotEqualTo(userIdsBeforeIntent);
650         assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
651                 .that(mUserManagerState.getUserIds())
652                 .isEqualTo(expectedUserIdsAfterIntent);
653         assertWithMessage(
654                         "CanForwardToLabelMap should be same before and after receiving intent: "
655                                 + action)
656                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
657                 .isEqualTo(canForwardToProfileIdMapBeforeIntent);
658     }
659 
660     @Test
testOnProfileStatusChange_actionProfileAdded()661     public void testOnProfileStatusChange_actionProfileAdded() {
662         assumeTrue(SdkLevel.isAtLeastV());
663         UserId currentUser = UserId.of(mSystemUser);
664         UserId managedUser = UserId.of(mManagedUser);
665         UserId privateUser = UserId.of(mPrivateUser);
666 
667         final List<ResolveInfo> mMockResolveInfoList = Lists.newArrayList(mMockInfoManagedUser);
668 
669         when(mMockPackageManager.queryIntentActivitiesAsUser(
670                         any(Intent.class), anyInt(), eq(mSystemUser)))
671                 .thenReturn(mMockResolveInfoList);
672 
673         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
674 
675         mUserManagerState.setCurrentStateIntent(new Intent());
676 
677         // initialising the userIds list and canForwardToProfileIdMap
678         mUserManagerState.getUserIds();
679         mUserManagerState.getCanForwardToProfileIdMap(mMockIntent);
680 
681         String action = Intent.ACTION_PROFILE_ADDED;
682         mUserManagerState.onProfileActionStatusChange(action, privateUser);
683 
684         assertWithMessage(
685                         "UserIds list should not be same before and after receiving intent: "
686                                 + action)
687                 .that(mUserManagerState.getUserIds())
688                 .containsExactly(currentUser, managedUser, privateUser);
689         assertWithMessage(
690                         "CanForwardToLabelMap should be same before and after receiving intent: "
691                                 + action)
692                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
693                 .isEqualTo(
694                         Map.ofEntries(
695                                 Map.entry(currentUser, true),
696                                 Map.entry(managedUser, true),
697                                 Map.entry(privateUser, true)));
698     }
699 
700     @Test
testOnProfileStatusChange_actionProfileAvailable_profileNotInitialised()701     public void testOnProfileStatusChange_actionProfileAvailable_profileNotInitialised() {
702         assumeTrue(SdkLevel.isAtLeastV());
703         UserId currentUser = UserId.of(mSystemUser);
704         UserId managedUser = UserId.of(mManagedUser);
705         UserId privateUser = UserId.of(mPrivateUser);
706         final List<ResolveInfo> mMockResolveInfoList =
707                 Lists.newArrayList(mMockInfoManagedUser, mMockInfoPrivateUser);
708         when(mMockPackageManager.queryIntentActivitiesAsUser(
709                         any(Intent.class), anyInt(), eq(mSystemUser)))
710                 .thenReturn(mMockResolveInfoList);
711 
712         when(mMockUserManager.getProfileParent(UserHandle.of(privateUser.getIdentifier())))
713                 .thenReturn(mPrimaryUser);
714 
715         // Private user will not be initialised if it is in quiet mode
716         when(mMockUserManager.isQuietModeEnabled(mPrivateUser)).thenReturn(true);
717         initializeUserManagerState(
718                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
719         mUserManagerState.setCurrentStateIntent(new Intent());
720         // UserManagerState#mUserId and UserManagerState#mCanForwardToProfileIdMap will
721         // be empty by default if the getters of these member variables have not been called
722         List<UserId> userIdsBeforeIntent = new ArrayList<>(mUserManagerState.getUserIds());
723         Map<UserId, Boolean> canForwardToProfileIdMapBeforeIntent =
724                 new HashMap<>(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent));
725 
726         List<UserId> expectedUserIdsAfterIntent =
727                 Lists.newArrayList(currentUser, managedUser, privateUser);
728         Map<UserId, Boolean> expectedCanForwardToProfileIdMapAfterIntent = new HashMap<>();
729         expectedCanForwardToProfileIdMapAfterIntent.put(currentUser, true);
730         expectedCanForwardToProfileIdMapAfterIntent.put(managedUser, true);
731         expectedCanForwardToProfileIdMapAfterIntent.put(privateUser, true);
732 
733         String action = Intent.ACTION_PROFILE_AVAILABLE;
734         mUserManagerState.onProfileActionStatusChange(action, privateUser);
735 
736         assertWithMessage(
737                         "UserIds list should not be same before and after receiving intent: "
738                                 + action)
739                 .that(mUserManagerState.getUserIds())
740                 .isNotEqualTo(userIdsBeforeIntent);
741         assertWithMessage("Unexpected changes to user id list on receiving intent: " + action)
742                 .that(mUserManagerState.getUserIds())
743                 .isEqualTo(expectedUserIdsAfterIntent);
744         assertWithMessage(
745                         "CanForwardToLabelMap should not be same before and after receiving intent:"
746                                 + " "
747                                 + action)
748                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
749                 .isNotEqualTo(canForwardToProfileIdMapBeforeIntent);
750         assertWithMessage(
751                         "Unexpected changes to canForwardToProfileIdMap on receiving intent: "
752                                 + action)
753                 .that(mUserManagerState.getCanForwardToProfileIdMap(mMockIntent))
754                 .isEqualTo(expectedCanForwardToProfileIdMapAfterIntent);
755     }
756 
757     @Test
testGetUserIdToLabelMap_systemUserAndManagedUser_PreV()758     public void testGetUserIdToLabelMap_systemUserAndManagedUser_PreV() {
759         assumeFalse(SdkLevel.isAtLeastV());
760         UserId currentUser = UserId.of(mSystemUser);
761         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
762         if (SdkLevel.isAtLeastT()) {
763             DevicePolicyResourcesManager devicePolicyResourcesManager =
764                     mock(DevicePolicyResourcesManager.class);
765             when(mDevicePolicyManager.getResources()).thenReturn(devicePolicyResourcesManager);
766             when(devicePolicyResourcesManager.getString(eq(PERSONAL_TAB), any()))
767                     .thenReturn(PERSONAL);
768             when(devicePolicyResourcesManager.getString(eq(WORK_TAB), any())).thenReturn(WORK);
769         }
770 
771         Map<UserId, String> userIdToLabelMap = mUserManagerState.getUserIdToLabelMap();
772 
773         assertWithMessage("Incorrect label returned for user id " + mSystemUser)
774                 .that(userIdToLabelMap.get(UserId.of(mSystemUser)))
775                 .isEqualTo(PERSONAL);
776         assertWithMessage("Incorrect label returned for user id " + mManagedUser)
777                 .that(userIdToLabelMap.get(UserId.of(mManagedUser)))
778                 .isEqualTo(WORK);
779     }
780 
781     @Test
testGetUserIdToLabelMap_systemUserManagedUserPrivateUser_PostV()782     public void testGetUserIdToLabelMap_systemUserManagedUserPrivateUser_PostV() {
783         assumeTrue(SdkLevel.isAtLeastV());
784         UserId currentUser = UserId.of(mSystemUser);
785         initializeUserManagerState(
786                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
787         if (SdkLevel.isAtLeastT()) {
788             DevicePolicyResourcesManager devicePolicyResourcesManager =
789                     mock(DevicePolicyResourcesManager.class);
790             when(mDevicePolicyManager.getResources()).thenReturn(devicePolicyResourcesManager);
791             when(devicePolicyResourcesManager.getString(eq(PERSONAL_TAB), any()))
792                     .thenReturn(PERSONAL);
793         }
794         UserManager managedUserManager = getUserManagerForManagedUser();
795         UserManager privateUserManager = getUserManagerForPrivateUser();
796         when(managedUserManager.getProfileLabel()).thenReturn(WORK);
797         when(privateUserManager.getProfileLabel()).thenReturn(PRIVATE);
798 
799         Map<UserId, String> userIdToLabelMap = mUserManagerState.getUserIdToLabelMap();
800 
801         assertWithMessage("Incorrect label returned for user id " + mSystemUser)
802                 .that(userIdToLabelMap.get(UserId.of(mSystemUser)))
803                 .isEqualTo(PERSONAL);
804         assertWithMessage("Incorrect label returned for user id " + mManagedUser)
805                 .that(userIdToLabelMap.get(UserId.of(mManagedUser)))
806                 .isEqualTo(WORK);
807         assertWithMessage("Incorrect label returned for user id " + mPrivateUser)
808                 .that(userIdToLabelMap.get(UserId.of(mPrivateUser)))
809                 .isEqualTo(PRIVATE);
810     }
811 
812     @Test
testGetUserIdToBadgeMap_systemUserManagedUser_PreV()813     public void testGetUserIdToBadgeMap_systemUserManagedUser_PreV() {
814         assumeFalse(SdkLevel.isAtLeastV());
815         UserId currentUser = UserId.of(mSystemUser);
816         initializeUserManagerState(currentUser, Lists.newArrayList(mSystemUser, mManagedUser));
817         Drawable workBadge = mock(Drawable.class);
818         Resources resources = mock(Resources.class);
819         when(mMockContext.getResources()).thenReturn(resources);
820         when(mMockContext.getDrawable(R.drawable.ic_briefcase)).thenReturn(workBadge);
821         if (SdkLevel.isAtLeastT()) {
822             DevicePolicyResourcesManager devicePolicyResourcesManager =
823                     mock(DevicePolicyResourcesManager.class);
824             when(mDevicePolicyManager.getResources()).thenReturn(devicePolicyResourcesManager);
825             when(devicePolicyResourcesManager.getDrawable(
826                             eq(WORK_PROFILE_ICON), eq(SOLID_COLORED), any()))
827                     .thenReturn(workBadge);
828         }
829 
830         Map<UserId, Drawable> userIdToBadgeMap = mUserManagerState.getUserIdToBadgeMap();
831 
832         assertWithMessage("There should be no badge present for personal user")
833                 .that(userIdToBadgeMap.containsKey(UserId.of(mSystemUser)))
834                 .isFalse();
835         assertWithMessage("Incorrect badge returned for user id " + mManagedUser)
836                 .that(userIdToBadgeMap.get(UserId.of(mManagedUser)))
837                 .isEqualTo(workBadge);
838     }
839 
840     @Test
testGetUserIdToBadgeMap_systemUserManagedUserPrivateUser_PostV()841     public void testGetUserIdToBadgeMap_systemUserManagedUserPrivateUser_PostV() {
842         assumeTrue(SdkLevel.isAtLeastV());
843         UserId currentUser = UserId.of(mSystemUser);
844         initializeUserManagerState(
845                 currentUser, Lists.newArrayList(mSystemUser, mManagedUser, mPrivateUser));
846         Drawable workBadge = mock(Drawable.class);
847         Drawable privateBadge = mock(Drawable.class);
848         UserManager managedUserManager = getUserManagerForManagedUser();
849         UserManager privateUserManager = getUserManagerForPrivateUser();
850         when(managedUserManager.getUserBadge()).thenReturn(workBadge);
851         when(privateUserManager.getUserBadge()).thenReturn(privateBadge);
852 
853         Map<UserId, Drawable> userIdToBadgeMap = mUserManagerState.getUserIdToBadgeMap();
854 
855         assertWithMessage("There should be no badge present for personal user")
856                 .that(userIdToBadgeMap.get(UserId.of(mSystemUser)))
857                 .isNull();
858         assertWithMessage("Incorrect badge returned for user id " + mManagedUser)
859                 .that(userIdToBadgeMap.get(UserId.of(mManagedUser)))
860                 .isEqualTo(workBadge);
861         assertWithMessage("Incorrect badge returned for user id " + mPrivateUser)
862                 .that(userIdToBadgeMap.get(UserId.of(mPrivateUser)))
863                 .isEqualTo(privateBadge);
864     }
865 
initializeUserManagerState(UserId current, List<UserHandle> usersOnDevice)866     private void initializeUserManagerState(UserId current, List<UserHandle> usersOnDevice) {
867         when(mMockUserManager.getUserProfiles()).thenReturn(usersOnDevice);
868         TestConfigStore testConfigStore = new TestConfigStore();
869         testConfigStore.enablePrivateSpaceInPhotoPicker();
870         mUserManagerState =
871                 new UserManagerState.RuntimeUserManagerState(
872                         mMockContext, current, true, testConfigStore);
873     }
874 
getUserManagerForManagedUser()875     private UserManager getUserManagerForManagedUser() {
876         Context managedUserContext = mock(Context.class);
877         when(mMockContext.createContextAsUser(mManagedUser, 0)).thenReturn(managedUserContext);
878         UserManager managedUserManager = mock(UserManager.class);
879         when(managedUserContext.getSystemServiceName(UserManager.class))
880                 .thenReturn("managedUserManager");
881         when(managedUserContext.getSystemService(UserManager.class)).thenReturn(managedUserManager);
882         return managedUserManager;
883     }
884 
getUserManagerForPrivateUser()885     private UserManager getUserManagerForPrivateUser() {
886         Context privateUserContext = mock(Context.class);
887         when(mMockContext.createContextAsUser(mPrivateUser, 0)).thenReturn(privateUserContext);
888         UserManager privateUserManager = mock(UserManager.class);
889         when(privateUserContext.getSystemServiceName(UserManager.class))
890                 .thenReturn("privateUserManager");
891         when(privateUserContext.getSystemService(UserManager.class)).thenReturn(privateUserManager);
892         return privateUserManager;
893     }
894 }
895