OSDN Git Service

Fix new user setting in a call
authorYongjiang Wu <yongjiang.x.wu@sonymobile.com>
Wed, 12 Oct 2016 05:35:38 +0000 (13:35 +0800)
committerDoris Ling <dling@google.com>
Tue, 3 Jul 2018 21:20:39 +0000 (14:20 -0700)
In a call, the flag of UserManager is changed, then "Add user" and
"Guest" items in Settings are still enabled.
To fix this issue, these items will be disabled according to
"UserManager#canSwitchUsers".

Bug: 80447394
Test: make RunSettingsRoboTests ROBOTEST_FILTER=UserSettingsTest
Change-Id: Ib4c754603418528f5c6f1c78b8aabf33e863c8b9

src/com/android/settings/users/UserSettings.java
tests/robotests/src/com/android/settings/users/UserSettingsTest.java

index 00809e4..931fdcf 100644 (file)
@@ -107,6 +107,7 @@ public class UserSettings extends SettingsPreferenceFragment
 
     private static final String KEY_USER_LIST = "user_list";
     private static final String KEY_USER_ME = "user_me";
+    private static final String KEY_USER_GUEST = "user_guest";
     private static final String KEY_ADD_USER = "user_add";
     private static final String KEY_ADD_USER_WHEN_LOCKED = "user_settings_add_users_when_locked";
 
@@ -144,9 +145,12 @@ public class UserSettings extends SettingsPreferenceFragment
         USER_REMOVED_INTENT_FILTER.addAction(Intent.ACTION_USER_INFO_CHANGED);
     }
 
-    private PreferenceGroup mUserListCategory;
-    private UserPreference mMePreference;
-    private RestrictedPreference mAddUser;
+    @VisibleForTesting
+    PreferenceGroup mUserListCategory;
+    @VisibleForTesting
+    UserPreference mMePreference;
+    @VisibleForTesting
+    RestrictedPreference mAddUser;
     private int mRemovingUserId = -1;
     private int mAddedUserId = 0;
     private boolean mAddingUser;
@@ -800,7 +804,8 @@ public class UserSettings extends SettingsPreferenceFragment
         removeThisUser();
     }
 
