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