• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.settings.users;
18 
19 import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
20 import static android.os.UserManager.SWITCHABILITY_STATUS_USER_IN_CALL;
21 import static android.os.UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED;
22 
23 import static com.google.common.truth.Truth.assertThat;
24 
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.anyInt;
27 import static org.mockito.ArgumentMatchers.anyString;
28 import static org.mockito.ArgumentMatchers.eq;
29 import static org.mockito.ArgumentMatchers.notNull;
30 import static org.mockito.Mockito.doNothing;
31 import static org.mockito.Mockito.doReturn;
32 import static org.mockito.Mockito.mock;
33 import static org.mockito.Mockito.never;
34 import static org.mockito.Mockito.spy;
35 import static org.mockito.Mockito.times;
36 import static org.mockito.Mockito.verify;
37 import static org.mockito.Mockito.when;
38 import static org.robolectric.Shadows.shadowOf;
39 
40 import android.app.admin.DevicePolicyManager;
41 import android.app.settings.SettingsEnums;
42 import android.content.ComponentName;
43 import android.content.Context;
44 import android.content.Intent;
45 import android.content.SharedPreferences;
46 import android.content.pm.PackageManager;
47 import android.content.pm.ResolveInfo;
48 import android.content.pm.UserInfo;
49 import android.graphics.Bitmap;
50 import android.graphics.drawable.Drawable;
51 import android.multiuser.Flags;
52 import android.os.Bundle;
53 import android.os.Looper;
54 import android.os.UserHandle;
55 import android.os.UserManager;
56 import android.platform.test.annotations.RequiresFlagsDisabled;
57 import android.platform.test.annotations.RequiresFlagsEnabled;
58 import android.platform.test.flag.junit.CheckFlagsRule;
59 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
60 import android.provider.Settings;
61 import android.text.SpannableStringBuilder;
62 import android.view.Menu;
63 import android.view.MenuInflater;
64 import android.view.MenuItem;
65 
66 import androidx.fragment.app.FragmentActivity;
67 import androidx.preference.Preference;
68 import androidx.preference.PreferenceCategory;
69 import androidx.preference.PreferenceManager;
70 import androidx.preference.PreferenceScreen;
71 
72 import com.android.settings.SettingsActivity;
73 import com.android.settings.SubSettings;
74 import com.android.settings.testutils.shadow.SettingsShadowResources;
75 import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
76 import com.android.settings.testutils.shadow.ShadowUserManager;
77 import com.android.settingslib.RestrictedLockUtils;
78 import com.android.settingslib.RestrictedPreference;
79 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
80 import com.android.settingslib.search.SearchIndexableRaw;
81 
82 import org.junit.After;
83 import org.junit.Before;
84 import org.junit.Ignore;
85 import org.junit.Rule;
86 import org.junit.Test;
87 import org.junit.runner.RunWith;
88 import org.mockito.AdditionalMatchers;
89 import org.mockito.ArgumentCaptor;
90 import org.mockito.Mock;
91 import org.mockito.MockitoAnnotations;
92 import org.robolectric.RobolectricTestRunner;
93 import org.robolectric.RuntimeEnvironment;
94 import org.robolectric.android.controller.ActivityController;
95 import org.robolectric.annotation.Config;
96 import org.robolectric.shadows.ShadowIntent;
97 import org.robolectric.util.ReflectionHelpers;
98 
99 import java.util.ArrayList;
100 import java.util.Arrays;
101 import java.util.Collections;
102 import java.util.List;
103 
104 @RunWith(RobolectricTestRunner.class)
105 @Config(shadows = {
106         ShadowUserManager.class,
107         ShadowDevicePolicyManager.class,
108         SettingsShadowResources.class,
109         com.android.settings.testutils.shadow.ShadowFragment.class,
110 })
111 public class UserSettingsTest {
112 
113     private static final String KEY_USER_GUEST = "user_guest";
114     private static final String KEY_ALLOW_MULTIPLE_USERS = "allow_multiple_users";
115     private static final String KEY_USER_SETTINGS_SCREEN = "user_settings_screen";
116     private static final String KEY_ADD_USER = "user_add";
117     private static final int ACTIVE_USER_ID = 0;
118     private static final int INACTIVE_ADMIN_USER_ID = 1;
119     private static final int INACTIVE_SECONDARY_USER_ID = 14;
120     private static final int INACTIVE_RESTRICTED_USER_ID = 21;
121     private static final int INACTIVE_GUEST_USER_ID = 23;
122     private static final int MANAGED_USER_ID = 11;
123     private static final String ADMIN_USER_NAME = "Owner";
124     private static final String SECONDARY_USER_NAME = "Tom";
125     private static final String RESTRICTED_USER_NAME = "Bob";
126     private static final String GUEST_USER_NAME = "Guest";
127     private static final String MANAGED_USER_NAME = "Work profile";
128     private int mProvisionedBackupValue;
129 
130     @Mock
131     private Drawable mDefaultIconDrawable;
132     @Mock
133     private PreferenceManager mMockPreferenceManager;
134     @Mock
135     private DevicePolicyManager mDevicePolicyManager;
136     @Mock
137     private UserPreference mMePreference;
138     @Mock
139     private RestrictedPreference mAddUserPreference;
140     @Mock
141     private RestrictedPreference mAddSupervisedUserPreference;
142     @Mock
143     private RestrictedPreference mAddGuestPreference;
144     @Mock
145     private UserManager mUserManager;
146     @Mock
147     private PackageManager mPackageManager;
148     @Mock
149     private MetricsFeatureProvider mMetricsFeatureProvider;
150 
151     private FragmentActivity mActivity;
152     private Context mContext;
153     private UserSettings mFragment;
154     private UserCapabilities mUserCapabilities;
155 
156     @Rule
157     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
158 
159     @Before
setUp()160     public void setUp() {
161         MockitoAnnotations.initMocks(this);
162         mActivity = spy(ActivityController.of(new FragmentActivity()).get());
163         mContext = spy(RuntimeEnvironment.application);
164         mUserCapabilities = UserCapabilities.create(mContext);
165         mUserCapabilities.mUserSwitcherEnabled = true;
166 
167         mFragment = spy(new UserSettings());
168         ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController",
169                 mock(AddUserWhenLockedPreferenceController.class));
170         ReflectionHelpers.setField(mFragment, "mGuestTelephonyPreferenceController",
171                 mock(GuestTelephonyPreferenceController.class));
172         ReflectionHelpers.setField(mFragment, "mMultiUserTopIntroPreferenceController",
173                 mock(MultiUserTopIntroPreferenceController.class));
174         ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
175         ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
176         ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
177         ReflectionHelpers.setField(mFragment, "mAddingUser", false);
178         ReflectionHelpers.setField(mFragment, "mMetricsFeatureProvider", mMetricsFeatureProvider);
179         ReflectionHelpers.setField(mFragment, "mRemoveGuestOnExitPreferenceController",
180                 mock(RemoveGuestOnExitPreferenceController.class));
181 
182         doReturn(mUserManager).when(mActivity).getSystemService(UserManager.class);
183         doReturn(mPackageManager).when(mActivity).getPackageManager();
184 
185         doReturn(mActivity).when(mFragment).getActivity();
186         doReturn(mContext).when(mFragment).getContext();
187         doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager();
188         doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
189         doReturn(mPackageManager).when(mContext).getPackageManager();
190 
191         mProvisionedBackupValue = Settings.Global.getInt(mContext.getContentResolver(),
192                 Settings.Global.DEVICE_PROVISIONED, 0);
193         Settings.Global.putInt(mContext.getContentResolver(),
194                 Settings.Global.DEVICE_PROVISIONED, 1); //default state
195 
196         final SharedPreferences prefs = mock(SharedPreferences.class);
197 
198         doReturn(prefs).when(mMockPreferenceManager).getSharedPreferences();
199         doReturn(mContext).when(mMockPreferenceManager).getContext();
200         doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
201         doReturn(ACTIVE_USER_ID).when(mContext).getUserId();
202 
203         mFragment.mMePreference = mMePreference;
204         mFragment.mAddUser = mAddUserPreference;
205         mFragment.mAddSupervisedUser = mAddSupervisedUserPreference;
206         mFragment.mAddGuest = mAddGuestPreference;
207         mFragment.mUserListCategory = mock(PreferenceCategory.class);
208         mFragment.mGuestUserCategory = mock(PreferenceCategory.class);
209         mFragment.mGuestCategory = mock(PreferenceCategory.class);
210         mFragment.mGuestResetPreference = mock(Preference.class);
211         mFragment.mGuestExitPreference = mock(Preference.class);
212     }
213 
214     @After
tearDown()215     public void tearDown() {
216         Settings.Global.putInt(mContext.getContentResolver(),
217                 Settings.Global.DEVICE_PROVISIONED, mProvisionedBackupValue);
218         SettingsShadowResources.reset();
219     }
220 
221     @Test
testAssignDefaultPhoto_ContextNull_ReturnFalseAndNotCrash()222     public void testAssignDefaultPhoto_ContextNull_ReturnFalseAndNotCrash() {
223         // Should not crash here
224         assertThat(UserSettings.assignDefaultPhoto(null, ACTIVE_USER_ID)).isFalse();
225     }
226 
227     @Test
testGetRawDataToIndex_returnAllIndexablePreferences()228     public void testGetRawDataToIndex_returnAllIndexablePreferences() {
229         String[] expectedKeys = {KEY_ALLOW_MULTIPLE_USERS, KEY_USER_SETTINGS_SCREEN, KEY_ADD_USER};
230         List<String> keysResultList = new ArrayList<>();
231         ShadowUserManager.getShadow().setSupportsMultipleUsers(true);
232         List<SearchIndexableRaw> rawData =
233                 UserSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true);
234 
235         for (SearchIndexableRaw rawDataItem : rawData) {
236             keysResultList.add(rawDataItem.key);
237         }
238 
239         assertThat(keysResultList).containsExactly(expectedKeys);
240     }
241 
242     @Test
testGetRawDataToIndex_addRestrictedProfileAllowed_addUserTitleIsCorrect()243     public void testGetRawDataToIndex_addRestrictedProfileAllowed_addUserTitleIsCorrect() {
244         ShadowUserManager.getShadow().setSupportsMultipleUsers(true);
245         SettingsShadowResources.overrideResource(
246                 com.android.settings.R.bool.config_offer_restricted_profiles,
247                 Boolean.TRUE);
248         when(mUserManager.hasBaseUserRestriction(UserManager.DISALLOW_ADD_USER, mContext.getUser()))
249                 .thenReturn(false);
250         ShadowUserManager.getShadow().setUserTypeEnabled(UserManager.USER_TYPE_FULL_RESTRICTED,
251                 true);
252         when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
253                 .thenReturn(mDevicePolicyManager);
254         when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
255 
256         List<SearchIndexableRaw> rawData =
257                 UserSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true);
258 
259         String title = null;
260         for (SearchIndexableRaw rawDataItem : rawData) {
261             if (rawDataItem.key.equals(KEY_ADD_USER)) {
262                 title = rawDataItem.title;
263             }
264         }
265 
266         assertThat(title).isEqualTo(mContext.getString(
267                 com.android.settings.R.string.user_add_user_or_profile_menu));
268     }
269 
270     @Test
testGetRawDataToIndex_addRestrictedProfileDisallowed_addUserTitleIsCorrect()271     public void testGetRawDataToIndex_addRestrictedProfileDisallowed_addUserTitleIsCorrect() {
272         ShadowUserManager.getShadow().setSupportsMultipleUsers(true);
273         SettingsShadowResources.overrideResource(
274                 com.android.settings.R.bool.config_offer_restricted_profiles,
275                 Boolean.FALSE);
276         List<SearchIndexableRaw> rawData =
277                 UserSettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true);
278 
279         String title = null;
280         for (SearchIndexableRaw rawDataItem : rawData) {
281             if (rawDataItem.key.equals(KEY_ADD_USER)) {
282                 title = rawDataItem.title;
283             }
284         }
285 
286         assertThat(title).isEqualTo(mContext.getString(
287                 com.android.settingslib.R.string.user_add_user));
288     }
289 
290     @Test
testAssignDefaultPhoto_hasDefaultUserIconSize()291     public void testAssignDefaultPhoto_hasDefaultUserIconSize() {
292         doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
293         int size = 100;
294         try {
295             SettingsShadowResources.overrideResource(
296                     com.android.internal.R.dimen.user_icon_size,
297                     size);
298             assertThat(UserSettings.assignDefaultPhoto(mContext, ACTIVE_USER_ID)).isTrue();
299 
300             int pxSize = mContext.getResources()
301                     .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size);
302 
303             ArgumentCaptor<Bitmap> captor = ArgumentCaptor.forClass(Bitmap.class);
304             verify(mUserManager).setUserIcon(eq(ACTIVE_USER_ID), captor.capture());
305             Bitmap bitmap = captor.getValue();
306             assertThat(bitmap.getWidth()).isEqualTo(pxSize);
307             assertThat(bitmap.getHeight()).isEqualTo(pxSize);
308         } finally {
309             SettingsShadowResources.reset();
310         }
311     }
312 
313     @Test
testExitGuest_ShouldLogAction()314     public void testExitGuest_ShouldLogAction() {
315         mUserCapabilities.mIsGuest = true;
316         mFragment.clearAndExitGuest();
317         verify(mMetricsFeatureProvider).action(any(),
318                 eq(SettingsEnums.ACTION_USER_GUEST_EXIT_CONFIRMED));
319     }
320 
321     @Test
testExitGuestWhenNotGuest_ShouldNotLogAction()322     public void testExitGuestWhenNotGuest_ShouldNotLogAction() {
323         mUserCapabilities.mIsGuest = false;
324         mFragment.clearAndExitGuest();
325         verify(mMetricsFeatureProvider, never()).action(any(),
326                 eq(SettingsEnums.ACTION_USER_GUEST_EXIT_CONFIRMED));
327     }
328 
329     @Test
withDisallowRemoveUser_ShouldDisableRemoveUser()330     public void withDisallowRemoveUser_ShouldDisableRemoveUser() {
331         // TODO(b/115781615): Tidy robolectric tests
332         // Arrange
333         final int userId = UserHandle.myUserId();
334         final List<UserManager.EnforcingUser> enforcingUsers = Collections.singletonList(
335                 new UserManager.EnforcingUser(userId,
336                         UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)
337         );
338         ShadowUserManager.getShadow().setUserRestrictionSources(
339                 UserManager.DISALLOW_REMOVE_USER,
340                 UserHandle.of(userId),
341                 enforcingUsers);
342 
343         ShadowDevicePolicyManager.getShadow().setDeviceOwnerComponentOnAnyUser(
344                 new ComponentName("test", "test"));
345 
346         doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
347         mUserCapabilities.mIsAdmin = false;
348 
349         Menu menu = mock(Menu.class);
350         MenuItem menuItem = mock(MenuItem.class);
351         final String title = "title";
352 
353         doReturn(title).when(menuItem).getTitle();
354         doReturn(menuItem).when(menu).add(
355                 anyInt(), eq(Menu.FIRST), anyInt(), any(CharSequence.class));
356 
357         // Act
358         mFragment.onCreateOptionsMenu(menu, mock(MenuInflater.class));
359 
360         // Assert
361         // Expect that the click will be overridden and the color will be faded
362         // (by RestrictedLockUtilsInternal)
363         verify(menuItem).setOnMenuItemClickListener(notNull());
364         SpannableStringBuilder defaultTitle = new SpannableStringBuilder(title);
365         verify(menuItem).setTitle(AdditionalMatchers.not(eq(defaultTitle)));
366     }
367 
368     @Test
withoutDisallowRemoveUser_ShouldNotDisableRemoveUser()369     public void withoutDisallowRemoveUser_ShouldNotDisableRemoveUser() {
370         // Arrange
371         doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
372         mUserCapabilities.mIsAdmin = false;
373 
374         Menu menu = mock(Menu.class);
375         MenuItem menuItem = mock(MenuItem.class);
376         final String title = "title";
377 
378         doReturn(title).when(menuItem).getTitle();
379         doReturn(menuItem).when(menu).add(
380                 anyInt(), eq(Menu.FIRST), anyInt(), any(CharSequence.class));
381 
382         // Act
383         mFragment.onCreateOptionsMenu(menu, mock(MenuInflater.class));
384 
385         // Assert
386         // Expect that a click listener will not be added and the title will not be changed
387         verify(menuItem, never()).setOnMenuItemClickListener(notNull());
388         SpannableStringBuilder defaultTitle = new SpannableStringBuilder(title);
389         verify(menuItem, never()).setTitle(AdditionalMatchers.not(eq(defaultTitle)));
390     }
391 
392     @Test
updateUserList_canAddUserAndSwitchUser_shouldShowAddUser()393     public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() {
394         mUserCapabilities.mCanAddUser = true;
395         doReturn(true)
396                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY));
397         doReturn(true).when(mAddUserPreference).isEnabled();
398         doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
399 
400         mFragment.updateUserList();
401 
402         verify(mAddUserPreference).setVisible(true);
403         verify(mAddUserPreference).setSummary(null);
404         verify(mAddUserPreference).setEnabled(true);
405         verify(mAddUserPreference).setDisabledByAdmin(null);
406         verify(mAddUserPreference).setSelectable(true);
407     }
408 
409     @Test
updateUserList_canAddGuestAndSwitchUser_shouldShowAddGuest()410     public void updateUserList_canAddGuestAndSwitchUser_shouldShowAddGuest() {
411         mUserCapabilities.mCanAddGuest = true;
412         doReturn(true)
413                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
414         doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
415 
416         mFragment.updateUserList();
417 
418         verify(mAddGuestPreference).setVisible(true);
419         verify(mAddGuestPreference).setEnabled(true);
420         verify(mAddGuestPreference).setSelectable(true);
421     }
422 
423     @Test
424     @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_cannotSwitchUser_shouldDisableAddUser()425     public void updateUserList_cannotSwitchUser_shouldDisableAddUser() {
426         mUserCapabilities.mCanAddUser = true;
427         doReturn(true).when(mUserManager).canAddMoreUsers(anyString());
428         doReturn(true).when(mAddUserPreference).isEnabled();
429         doReturn(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED)
430                 .when(mUserManager).getUserSwitchability();
431 
432         mFragment.updateUserList();
433 
434         verify(mAddUserPreference).setVisible(true);
435         verify(mAddUserPreference).setSummary(null);
436         verify(mAddUserPreference).setEnabled(false);
437         verify(mAddUserPreference).setSelectable(true);
438     }
439 
440     @Test
441     @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_disallowAddUser_shouldDisableAddUserAndAddGuest()442     public void updateUserList_disallowAddUser_shouldDisableAddUserAndAddGuest() {
443         mUserCapabilities.mDisallowAddUserSetByAdmin = true;
444         doReturn(true).when(mUserManager).canAddMoreUsers(anyString());
445         doReturn(SWITCHABILITY_STATUS_OK)
446                 .when(mUserManager).getUserSwitchability();
447 
448         mFragment.updateUserList();
449 
450         verify(mAddUserPreference).setVisible(true);
451         verify(mAddUserPreference).setDisabledByAdmin(any());
452     }
453 
454     @Test
updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary()455     public void updateUserList_canNotAddMoreUsers_shouldDisableAddUserWithSummary() {
456         mUserCapabilities.mCanAddUser = true;
457         doReturn(false).when(mUserManager).canAddMoreUsers(anyString());
458         doReturn(false).when(mAddUserPreference).isEnabled();
459         doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
460         doReturn(4).when(mFragment).getRealUsersCount();
461 
462         mFragment.updateUserList();
463 
464         verify(mAddUserPreference).setVisible(true);
465         verify(mAddUserPreference).setSummary(
466                 "You can\u2019t add any more users. Remove a user to add a new one.");
467         verify(mAddUserPreference).setEnabled(false);
468         verify(mAddUserPreference).setSelectable(true);
469     }
470 
471     @Test
472     @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_cannotSwitchUser_shouldDisableAddGuest()473     public void updateUserList_cannotSwitchUser_shouldDisableAddGuest() {
474         mUserCapabilities.mCanAddGuest = true;
475         doReturn(true)
476                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
477         doReturn(SWITCHABILITY_STATUS_USER_IN_CALL).when(mUserManager).getUserSwitchability();
478 
479         mFragment.updateUserList();
480 
481         verify(mAddGuestPreference).setVisible(true);
482         verify(mAddGuestPreference).setEnabled(false);
483         verify(mAddGuestPreference).setSelectable(true);
484     }
485 
486     @Test
487     @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_cannotSwitchUser_shouldKeepPreferencesVisibleAndEnabled()488     public void updateUserList_cannotSwitchUser_shouldKeepPreferencesVisibleAndEnabled() {
489         givenUsers(getAdminUser(true));
490         mUserCapabilities.mCanAddGuest = true;
491         mUserCapabilities.mCanAddUser = true;
492         mUserCapabilities.mDisallowSwitchUser = true;
493         doReturn(true)
494                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
495         doReturn(true)
496                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY));
497 
498         mFragment.updateUserList();
499 
500         verify(mAddGuestPreference).setVisible(true);
501         verify(mAddGuestPreference).setEnabled(true);
502         verify(mAddUserPreference).setVisible(true);
503         verify(mAddUserPreference).setEnabled(true);
504     }
505 
506     @Test
507     @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_disallowAddUser_shouldShowButDisableAddActions()508     public void updateUserList_disallowAddUser_shouldShowButDisableAddActions() {
509         givenUsers(getAdminUser(true));
510         mUserCapabilities.mCanAddGuest = true;
511         mUserCapabilities.mCanAddUser = false;
512         mUserCapabilities.mDisallowAddUser = true;
513         mUserCapabilities.mDisallowAddUserSetByAdmin = false;
514         List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
515         enforcingUsers.add(new UserManager.EnforcingUser(UserHandle.myUserId(),
516                 UserManager.RESTRICTION_SOURCE_SYSTEM));
517         when(mUserManager.getUserRestrictionSources(UserManager.DISALLOW_ADD_USER,
518                 UserHandle.of(UserHandle.myUserId()))).thenReturn(enforcingUsers);
519 
520         doReturn(true)
521                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
522         doReturn(true)
523                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_SECONDARY));
524 
525         mFragment.updateUserList();
526 
527         verify(mAddGuestPreference).setVisible(true);
528         verify(mAddGuestPreference).setEnabled(false);
529         verify(mAddUserPreference).setVisible(true);
530         verify(mAddUserPreference).setEnabled(false);
531     }
532 
533     @Test
534     @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser()535     public void updateUserList_addUserDisallowedByAdmin_shouldNotShowAddUser() {
536         RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock(
537                 RestrictedLockUtils.EnforcedAdmin.class);
538         mUserCapabilities.mEnforcedAdmin = enforcedAdmin;
539         mUserCapabilities.mCanAddUser = false;
540         mUserCapabilities.mDisallowAddUser = true;
541         mUserCapabilities.mDisallowAddUserSetByAdmin = true;
542         doReturn(true).when(mAddUserPreference).isEnabled();
543 
544         mFragment.updateUserList();
545 
546         verify(mAddUserPreference).setVisible(false);
547     }
548 
549     @Test
550     @RequiresFlagsEnabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_addUserDisallowedByAdmin_shouldShowPrefDisabledByAdmin()551     public void updateUserList_addUserDisallowedByAdmin_shouldShowPrefDisabledByAdmin() {
552         RestrictedLockUtils.EnforcedAdmin enforcedAdmin = mock(
553                 RestrictedLockUtils.EnforcedAdmin.class);
554 
555         mUserCapabilities.mEnforcedAdmin = enforcedAdmin;
556         mUserCapabilities.mCanAddUser = false;
557         mUserCapabilities.mDisallowAddUser = true;
558         mUserCapabilities.mDisallowAddUserSetByAdmin = true;
559         doReturn(true).when(mAddUserPreference).isEnabled();
560 
561         mFragment.updateUserList();
562 
563         verify(mAddUserPreference).setDisabledByAdmin(enforcedAdmin);
564     }
565     @Test
updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser()566     public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() {
567         mUserCapabilities.mCanAddUser = false;
568 
569         mFragment.updateUserList();
570 
571         verify(mAddUserPreference).setVisible(false);
572     }
573 
574     @Test
updateUserList_canNotAddGuest_shouldNotShowAddGuest()575     public void updateUserList_canNotAddGuest_shouldNotShowAddGuest() {
576         mUserCapabilities.mCanAddGuest = false;
577 
578         mFragment.updateUserList();
579 
580         verify(mAddGuestPreference).setVisible(false);
581     }
582 
583     @Test
updateUserList_notProvisionedDevice_shouldNotShowAddUser()584     public void updateUserList_notProvisionedDevice_shouldNotShowAddUser() {
585         Settings.Global.putInt(mContext.getContentResolver(),
586                 Settings.Global.DEVICE_PROVISIONED, 0);
587         mUserCapabilities.mCanAddUser = true;
588 
589         mFragment.updateUserList();
590 
591         verify(mAddUserPreference).setVisible(false);
592     }
593 
594     @Test
updateUserList_notProvisionedDevice_shouldNotShowAddGuest()595     public void updateUserList_notProvisionedDevice_shouldNotShowAddGuest() {
596         Settings.Global.putInt(mContext.getContentResolver(),
597                 Settings.Global.DEVICE_PROVISIONED, 0);
598         mUserCapabilities.mCanAddGuest = true;
599 
600         mFragment.updateUserList();
601 
602         verify(mAddGuestPreference).setVisible(false);
603     }
604 
605     @Test
updateUserList_userSwitcherDisabled_shouldShowAddUser()606     public void updateUserList_userSwitcherDisabled_shouldShowAddUser() {
607         givenUsers(getAdminUser(true));
608         mUserCapabilities.mCanAddUser = true;
609         mUserCapabilities.mUserSwitcherEnabled = false;
610 
611         mFragment.updateUserList();
612 
613         verify(mAddUserPreference).setVisible(true);
614     }
615 
616     @Test
updateUserList_userSwitcherDisabled_shouldShowAddGuest()617     public void updateUserList_userSwitcherDisabled_shouldShowAddGuest() {
618         givenUsers(getAdminUser(true));
619         mUserCapabilities.mCanAddGuest = true;
620         mUserCapabilities.mUserSwitcherEnabled = false;
621         doReturn(true)
622                 .when(mUserManager).canAddMoreUsers(eq(UserManager.USER_TYPE_FULL_GUEST));
623 
624         mFragment.updateUserList();
625 
626         verify(mAddGuestPreference).setVisible(true);
627     }
628 
629     @Test
updateUserList_userSwitcherDisabledCannotAddMoreGuests_shouldNotShowAddGuest()630     public void updateUserList_userSwitcherDisabledCannotAddMoreGuests_shouldNotShowAddGuest() {
631         givenUsers(getAdminUser(true));
632         mUserCapabilities.mCanAddGuest = true;
633         mUserCapabilities.mUserSwitcherEnabled = false;
634 
635         mFragment.updateUserList();
636 
637         verify(mAddGuestPreference).setVisible(false);
638     }
639 
640     @Test
updateUserList_shouldAddAdminUserPreference()641     public void updateUserList_shouldAddAdminUserPreference() {
642         givenUsers(getAdminUser(true));
643 
644         mFragment.updateUserList();
645 
646         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
647         verify(mFragment.mUserListCategory).addPreference(captor.capture());
648         UserPreference adminPref = captor.getValue();
649         assertThat(adminPref).isSameInstanceAs(mMePreference);
650     }
651 
652     @Test
updateUserList_existingGuest_shouldAddGuestUserPreference()653     public void updateUserList_existingGuest_shouldAddGuestUserPreference() {
654         givenUsers(getAdminUser(true), getGuest(false));
655 
656         mFragment.updateUserList();
657 
658         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
659         verify(mFragment.mGuestUserCategory, times(1))
660                 .addPreference(captor.capture());
661         UserPreference guestPref = captor.getAllValues().get(0);
662         assertThat(guestPref.getUserId()).isEqualTo(INACTIVE_GUEST_USER_ID);
663         assertThat(guestPref.getTitle()).isEqualTo("Guest");
664         assertThat(guestPref.getIcon()).isNotNull();
665         assertThat(guestPref.getKey()).isEqualTo(KEY_USER_GUEST);
666         assertThat(guestPref.isEnabled()).isEqualTo(true);
667         assertThat(guestPref.isSelectable()).isEqualTo(true);
668         assertThat(guestPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
669     }
670 
671     @Test
updateUserList_existingSecondaryUser_shouldAddSecondaryUserPreference()672     public void updateUserList_existingSecondaryUser_shouldAddSecondaryUserPreference() {
673         givenUsers(getAdminUser(true), getSecondaryUser(false));
674 
675         mFragment.updateUserList();
676 
677         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
678         verify(mFragment.mUserListCategory, times(2))
679                 .addPreference(captor.capture());
680         UserPreference userPref = captor.getAllValues().get(1);
681         assertThat(userPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID);
682         assertThat(userPref.getTitle()).isEqualTo(SECONDARY_USER_NAME);
683         assertThat(userPref.getIcon()).isNotNull();
684         assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID);
685         assertThat(userPref.isEnabled()).isEqualTo(true);
686         assertThat(userPref.isSelectable()).isEqualTo(true);
687         assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
688     }
689 
690     @Test
updateUserList_existingSecondaryUser_shouldAddAllUsers_MultiUserIsDisabled()691     public void updateUserList_existingSecondaryUser_shouldAddAllUsers_MultiUserIsDisabled() {
692         givenUsers(getAdminUser(true), getSecondaryUser(false));
693         mUserCapabilities.mUserSwitcherEnabled = false;
694 
695         mFragment.updateUserList();
696 
697         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
698         verify(mFragment.mUserListCategory, times(2))
699                 .addPreference(captor.capture());
700 
701         List<UserPreference> userPrefs = captor.getAllValues();
702         assertThat(userPrefs.size()).isEqualTo(2);
703         assertThat(userPrefs.get(0)).isSameInstanceAs(mMePreference);
704     }
705 
706     @Test
updateUserList_existingSecondaryUser_shouldAddSecondaryUser_MultiUserIsEnabled()707     public void updateUserList_existingSecondaryUser_shouldAddSecondaryUser_MultiUserIsEnabled() {
708         givenUsers(getAdminUser(true), getSecondaryUser(false));
709 
710         mFragment.updateUserList();
711 
712         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
713         verify(mFragment.mUserListCategory, times(2))
714                 .addPreference(captor.capture());
715 
716         List<UserPreference> userPrefs = captor.getAllValues();
717         UserPreference adminPref = userPrefs.get(0);
718         UserPreference secondaryPref = userPrefs.get(1);
719 
720         assertThat(userPrefs.size()).isEqualTo(2);
721         assertThat(adminPref).isSameInstanceAs(mMePreference);
722         assertThat(secondaryPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID);
723         assertThat(secondaryPref.getTitle()).isEqualTo(SECONDARY_USER_NAME);
724         assertThat(secondaryPref.getIcon()).isNotNull();
725         assertThat(secondaryPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID);
726         assertThat(secondaryPref.isEnabled()).isEqualTo(true);
727         assertThat(secondaryPref.isSelectable()).isEqualTo(true);
728         assertThat(secondaryPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
729     }
730 
731     @Test
updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference()732     public void updateUserList_existingRestrictedUser_shouldAddRestrictedUserPreference() {
733         givenUsers(getAdminUser(true), getRestrictedUser(false));
734 
735         mFragment.updateUserList();
736 
737         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
738         verify(mFragment.mUserListCategory, times(2))
739                 .addPreference(captor.capture());
740         UserPreference userPref = captor.getAllValues().get(1);
741         assertThat(userPref.getUserId()).isEqualTo(INACTIVE_RESTRICTED_USER_ID);
742         assertThat(userPref.getTitle()).isEqualTo(RESTRICTED_USER_NAME);
743         assertThat(userPref.getIcon()).isNotNull();
744         assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_RESTRICTED_USER_ID);
745         assertThat(userPref.getSummary()).isEqualTo("Restricted profile");
746         assertThat(userPref.isEnabled()).isEqualTo(true);
747         assertThat(userPref.isSelectable()).isEqualTo(true);
748         assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
749     }
750 
751     @Test
updateUserList_existingManagedUser_shouldNotAddUserPreference()752     public void updateUserList_existingManagedUser_shouldNotAddUserPreference() {
753         givenUsers(getAdminUser(true), getManagedUser());
754 
755         mFragment.updateUserList();
756 
757         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
758         verify(mFragment.mUserListCategory).addPreference(captor.capture());
759         List<UserPreference> userPreferences = captor.getAllValues();
760         assertThat(userPreferences.size()).isEqualTo(1);
761         assertThat(userPreferences.get(0).getUserId()).isEqualTo(ACTIVE_USER_ID);
762     }
763 
764     @Test
updateUserList_uninitializedRestrictedUser_shouldAddUserPreference()765     public void updateUserList_uninitializedRestrictedUser_shouldAddUserPreference() {
766         UserInfo restrictedUser = getRestrictedUser(false);
767         removeFlag(restrictedUser, UserInfo.FLAG_INITIALIZED);
768         givenUsers(getAdminUser(true), restrictedUser);
769         doReturn(SWITCHABILITY_STATUS_OK).when(mUserManager).getUserSwitchability();
770         mUserCapabilities.mDisallowSwitchUser = false;
771 
772         mFragment.updateUserList();
773 
774         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
775         verify(mFragment.mUserListCategory, times(2))
776                 .addPreference(captor.capture());
777         UserPreference userPref = captor.getAllValues().get(1);
778         assertThat(userPref.getUserId()).isEqualTo(INACTIVE_RESTRICTED_USER_ID);
779         assertThat(userPref.getTitle()).isEqualTo(RESTRICTED_USER_NAME);
780         assertThat(userPref.getIcon()).isNotNull();
781         assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_RESTRICTED_USER_ID);
782         assertThat(userPref.getSummary()).isEqualTo("Not set up - Restricted profile");
783         assertThat(userPref.isEnabled()).isEqualTo(true);
784         assertThat(userPref.isSelectable()).isEqualTo(true);
785         assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
786     }
787 
788     @Test
789     @RequiresFlagsDisabled({Flags.FLAG_NEW_MULTIUSER_SETTINGS_UX})
updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref()790     public void updateUserList_uninitializedUserAndCanNotSwitchUser_shouldDisablePref() {
791         UserInfo uninitializedUser = getSecondaryUser(false);
792         removeFlag(uninitializedUser, UserInfo.FLAG_INITIALIZED);
793         givenUsers(getAdminUser(true), uninitializedUser);
794         doReturn(SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED)
795                 .when(mUserManager).getUserSwitchability();
796         mUserCapabilities.mDisallowSwitchUser = false;
797 
798         mFragment.updateUserList();
799 
800         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
801         verify(mFragment.mUserListCategory, times(2))
802                 .addPreference(captor.capture());
803         UserPreference userPref = captor.getAllValues().get(1);
804         assertThat(userPref.getUserId()).isEqualTo(INACTIVE_SECONDARY_USER_ID);
805         assertThat(userPref.getTitle()).isEqualTo(SECONDARY_USER_NAME);
806         assertThat(userPref.getIcon()).isNotNull();
807         assertThat(userPref.getKey()).isEqualTo("id=" + INACTIVE_SECONDARY_USER_ID);
808         assertThat(userPref.getSummary()).isEqualTo("Not set up");
809         assertThat(userPref.isEnabled()).isEqualTo(false);
810         assertThat(userPref.isSelectable()).isEqualTo(true);
811         assertThat(userPref.getOnPreferenceClickListener()).isSameInstanceAs(mFragment);
812     }
813 
814     @Test
updateUserList_guestWithoutInitializedFlag_shouldNotSetSummary()815     public void updateUserList_guestWithoutInitializedFlag_shouldNotSetSummary() {
816         UserInfo guest = getGuest(false);
817         removeFlag(guest, UserInfo.FLAG_INITIALIZED);
818         givenUsers(getAdminUser(true), guest);
819 
820         mFragment.updateUserList();
821 
822         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
823         verify(mFragment.mGuestUserCategory, times(1))
824                 .addPreference(captor.capture());
825         UserPreference userPref = captor.getAllValues().get(0);
826         assertThat(userPref.getUserId()).isEqualTo(INACTIVE_GUEST_USER_ID);
827         assertThat(userPref.getSummary()).isNull();
828     }
829 
830     @Test
updateUserList_activeUserWithoutInitializedFlag_shouldNotSetSummary()831     public void updateUserList_activeUserWithoutInitializedFlag_shouldNotSetSummary() {
832         UserInfo activeUser = getSecondaryUser(true);
833         removeFlag(activeUser, UserInfo.FLAG_INITIALIZED);
834         givenUsers(activeUser);
835 
836         mFragment.updateUserList();
837 
838         ArgumentCaptor<UserPreference> captor = ArgumentCaptor.forClass(UserPreference.class);
839         verify(mFragment.mUserListCategory).addPreference(captor.capture());
840         UserPreference userPref = captor.getValue();
841         assertThat(userPref.getUserId()).isEqualTo(ACTIVE_USER_ID);
842         assertThat(userPref.getSummary()).isNull();
843     }
844 
845     @Test
updateUserList_guestIsAlreadyCreated_shouldNotShowAddGuest()846     public void updateUserList_guestIsAlreadyCreated_shouldNotShowAddGuest() {
847         givenUsers(getAdminUser(true), getGuest(true));
848         mUserCapabilities.mCanAddGuest = true;
849 
850         mFragment.updateUserList();
851 
852         verify(mAddGuestPreference).setVisible(false);
853     }
854 
855     @Test
updateUserList_userIconLoaded_shouldNotLoadIcon()856     public void updateUserList_userIconLoaded_shouldNotLoadIcon() {
857         UserInfo currentUser = getAdminUser(true);
858         currentUser.iconPath = "/data/system/users/0/photo.png";
859         givenUsers(currentUser);
860         mFragment.mUserIcons.put(ACTIVE_USER_ID,
861                 Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888));
862 
863         mFragment.updateUserList();
864 
865         verify(mUserManager, never()).getUserIcon(anyInt());
866         // updateUserList should be called only once
867         verify(mUserManager).getAliveUsers();
868     }
869 
870     @Ignore
871     @Test
updateUserList_userIconMissing_shouldLoadIcon()872     public void updateUserList_userIconMissing_shouldLoadIcon() {
873         UserInfo currentUser = getAdminUser(true);
874         currentUser.iconPath = "/data/system/users/0/photo.png";
875         givenUsers(currentUser);
876         // create a non-empty sparsearray
877         mFragment.mUserIcons.put(5, Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888));
878         Bitmap userIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
879         doReturn(userIcon).when(mUserManager).getUserIcon(ACTIVE_USER_ID);
880 
881         mFragment.updateUserList();
882         shadowOf(Looper.getMainLooper()).idle();
883 
884         verify(mUserManager).getUserIcon(ACTIVE_USER_ID);
885         // updateUserList should be called another time after loading the icons
886         verify(mUserManager, times(2)).getAliveUsers();
887     }
888 
889     @Test
onPreferenceClick_addGuestClicked_createGuestAndOpenDetails()890     public void onPreferenceClick_addGuestClicked_createGuestAndOpenDetails() {
891         UserInfo createdGuest = getGuest(false);
892         removeFlag(createdGuest, UserInfo.FLAG_INITIALIZED);
893         doReturn(createdGuest).when(mUserManager).createGuest(mActivity);
894         doReturn(mActivity).when(mFragment).getContext();
895 
896         mFragment.onPreferenceClick(mAddGuestPreference);
897 
898         verify(mUserManager).createGuest(mActivity);
899         Intent startedIntent = shadowOf(mActivity).getNextStartedActivity();
900         ShadowIntent shadowIntent = shadowOf(startedIntent);
901         assertThat(shadowIntent.getIntentClass()).isEqualTo(SubSettings.class);
902         assertThat(startedIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
903                 .isEqualTo(UserDetailsSettings.class.getName());
904         Bundle arguments = startedIntent.getBundleExtra(
905                 SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
906         assertThat(arguments).isNotNull();
907         assertThat(arguments.getInt(UserDetailsSettings.EXTRA_USER_ID, 0))
908                 .isEqualTo(createdGuest.id);
909         assertThat(arguments.getBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, false))
910                 .isEqualTo(true);
911         verify(mMetricsFeatureProvider).action(any(), eq(SettingsEnums.ACTION_USER_GUEST_ADD));
912     }
913 
914     @Test
onPreferenceClick_addSupervisedUserClicked_startIntentWithAction()915     public void onPreferenceClick_addSupervisedUserClicked_startIntentWithAction() {
916         final String intentPackage = "testPackage";
917         final String intentAction = UserManager.ACTION_CREATE_SUPERVISED_USER;
918         final int intentFlags = Intent.FLAG_ACTIVITY_NEW_TASK;
919         final int metricsAction = SettingsEnums.ACTION_USER_SUPERVISED_ADD;
920         try {
921             setConfigSupervisedUserCreationPackage(intentPackage);
922             doReturn(new ResolveInfo()).when(mPackageManager).resolveActivity(any(), anyInt());
923             doNothing().when(mFragment).startActivity(any());
924 
925             mFragment.onPreferenceClick(mAddSupervisedUserPreference);
926 
927             final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
928             verify(mFragment).startActivity(captor.capture());
929             assertThat(captor.getValue().getPackage()).isEqualTo(intentPackage);
930             assertThat(captor.getValue().getAction()).isEqualTo(intentAction);
931             assertThat(captor.getValue().getFlags() & intentFlags).isGreaterThan(0);
932 
933             verify(mMetricsFeatureProvider).action(any(), eq(metricsAction));
934         } finally {
935             SettingsShadowResources.reset();
936         }
937     }
938 
939     @Test
getRealUsersCount_onlyAdmin_shouldCount()940     public void getRealUsersCount_onlyAdmin_shouldCount() {
941         givenUsers(getAdminUser(true));
942 
943         int result = mFragment.getRealUsersCount();
944 
945         assertThat(result).isEqualTo(1);
946         verify(mUserManager).getUsers();
947     }
948 
949     @Test
getRealUsersCount_secondaryUser_shouldCount()950     public void getRealUsersCount_secondaryUser_shouldCount() {
951         givenUsers(getAdminUser(true), getSecondaryUser(false));
952 
953         int result = mFragment.getRealUsersCount();
954 
955         assertThat(result).isEqualTo(2);
956         verify(mUserManager).getUsers();
957     }
958 
959     @Test
getRealUsersCount_restrictedUser_shouldCount()960     public void getRealUsersCount_restrictedUser_shouldCount() {
961         givenUsers(getAdminUser(true), getSecondaryUser(false));
962 
963         int result = mFragment.getRealUsersCount();
964 
965         assertThat(result).isEqualTo(2);
966         verify(mUserManager).getUsers();
967     }
968 
969     @Test
getRealUsersCount_guest_shouldNotCount()970     public void getRealUsersCount_guest_shouldNotCount() {
971         givenUsers(getAdminUser(true), getGuest(false));
972 
973         int result = mFragment.getRealUsersCount();
974 
975         assertThat(result).isEqualTo(1);
976         verify(mUserManager).getUsers();
977     }
978 
979     @Test
getRealUsersCount_managedUser_shouldNotCount()980     public void getRealUsersCount_managedUser_shouldNotCount() {
981         givenUsers(getAdminUser(true), getManagedUser());
982 
983         int result = mFragment.getRealUsersCount();
984 
985         assertThat(result).isEqualTo(1);
986         verify(mUserManager).getUsers();
987     }
988 
setConfigSupervisedUserCreationPackage(String value)989     private void setConfigSupervisedUserCreationPackage(String value) {
990         SettingsShadowResources.overrideResource(
991                 com.android.internal.R.string.config_supervisedUserCreationPackage,
992                 value
993         );
994         mFragment.setConfigSupervisedUserCreationPackage();
995         mUserCapabilities.mCanAddUser = true;
996         mFragment.updateUserList();
997     }
998 
999     @Test
addSupervisedUserOption_resourceIsDefined_shouldBeDisplayed()1000     public void addSupervisedUserOption_resourceIsDefined_shouldBeDisplayed() {
1001         try {
1002             setConfigSupervisedUserCreationPackage("test");
1003             verify(mAddSupervisedUserPreference).setVisible(true);
1004         } finally {
1005             SettingsShadowResources.reset();
1006         }
1007     }
1008 
1009     @Test
addSupervisedUserOption_resourceIsNotDefined_shouldBeHidden()1010     public void addSupervisedUserOption_resourceIsNotDefined_shouldBeHidden() {
1011         try {
1012             setConfigSupervisedUserCreationPackage("");
1013             verify(mAddSupervisedUserPreference).setVisible(false);
1014         } finally {
1015             SettingsShadowResources.reset();
1016         }
1017     }
1018 
givenUsers(UserInfo... userInfo)1019     private void givenUsers(UserInfo... userInfo) {
1020         List<UserInfo> users = Arrays.asList(userInfo);
1021         doReturn(users).when(mUserManager).getUsers();
1022         doReturn(users).when(mUserManager).getAliveUsers();
1023         users.forEach(user ->
1024                 doReturn(user).when(mUserManager).getUserInfo(user.id));
1025     }
1026 
removeFlag(UserInfo userInfo, int flag)1027     private static void removeFlag(UserInfo userInfo, int flag) {
1028         userInfo.flags &= ~flag;
1029     }
1030 
getAdminUser(boolean active)1031     private static UserInfo getAdminUser(boolean active) {
1032         return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_ADMIN_USER_ID, ADMIN_USER_NAME,
1033                 null,
1034                 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN,
1035                 UserManager.USER_TYPE_FULL_SYSTEM);
1036     }
1037 
getSecondaryUser(boolean active)1038     private static UserInfo getSecondaryUser(boolean active) {
1039         return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_SECONDARY_USER_ID,
1040                 SECONDARY_USER_NAME, null,
1041                 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED,
1042                 UserManager.USER_TYPE_FULL_SECONDARY);
1043     }
1044 
getRestrictedUser(boolean active)1045     private static UserInfo getRestrictedUser(boolean active) {
1046         return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_RESTRICTED_USER_ID,
1047                 RESTRICTED_USER_NAME, null,
1048                 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_RESTRICTED,
1049                 UserManager.USER_TYPE_FULL_RESTRICTED);
1050     }
1051 
getManagedUser()1052     private static UserInfo getManagedUser() {
1053         return new UserInfo(MANAGED_USER_ID,
1054                 MANAGED_USER_NAME, null,
1055                 UserInfo.FLAG_PROFILE | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_MANAGED_PROFILE,
1056                 UserManager.USER_TYPE_PROFILE_MANAGED);
1057     }
1058 
getGuest(boolean active)1059     private static UserInfo getGuest(boolean active) {
1060         return new UserInfo(active ? ACTIVE_USER_ID : INACTIVE_GUEST_USER_ID, GUEST_USER_NAME,
1061                 null,
1062                 UserInfo.FLAG_FULL | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_GUEST,
1063                 UserManager.USER_TYPE_FULL_GUEST);
1064     }
1065 
1066 
1067 }
1068