-    private void updateUserList() {
+    @VisibleForTesting
+    void updateUserList() {
         final Context context = getActivity();
         if (context == null) {
             return;
@@ -863,7 +868,7 @@ public class UserSettings extends SettingsPreferenceFragment
                 // set.
                 if (!mUserCaps.mDisallowSwitchUser) {
                     pref.setOnPreferenceClickListener(this);
-                    pref.setSelectable(true);
+                    pref.setSelectable(mUserManager.canSwitchUsers());
                 }
             } else if (user.isRestricted()) {
                 pref.setSummary(R.string.user_summary_restricted_profile);
@@ -902,6 +907,7 @@ public class UserSettings extends SettingsPreferenceFragment
                     null /* delete icon handler */);
             pref.setTitle(R.string.user_guest);
             pref.setIcon(getEncircledDefaultIcon());
+            pref.setKey(KEY_USER_GUEST);
             userPreferences.add(pref);
             if (mUserCaps.mDisallowAddUser) {
                 pref.setDisabledByAdmin(mUserCaps.mEnforcedAdmin);
@@ -910,6 +916,9 @@ public class UserSettings extends SettingsPreferenceFragment
             } else {
                 pref.setDisabledByAdmin(null);
             }
+            if (!mUserManager.canSwitchUsers()) {
+                pref.setSelectable(false);
+            }
             int finalGuestId = guestId;
             pref.setOnPreferenceClickListener(preference -> {
                 int id = finalGuestId;
@@ -969,7 +978,7 @@ public class UserSettings extends SettingsPreferenceFragment
         if ((mUserCaps.mCanAddUser || mUserCaps.mDisallowAddUserSetByAdmin) &&
                 Utils.isDeviceProvisioned(context)) {
             boolean moreUsers = mUserManager.canAddMoreUsers();
-            mAddUser.setEnabled(moreUsers && !mAddingUser);
+            mAddUser.setEnabled(moreUsers && !mAddingUser && mUserManager.canSwitchUsers());
             if (!moreUsers) {
                 mAddUser.setSummary(getString(R.string.user_add_max_count, getMaxRealUsers()));
             } else {
index a7fe916..89bf9a1 100644 (file)
@@ -18,45 +18,94 @@ package com.android.settings.users;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.pm.UserInfo;
+import android.content.SharedPreferences;
+import android.graphics.drawable.Drawable;
 import android.os.UserManager;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.RestrictedPreference;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class UserSettingsTest {
 
+    private static final String KEY_USER_GUEST = "user_guest";
+    private int mProvisioned;
+
+    @Mock
+    private Drawable mDefaultIconDrawable;
+    @Mock
+    private PreferenceManager mMockPreferenceManager;
+    @Mock
+    private UserPreference mMePreference;
     @Mock
     private UserManager mUserManager;
     @Mock
     private SummaryLoader mSummaryLoader;
+
     private Activity mActivity;
+    private Context mContext;
+    private UserSettings mFragment;
+    private UserCapabilities mUserCapabilities;
     private SummaryLoader.SummaryProvider mSummaryProvider;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mActivity = spy(Robolectric.buildActivity(Activity.class).get());
+        mContext = spy(RuntimeEnvironment.application);
+        mFragment = spy(new UserSettings());
+        ReflectionHelpers.setField(mFragment, "mAddUserWhenLockedPreferenceController",
+                mock(AddUserWhenLockedPreferenceController.class));
+        ReflectionHelpers.setField(mFragment, "mMultiUserFooterPreferenceController",
+                mock(MultiUserFooterPreferenceController.class));
+        mUserCapabilities = UserCapabilities.create(mContext);
         when((Object) mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
+        doReturn(mActivity).when(mFragment).getActivity();
+
+        mProvisioned = Settings.Global.getInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, 0);
+        final SharedPreferences prefs = mock(SharedPreferences .class);
+        when(mMockPreferenceManager.getSharedPreferences()).thenReturn(prefs);
+        when(mMockPreferenceManager.getContext()).thenReturn(mContext);
 
         mSummaryProvider =
             UserSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, mSummaryLoader);
     }
 
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, mProvisioned);
+    }
+
     @Test
     public void setListening_shouldSetSummaryWithUserName() {
         final String name = "John";
@@ -75,4 +124,63 @@ public class UserSettingsTest {
         // Should not crash here
         assertThat(UserSettings.assignDefaultPhoto(null, 0)).isFalse();
     }
+
+    @Test
+    public void updateUserList_cannotSwitchUser_shouldNotBeSelectableForGuest() {
+        final RestrictedPreference addUser = spy(new RestrictedPreference(mContext));
+        final PreferenceGroup userListCategory = spy(new PreferenceCategory(mContext));
+
+        mUserCapabilities.mIsGuest = false;
+        mUserCapabilities.mCanAddGuest = true;
+        mUserCapabilities.mDisallowAddUser = false;
+        mUserCapabilities.mDisallowSwitchUser = false;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
+        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
+        mFragment.mMePreference = mMePreference;
+        mFragment.mUserListCategory = userListCategory;
+        mFragment.mAddUser = addUser;
+
+        when(mUserManager.canSwitchUsers()).thenReturn(false);
+        doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager();
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+        doReturn(mMockPreferenceManager).when(userListCategory).getPreferenceManager();
+
+        mFragment.updateUserList();
+
+        final Preference guest = userListCategory.findPreference(KEY_USER_GUEST);
+        assertThat(guest.isSelectable()).isFalse();
+    }
+
+    @Test
+    public void updateUserList_cannotSwitchUser_shouldDisableAddUser() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+            Settings.Global.DEVICE_PROVISIONED, 1);
+        final RestrictedPreference addUser = spy(new RestrictedPreference(mContext));
+        final PreferenceGroup userListCategory = spy(new PreferenceCategory(mContext));
+
+        mUserCapabilities.mCanAddUser = true;
+        mUserCapabilities.mDisallowAddUser = false;
+        mUserCapabilities.mUserSwitcherEnabled = true;
+
+        ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
+        ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
+        ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
+        ReflectionHelpers.setField(mFragment, "mAddingUser", false);
+        mFragment.mMePreference = mMePreference;
+        mFragment.mUserListCategory = userListCategory;
+        mFragment.mAddUser = addUser;
+
+        when(mUserManager.canSwitchUsers()).thenReturn(false);
+        when(mUserManager.canAddMoreUsers()).thenReturn(true);
+        doReturn(mMockPreferenceManager).when(mFragment).getPreferenceManager();
+        doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
+        doReturn(mMockPreferenceManager).when(userListCategory).getPreferenceManager();
+
+        mFragment.updateUserList();
+
+        assertThat(addUser.isEnabled()).isFalse();
+    }
 }