Clean up CarUserManagerHelper methods only used in Settings [1]
Started cleaning up methods only used in the Settings app.
- #isForegroundUserGuest
- #hasUserRestriction
- #canCurrentProcessAddUsers
- #canCurrentProcessRemoveUsers
- #scaleUserIcon
- #setUserRestriction
Also added 2 tests to DevelopmentSettingsUtilTest around DISALLOW_DEBUGGING_FEATURES flag.
To update tests, I needed to introduce more usage of ShadowUserManager.
There's a bug with the implementation around UserRestrictions, so I had
to add a redirect method for setUserRestriction() to our subclass ShadowUserManager.
Bug: 137136907
Test: atest CarSettingsRoboTests
Test: atest CarUserManagerHelperTest
Change-Id: Ica186ce84d604db9ee20a0dd4ccc430e60d65e11
diff --git a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
index 63ded44..ce003e5 100644
--- a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
+++ b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
@@ -59,12 +59,12 @@
* debugging is allowed for user, and the user is an admin or a demo user.
*/
public static boolean isDevelopmentSettingsEnabled(Context context,
- CarUserManagerHelper carUserManagerHelper) {
+ CarUserManagerHelper carUserManagerHelper, UserManager userManager) {
boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, Build.IS_ENG ? 1 : 0) != 0;
- boolean hasRestriction = carUserManagerHelper.hasUserRestriction(
+ boolean hasRestriction = userManager.hasUserRestriction(
UserManager.DISALLOW_DEBUGGING_FEATURES,
- carUserManagerHelper.getCurrentProcessUserInfo());
+ carUserManagerHelper.getCurrentProcessUserInfo().getUserHandle());
boolean isAdminOrDemo = carUserManagerHelper.isCurrentProcessAdminUser()
|| carUserManagerHelper.isCurrentProcessDemoUser();
return isAdminOrDemo && !hasRestriction && settingEnabled;
diff --git a/src/com/android/car/settings/system/BuildNumberPreferenceController.java b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
index c2b7718..7e98d0a 100644
--- a/src/com/android/car/settings/system/BuildNumberPreferenceController.java
+++ b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
@@ -20,6 +20,7 @@
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.os.Build;
+import android.os.UserManager;
import android.widget.Toast;
import androidx.preference.Preference;
@@ -33,6 +34,7 @@
public class BuildNumberPreferenceController extends PreferenceController<Preference> {
private final CarUserManagerHelper mCarUserManagerHelper;
+ private UserManager mUserManager;
private Toast mDevHitToast;
private int mDevHitCountdown;
@@ -40,6 +42,7 @@
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
mCarUserManagerHelper = new CarUserManagerHelper(context);
+ mUserManager = UserManager.get(context);
}
@Override
@@ -55,7 +58,7 @@
protected void onResumeInternal() {
mDevHitToast = null;
mDevHitCountdown = DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
- mCarUserManagerHelper) ? -1 : getTapsToBecomeDeveloper();
+ mCarUserManagerHelper, mUserManager) ? -1 : getTapsToBecomeDeveloper();
}
@Override
diff --git a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
index 9b2b22b..cb1e497 100644
--- a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -19,6 +19,7 @@
import android.car.drivingstate.CarUxRestrictions;
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
+import android.os.UserManager;
import androidx.preference.Preference;
@@ -30,11 +31,13 @@
public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
private CarUserManagerHelper mCarUserManagerHelper;
+ private UserManager mUserManager;
public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
super(context, preferenceKey, fragmentController, uxRestrictions);
mCarUserManagerHelper = new CarUserManagerHelper(context);
+ mUserManager = UserManager.get(context);
}
@Override
@@ -45,6 +48,6 @@
@Override
protected int getAvailabilityStatus() {
return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
- mCarUserManagerHelper) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ mCarUserManagerHelper, mUserManager) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
}
diff --git a/src/com/android/car/settings/users/PermissionsPreferenceController.java b/src/com/android/car/settings/users/PermissionsPreferenceController.java
index c918dbb..0bafc77 100644
--- a/src/com/android/car/settings/users/PermissionsPreferenceController.java
+++ b/src/com/android/car/settings/users/PermissionsPreferenceController.java
@@ -91,8 +91,10 @@
preference.getExtras().putString(PERMISSION_TYPE_KEY, permission.getPermissionKey());
preference.setOnPreferenceChangeListener((pref, newValue) -> {
boolean granted = (boolean) newValue;
- getCarUserManagerHelper().setUserRestriction(getUserInfo(),
- pref.getExtras().getString(PERMISSION_TYPE_KEY), !granted);
+ UserManager.get(context).setUserRestriction(
+ pref.getExtras().getString(PERMISSION_TYPE_KEY),
+ !granted,
+ getUserInfo().getUserHandle());
return true;
});
mPermissionPreferences.add(preference);
@@ -114,8 +116,11 @@
@Override
protected void updateState(PreferenceGroup preferenceGroup) {
for (SwitchPreference switchPreference : mPermissionPreferences) {
- switchPreference.setChecked(!getCarUserManagerHelper().hasUserRestriction(
- switchPreference.getExtras().getString(PERMISSION_TYPE_KEY), getUserInfo()));
+ UserManager userManager = UserManager.get(getContext());
+ switchPreference.setChecked(
+ !userManager.hasUserRestriction(
+ switchPreference.getExtras().getString(PERMISSION_TYPE_KEY),
+ getUserInfo().getUserHandle()));
}
}
}
diff --git a/src/com/android/car/settings/users/UserDetailsBaseFragment.java b/src/com/android/car/settings/users/UserDetailsBaseFragment.java
index 4be3d98..b576e68 100644
--- a/src/com/android/car/settings/users/UserDetailsBaseFragment.java
+++ b/src/com/android/car/settings/users/UserDetailsBaseFragment.java
@@ -22,6 +22,7 @@
import android.content.pm.UserInfo;
import android.os.Bundle;
import android.os.UserHandle;
+import android.os.UserManager;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
@@ -37,6 +38,7 @@
public abstract class UserDetailsBaseFragment extends SettingsFragment {
private CarUserManagerHelper mCarUserManagerHelper;
+ private UserManager mUserManager;
private UserInfo mUserInfo;
private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
@@ -74,6 +76,7 @@
super.onAttach(context);
int userId = getArguments().getInt(Intent.EXTRA_USER_ID);
mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+ mUserManager = UserManager.get(getContext());
mUserInfo = UserUtils.getUserInfo(getContext(), userId);
}
@@ -116,7 +119,7 @@
private void showRemoveUserButton() {
Button removeUserBtn = getActivity().findViewById(R.id.action_button1);
- if (!mCarUserManagerHelper.canCurrentProcessRemoveUsers()
+ if (mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)
|| mUserInfo.id == UserHandle.USER_SYSTEM
|| mCarUserManagerHelper.isCurrentProcessDemoUser()) {
removeUserBtn.setVisibility(View.GONE);
diff --git a/src/com/android/car/settings/users/UserGridRecyclerView.java b/src/com/android/car/settings/users/UserGridRecyclerView.java
index 7e9fc85..92d2d7c 100644
--- a/src/com/android/car/settings/users/UserGridRecyclerView.java
+++ b/src/com/android/car/settings/users/UserGridRecyclerView.java
@@ -124,7 +124,7 @@
}
// Add start guest user record if the system is not logged in as guest already.
- if (!mCarUserManagerHelper.isForegroundUserGuest()) {
+ if (!mCarUserManagerHelper.getCurrentForegroundUserInfo().isGuest()) {
userRecords.add(createStartGuestUserRecord());
}
diff --git a/src/com/android/car/settings/users/UserIconProvider.java b/src/com/android/car/settings/users/UserIconProvider.java
index f08ef66..513c1ea 100644
--- a/src/com/android/car/settings/users/UserIconProvider.java
+++ b/src/com/android/car/settings/users/UserIconProvider.java
@@ -53,8 +53,7 @@
return context.getDrawable(R.drawable.ic_user);
}
Resources res = context.getResources();
- BitmapDrawable scaledIcon = (BitmapDrawable) mCarUserManagerHelper.scaleUserIcon(icon, res
- .getDimensionPixelSize(R.dimen.icon_size));
+ BitmapDrawable scaledIcon = (BitmapDrawable) UserUtils.scaleUserIcon(res, icon);
// Enforce that the icon is circular
RoundedBitmapDrawable circleIcon = RoundedBitmapDrawableFactory
@@ -69,19 +68,7 @@
* @return Drawable representing the default guest icon.
*/
public Drawable getDefaultGuestIcon(Context context) {
- return UserIconProvider.scaleUserIcon(mCarUserManagerHelper.getGuestDefaultIcon(),
- mCarUserManagerHelper, context);
- }
-
- /**
- * Scales passed in bitmap to the appropriate user icon size.
- *
- * @param bitmap Bitmap to scale.
- * @return Drawable scaled to the user icon size.
- */
- public static Drawable scaleUserIcon(Bitmap bitmap, CarUserManagerHelper userManagerHelper,
- Context context) {
- return userManagerHelper.scaleUserIcon(bitmap, context.getResources()
- .getDimensionPixelSize(R.dimen.icon_size));
+ return UserUtils.scaleUserIcon(
+ context.getResources(), mCarUserManagerHelper.getGuestDefaultIcon());
}
}
diff --git a/src/com/android/car/settings/users/UserUtils.java b/src/com/android/car/settings/users/UserUtils.java
index 3d26939..2abff07 100644
--- a/src/com/android/car/settings/users/UserUtils.java
+++ b/src/com/android/car/settings/users/UserUtils.java
@@ -19,6 +19,10 @@
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
import android.os.UserManager;
import com.android.car.settings.R;
@@ -60,4 +64,13 @@
return carUserManagerHelper.isCurrentProcessAdminUser() && !userInfo.isAdmin();
}
+ /**
+ * Returns a {@link Drawable} for the given {@code icon} scaled to the appropriate size.
+ */
+ public static Drawable scaleUserIcon(Resources res, Bitmap icon) {
+ int desiredSize = res.getDimensionPixelSize(R.dimen.icon_size);
+ Bitmap scaledIcon =
+ Bitmap.createScaledBitmap(icon, desiredSize, desiredSize, /*filter=*/true);
+ return new BitmapDrawable(res, scaledIcon);
+ }
}
diff --git a/src/com/android/car/settings/users/UsersListFragment.java b/src/com/android/car/settings/users/UsersListFragment.java
index 8cebe45..d13f065 100644
--- a/src/com/android/car/settings/users/UsersListFragment.java
+++ b/src/com/android/car/settings/users/UsersListFragment.java
@@ -22,6 +22,7 @@
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.UserManager;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
@@ -47,6 +48,7 @@
private static final String FACTORY_RESET_REASON = "ExitRetailModeConfirmed";
private CarUserManagerHelper mCarUserManagerHelper;
+ private UserManager mUserManager;
private ProgressBar mProgressBar;
private Button mAddUserButton;
@@ -84,6 +86,7 @@
mOpacityDisabled = getContext().getResources().getFloat(R.dimen.opacity_disabled);
mOpacityEnabled = getContext().getResources().getFloat(R.dimen.opacity_enabled);
mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+ mUserManager = UserManager.get(getContext());
}
@Override
@@ -102,7 +105,7 @@
});
if (mCarUserManagerHelper.isCurrentProcessDemoUser()) {
mAddUserButton.setText(R.string.exit_retail_button_text);
- } else if (mCarUserManagerHelper.canCurrentProcessAddUsers()) {
+ } else if (canCurrentProcessAddUsers()) {
mAddUserButton.setText(R.string.user_add_user_menu);
}
}
@@ -188,7 +191,7 @@
}
// Only add the add user button if the current user is allowed to add a user.
- if (mCarUserManagerHelper.canCurrentProcessAddUsers()) {
+ if (canCurrentProcessAddUsers()) {
ConfirmationDialogFragment dialogFragment =
UsersDialogProvider.getConfirmCreateNewUserDialogFragment(getContext(),
mConfirmListener, null);
@@ -200,4 +203,8 @@
private void showBlockingMessage() {
Toast.makeText(getContext(), R.string.restricted_while_driving, Toast.LENGTH_SHORT).show();
}
+
+ private boolean canCurrentProcessAddUsers() {
+ return !mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
index e527c0c..d208f6d 100644
--- a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
+++ b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
@@ -18,14 +18,19 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
import android.provider.Settings;
import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+import com.android.car.settings.testutils.ShadowUserManager;
import org.junit.After;
import org.junit.Before;
@@ -36,12 +41,18 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLocalBroadcastManager.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLocalBroadcastManager.class,
+ ShadowUserManager.class})
public class DevelopmentSettingsUtilTest {
+ private static final UserInfo USER_INFO = new UserInfo(0, null, 0);
+
private Context mContext;
+ private UserManager mUserManager;
+
@Mock
private CarUserManagerHelper mCarUserManagerHelper;
@@ -52,12 +63,19 @@
mContext = RuntimeEnvironment.application;
when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+ when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(USER_INFO);
+
+ mUserManager = mContext.getSystemService(UserManager.class);
+ UserManager mockUserManager = mock(UserManager.class);
+ when(mockUserManager.getUserInfo(anyInt())).thenReturn(USER_INFO);
+ ShadowUserManager.setInstance(mockUserManager);
}
@After
public void tearDown() {
ShadowCarUserManagerHelper.reset();
ShadowLocalBroadcastManager.reset();
+ ShadowUserManager.reset();
}
@Test
@@ -66,7 +84,7 @@
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
- mCarUserManagerHelper)).isFalse();
+ mCarUserManagerHelper, mUserManager)).isFalse();
}
@Test
@@ -75,7 +93,7 @@
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
- mCarUserManagerHelper)).isTrue();
+ mCarUserManagerHelper, mUserManager)).isTrue();
}
@Test
@@ -86,7 +104,7 @@
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
- mCarUserManagerHelper)).isFalse();
+ mCarUserManagerHelper, mUserManager)).isFalse();
}
@Test
@@ -97,7 +115,7 @@
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
- mCarUserManagerHelper)).isTrue();
+ mCarUserManagerHelper, mUserManager)).isTrue();
}
@Test
@@ -108,7 +126,35 @@
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
- mCarUserManagerHelper)).isFalse();
+ mCarUserManagerHelper, mUserManager)).isFalse();
+ }
+
+ @Test
+ public void isEnabled_hasDisallowDebuggingRestriction_shouldReturnFalse() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+ when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+ when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+
+ getShadowUserManager().setUserRestriction(
+ USER_INFO.getUserHandle(), UserManager.DISALLOW_DEBUGGING_FEATURES, true);
+
+ assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+ mCarUserManagerHelper, mUserManager)).isFalse();
+ }
+
+ @Test
+ public void isEnabled_doesNotHaveDisallowDebuggingRestriction_shouldReturnTrue() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+ when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+ when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+
+ getShadowUserManager().setUserRestriction(
+ USER_INFO.getUserHandle(), UserManager.DISALLOW_DEBUGGING_FEATURES, false);
+
+ assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+ mCarUserManagerHelper, mUserManager)).isTrue();
}
@Test
@@ -146,4 +192,8 @@
0);
assertThat(DevelopmentSettingsUtil.isDeviceProvisioned(mContext)).isFalse();
}
+
+ private ShadowUserManager getShadowUserManager() {
+ return Shadow.extract(mContext.getSystemService(UserManager.class));
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
index c2b365a..2bc6a2e 100644
--- a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
@@ -19,12 +19,14 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -35,6 +37,7 @@
import com.android.car.settings.common.PreferenceControllerTestHelper;
import com.android.car.settings.development.DevelopmentSettingsUtil;
import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserManager;
import org.junit.After;
import org.junit.Before;
@@ -48,7 +51,7 @@
import org.robolectric.shadows.ShadowToast;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
public class BuildNumberPreferenceControllerTest {
private Context mContext;
@@ -58,11 +61,14 @@
private Preference mPreference;
@Mock
private CarUserManagerHelper mCarUserManagerHelper;
+ @Mock
+ private UserManager mUserManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+ ShadowUserManager.setInstance(mUserManager);
mContext = RuntimeEnvironment.application;
mPreference = new Preference(mContext);
mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
@@ -75,8 +81,8 @@
// By default, no restrictions on debugging features.
when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(new UserInfo());
- when(mCarUserManagerHelper.hasUserRestriction(eq(UserManager.DISALLOW_DEBUGGING_FEATURES),
- any(UserInfo.class))).thenReturn(false);
+ when(mUserManager.hasUserRestriction(eq(UserManager.DISALLOW_DEBUGGING_FEATURES),
+ any(UserHandle.class))).thenReturn(false);
// By default device is provisioned.
Settings.Global.putInt(mContext.getContentResolver(),
@@ -86,11 +92,14 @@
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+ when(mUserManager.getUserInfo(anyInt())).thenReturn(new UserInfo(10, null, 0));
}
@After
public void tearDown() {
ShadowCarUserManagerHelper.reset();
+ ShadowUserManager.reset();
}
@Test
@@ -154,7 +163,7 @@
mPreference.performClick();
}
assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
- mCarUserManagerHelper)).isTrue();
+ mCarUserManagerHelper, mUserManager)).isTrue();
}
@Test
diff --git a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
index a82c6af..b322443 100644
--- a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
@@ -33,6 +33,7 @@
import com.android.car.settings.common.PreferenceControllerTestHelper;
import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserManager;
import org.junit.After;
import org.junit.Before;
@@ -43,9 +44,10 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
public class DeveloperOptionsEntryPreferenceControllerTest {
private Context mContext;
@@ -64,17 +66,16 @@
new Preference(mContext)).getController();
// Setup admin user who is able to enable developer settings.
- mUserInfo = new UserInfo();
+ mUserInfo = new UserInfo(10, null, 0);
when(mShadowCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
when(mShadowCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
when(mShadowCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(mUserInfo);
- new CarUserManagerHelper(mContext).setUserRestriction(mUserInfo,
- UserManager.DISALLOW_DEBUGGING_FEATURES, false);
}
@After
public void tearDown() {
ShadowCarUserManagerHelper.reset();
+ ShadowUserManager.reset();
}
@Test
@@ -95,8 +96,12 @@
public void testGetAvailabilityStatus_devOptionsEnabled_hasUserRestriction_isUnavailable() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
- new CarUserManagerHelper(mContext).setUserRestriction(mUserInfo,
- UserManager.DISALLOW_DEBUGGING_FEATURES, true);
+ getShadowUserManager().setUserRestriction(
+ mUserInfo.getUserHandle(), UserManager.DISALLOW_DEBUGGING_FEATURES, true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
}
+
+ private ShadowUserManager getShadowUserManager() {
+ return Shadow.extract(mContext.getSystemService(UserManager.class));
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
index 02fc562..2a81aed 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
@@ -109,21 +109,11 @@
}
@Implementation
- protected boolean canCurrentProcessAddUsers() {
- return sMockInstance.canCurrentProcessAddUsers();
- }
-
- @Implementation
protected int getMaxSupportedRealUsers() {
return sMockInstance.getMaxSupportedRealUsers();
}
@Implementation
- protected boolean canCurrentProcessRemoveUsers() {
- return sMockInstance.canCurrentProcessRemoveUsers();
- }
-
- @Implementation
protected void grantAdminPermissions(UserInfo user) {
sMockInstance.grantAdminPermissions(user);
}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
index d08f2c9..b7c502d 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
@@ -18,6 +18,7 @@
import android.annotation.UserIdInt;
import android.content.pm.UserInfo;
+import android.os.UserHandle;
import android.os.UserManager;
import android.util.ArrayMap;
@@ -68,6 +69,11 @@
mProfiles.get(userHandle).add(new UserInfo(profileUserHandle, profileName, profileFlags));
}
+ @Implementation
+ protected void setUserRestriction(String key, boolean value, UserHandle userHandle) {
+ setUserRestriction(userHandle, key, value);
+ }
+
@Resetter
public static void reset() {
sInstance = null;
diff --git a/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
index 12eccca..53c22b8 100644
--- a/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
@@ -18,9 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
-
-import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
@@ -31,7 +28,7 @@
import com.android.car.settings.common.LogicalPreferenceGroup;
import com.android.car.settings.common.PreferenceControllerTestHelper;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserManager;
import org.junit.After;
import org.junit.Before;
@@ -40,6 +37,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
/**
* Test for the preference controller which populates the various permissions preferences.
@@ -47,36 +45,34 @@
* i.e. DISALLOW_ADD_USER may be the restriction, but the switch represents "create new users".
*/
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class})
+@Config(shadows = {ShadowUserManager.class})
public class PermissionsPreferenceControllerTest {
private static final String TEST_RESTRICTION = UserManager.DISALLOW_ADD_USER;
private static final UserInfo TEST_USER = new UserInfo(/* id= */ 10,
"TEST_USER_NAME", /* flags= */ 0);
+ private Context mContext;
private PreferenceControllerTestHelper<PermissionsPreferenceController>
mPreferenceControllerHelper;
private PermissionsPreferenceController mController;
private PreferenceGroup mPreferenceGroup;
- private CarUserManagerHelper mCarUserManagerHelper;
@Before
public void setUp() {
- Context context = RuntimeEnvironment.application;
- ShadowCarUserManagerHelper.setMockInstance(mock(CarUserManagerHelper.class));
- mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+ mContext = RuntimeEnvironment.application;
+ mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
PermissionsPreferenceController.class);
mController = mPreferenceControllerHelper.getController();
mController.setUserInfo(TEST_USER);
- mPreferenceGroup = new LogicalPreferenceGroup(context);
+ mPreferenceGroup = new LogicalPreferenceGroup(mContext);
mPreferenceControllerHelper.setPreference(mPreferenceGroup);
- mCarUserManagerHelper = new CarUserManagerHelper(context);
mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
@After
public void tearDown() {
- ShadowCarUserManagerHelper.reset();
+ ShadowUserManager.reset();
}
@Test
@@ -97,7 +93,8 @@
SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
TEST_RESTRICTION);
preference.setChecked(true);
- mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, true);
+ getShadowUserManager().setUserRestriction(
+ TEST_USER.getUserHandle(), TEST_RESTRICTION, true);
mController.refreshUi();
assertThat(preference.isChecked()).isFalse();
}
@@ -107,7 +104,8 @@
SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
TEST_RESTRICTION);
preference.setChecked(false);
- mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, false);
+ getShadowUserManager().setUserRestriction(
+ TEST_USER.getUserHandle(), TEST_RESTRICTION, false);
mController.refreshUi();
assertThat(preference.isChecked()).isTrue();
}
@@ -116,18 +114,22 @@
public void testOnPreferenceChange_changeToFalse() {
SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
TEST_RESTRICTION);
- mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, true);
+ getShadowUserManager().setUserRestriction(
+ TEST_USER.getUserHandle(), TEST_RESTRICTION, true);
preference.callChangeListener(true);
- assertThat(mCarUserManagerHelper.hasUserRestriction(TEST_RESTRICTION, TEST_USER)).isFalse();
+ assertThat(UserManager.get(mContext)
+ .hasUserRestriction(TEST_RESTRICTION, TEST_USER.getUserHandle())).isFalse();
}
@Test
public void testOnPreferenceChange_changeToTrue() {
SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
TEST_RESTRICTION);
- mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, false);
+ getShadowUserManager().setUserRestriction(
+ TEST_USER.getUserHandle(), TEST_RESTRICTION, false);
preference.callChangeListener(false);
- assertThat(mCarUserManagerHelper.hasUserRestriction(TEST_RESTRICTION, TEST_USER)).isTrue();
+ assertThat(UserManager.get(mContext)
+ .hasUserRestriction(TEST_RESTRICTION, TEST_USER.getUserHandle())).isTrue();
}
private SwitchPreference getPreferenceForRestriction(
@@ -141,4 +143,8 @@
}
return null;
}
+
+ private ShadowUserManager getShadowUserManager() {
+ return Shadow.extract(mContext.getSystemService(UserManager.class));
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
index a084de9..2882745 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
@@ -22,6 +22,7 @@
import android.car.userlib.CarUserManagerHelper;
import android.content.pm.UserInfo;
+import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.view.View;
@@ -42,7 +43,9 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
import java.util.Arrays;
@@ -94,7 +97,8 @@
@Test
public void testRemoveUserButtonVisible_whenAllowedToRemoveUsers() {
- when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+ getShadowUserManager().setUserRestriction(
+ Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
createUserDetailsBaseFragment(/*userId=*/1);
@@ -103,7 +107,8 @@
@Test
public void testRemoveUserButtonHidden_whenNotAllowedToRemoveUsers() {
- when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(false);
+ getShadowUserManager().setUserRestriction(
+ Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, true);
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
createUserDetailsBaseFragment(/*userId=*/1);
@@ -112,7 +117,8 @@
@Test
public void testRemoveUserButtonHidden_whenUserIsSystemUser() {
- when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+ getShadowUserManager().setUserRestriction(
+ Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
createUserDetailsBaseFragment(UserHandle.USER_SYSTEM);
@@ -121,7 +127,8 @@
@Test
public void testRemoveUserButtonHidden_demoUser() {
- when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+ getShadowUserManager().setUserRestriction(
+ Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
createUserDetailsBaseFragment(/*userId=*/1);
@@ -130,7 +137,8 @@
@Test
public void testRemoveUserButtonClick_createsRemovalDialog() {
- when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+ getShadowUserManager().setUserRestriction(
+ Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
when(mCarUserManagerHelper.getAllPersistentUsers()).thenReturn(
Arrays.asList(new UserInfo()));
@@ -151,4 +159,8 @@
mTestActivity.launchFragment(mUserDetailsBaseFragment);
mRemoveUserButton = (Button) mTestActivity.findViewById(R.id.action_button1);
}
+
+ private ShadowUserManager getShadowUserManager() {
+ return Shadow.extract(RuntimeEnvironment.application.getSystemService(UserManager.class));
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
index 6d03d8a..12a5eba 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
@@ -26,6 +26,7 @@
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
+import android.os.Process;
import android.os.UserManager;
import android.widget.Button;
@@ -34,6 +35,7 @@
import com.android.car.settings.testutils.BaseTestActivity;
import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
import org.junit.After;
import org.junit.Before;
@@ -45,6 +47,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
import java.util.ArrayList;
@@ -52,14 +55,14 @@
* Tests for UserDetailsFragment.
*/
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class,
+ ShadowUserIconProvider.class})
public class UsersListFragmentTest {
private Context mContext;
private BaseTestActivity mTestActivity;
private UsersListFragment mFragment;
private Button mActionButton;
- private ConfirmationDialogFragment mDialog;
@Mock
private CarUserManagerHelper mCarUserManagerHelper;
@@ -78,6 +81,7 @@
@After
public void tearDown() {
ShadowCarUserManagerHelper.reset();
+ ShadowUserManager.reset();
}
/* Test that onCreateNewUserConfirmed invokes a creation of a new non-admin. */
@@ -113,7 +117,8 @@
/* Test that if user can add other users, click on the button creates a dialog to confirm. */
@Test
public void testCallOnClick_showAddUserDialog() {
- doReturn(true).when(mCarUserManagerHelper).canCurrentProcessAddUsers();
+ getShadowUserManager().setUserRestriction(
+ Process.myUserHandle(), UserManager.DISALLOW_ADD_USER, false);
createUsersListFragment();
mActionButton.callOnClick();
@@ -138,4 +143,8 @@
private boolean isDialogShown(String tag) {
return mTestActivity.getSupportFragmentManager().findFragmentByTag(tag) != null;
}
+
+ private ShadowUserManager getShadowUserManager() {
+ return Shadow.extract(mContext.getSystemService(UserManager.class));
+ }
}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java b/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
index 69f2252..6986c51 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
@@ -30,6 +30,7 @@
import androidx.preference.Preference;
import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
import org.junit.Before;
import org.junit.Test;
@@ -38,11 +39,13 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
import java.util.Arrays;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUserIconProvider.class})
public class UsersPreferenceProviderTest {
private static final String TEST_CURRENT_USER_NAME = "Current User";