Make CarUserService dependent on CarUserManagerHelper (temporarily)
- While CarUserManagerHelper is being deprecated, CarUserService
continues to depend on CarUserManagerHelper.
- The changes made for the deprecation should be applied consistently,
and it is easier to track the changes in one place.
- At the end of the deprecation process, we will decide where to put
CarUserManagerHelper's APIs that are required by CarUserService.
- Two methods in CarUserManagerHelper are changed to public.
Bug: 141887102
Test: Run CarUserServiceTest.
Change-Id: I69d074015cd6bf0ef54217f2bac4799b79501d5e
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index e168af3..0d1221d 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -131,7 +131,7 @@
final Resources res = mContext.getResources();
final int maxRunningUsers = res.getInteger(
com.android.internal.R.integer.config_multiuserMaxRunningUsers);
- mCarUserService = new CarUserService(serviceContext, userManager,
+ mCarUserService = new CarUserService(serviceContext, mUserManagerHelper, userManager,
ActivityManager.getService(), maxRunningUsers);
mCarOccupantZoneService = new CarOccupantZoneService(serviceContext);
mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
diff --git a/service/src/com/android/car/user/CarUserService.java b/service/src/com/android/car/user/CarUserService.java
index 8436fe7..04fd9c8 100644
--- a/service/src/com/android/car/user/CarUserService.java
+++ b/service/src/com/android/car/user/CarUserService.java
@@ -25,12 +25,11 @@
import android.app.IActivityManager;
import android.car.ICarUserService;
import android.car.settings.CarSettings;
+import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
-import android.graphics.Bitmap;
import android.location.LocationManager;
import android.os.Binder;
-import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
@@ -41,7 +40,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
-import com.android.internal.util.UserIcons;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -61,40 +59,11 @@
*/
public final class CarUserService extends ICarUserService.Stub implements CarServiceBase {
private final Context mContext;
+ private final CarUserManagerHelper mCarUserManagerHelper;
private final IActivityManager mAm;
private final UserManager mUserManager;
private final int mMaxRunningUsers;
- /**
- * Default restrictions for Non-Admin users.
- */
- private static final String[] DEFAULT_NON_ADMIN_RESTRICTIONS = new String[] {
- UserManager.DISALLOW_FACTORY_RESET
- };
-
- /**
- * Default restrictions for Guest users.
- */
- private static final String[] DEFAULT_GUEST_RESTRICTIONS = new String[] {
- UserManager.DISALLOW_FACTORY_RESET,
- UserManager.DISALLOW_REMOVE_USER,
- UserManager.DISALLOW_MODIFY_ACCOUNTS,
- UserManager.DISALLOW_INSTALL_APPS,
- UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
- UserManager.DISALLOW_UNINSTALL_APPS
- };
-
- /**
- * List of restrictions relaxed for Non-Admin users.
- *
- * <p>Each non-admin has sms and outgoing call restrictions applied by the UserManager on
- * creation. We want to enable these permissions by default in the car.
- */
- private static final String[] RELAXED_RESTRICTIONS_FOR_NON_ADMIN = new String[] {
- UserManager.DISALLOW_SMS,
- UserManager.DISALLOW_OUTGOING_CALLS
- };
-
private final Object mLock = new Object();
@GuardedBy("mLock")
private boolean mUser0Unlocked;
@@ -122,12 +91,14 @@
void onSwitchUser(@UserIdInt int userId);
}
- public CarUserService(@NonNull Context context, @NonNull UserManager userManager,
- @NonNull IActivityManager am, int maxRunningUsers) {
+ public CarUserService(
+ @NonNull Context context, @NonNull CarUserManagerHelper carUserManagerHelper,
+ @NonNull UserManager userManager, @NonNull IActivityManager am, int maxRunningUsers) {
if (Log.isLoggable(TAG_USER, Log.DEBUG)) {
Log.d(TAG_USER, "constructed");
}
mContext = context;
+ mCarUserManagerHelper = carUserManagerHelper;
mAm = am;
mMaxRunningUsers = maxRunningUsers;
mUserManager = userManager;
@@ -170,7 +141,7 @@
if (admin) {
return createNewAdminUser(name);
}
- return createNewNonAdminUser(name);
+ return mCarUserManagerHelper.createNewNonAdminUser(name);
}
/**
@@ -198,8 +169,8 @@
return null;
}
// Passenger user should be a non-admin user.
- setDefaultNonAdminRestrictions(user, /* enable= */ true);
- assignDefaultIcon(user);
+ mCarUserManagerHelper.setDefaultNonAdminRestrictions(user, /* enable= */ true);
+ mCarUserManagerHelper.assignDefaultIcon(user);
return user;
}
@@ -219,7 +190,7 @@
Log.w(TAG_USER, "current process is not allowed to switch user");
return false;
}
- if (driverId == getCurrentUserId()) {
+ if (driverId == mCarUserManagerHelper.getCurrentForegroundUserId()) {
// The current user is already the given user.
return true;
}
@@ -247,7 +218,6 @@
/**
* @see CarUserManager.getPassengers
- * @return
*/
@Override
@NonNull
@@ -284,11 +254,6 @@
return userId == UserHandle.USER_SYSTEM;
}
- /** Returns whether the user running the current process has a restriction. */
- private boolean isCurrentProcessUserHasRestriction(String restriction) {
- return mUserManager.hasUserRestriction(restriction);
- }
-
private void updateDefaultUserRestriction() {
// We want to set restrictions on system and guest users only once. These are persisted
// onto disk, so it's sufficient to do it once + we minimize the number of disk writes.
@@ -300,24 +265,11 @@
if (UserManager.isHeadlessSystemUserMode()) {
setSystemUserRestrictions();
}
- initDefaultGuestRestrictions();
+ mCarUserManagerHelper.initDefaultGuestRestrictions();
Settings.Global.putInt(mContext.getContentResolver(),
CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, 1);
}
- /**
- * Sets default guest restrictions that will be applied every time a Guest user is created.
- *
- * <p> Restrictions are written to disk and persistent across boots.
- */
- private void initDefaultGuestRestrictions() {
- Bundle defaultGuestRestrictions = new Bundle();
- for (String restriction : DEFAULT_GUEST_RESTRICTIONS) {
- defaultGuestRestrictions.putBoolean(restriction, true);
- }
- mUserManager.setDefaultGuestRestrictions(defaultGuestRestrictions);
- }
-
private boolean isPersistentUser(@UserIdInt int userId) {
return !mUserManager.getUserInfo(userId).isEphemeral();
}
@@ -360,7 +312,7 @@
Integer user = userId;
if (isPersistentUser(userId)) {
// current foreground user should stay in top priority.
- if (userId == getCurrentUserId()) {
+ if (userId == mCarUserManagerHelper.getCurrentForegroundUserId()) {
mBackgroundUsersToRestart.remove(user);
mBackgroundUsersToRestart.add(0, user);
}
@@ -399,7 +351,7 @@
}
ArrayList<Integer> startedUsers = new ArrayList<>();
for (Integer user : users) {
- if (user == getCurrentUserId()) {
+ if (user == mCarUserManagerHelper.getCurrentForegroundUserId()) {
continue;
}
try {
@@ -444,7 +396,7 @@
if (userId == UserHandle.USER_SYSTEM) {
return false;
}
- if (userId == getCurrentUserId()) {
+ if (userId == mCarUserManagerHelper.getCurrentForegroundUserId()) {
Log.i(TAG_USER, "stopBackgroundUser, already a FG user:" + userId);
return false;
}
@@ -475,7 +427,7 @@
*/
public void onSwitchUser(@UserIdInt int userId) {
if (!isSystemUser(userId) && isPersistentUser(userId)) {
- setLastActiveUser(userId);
+ mCarUserManagerHelper.setLastActiveUser(userId);
}
for (UserCallback callback : mUserCallbacks) {
callback.onSwitchUser(userId);
@@ -529,7 +481,7 @@
* Creates a new user on the system, the created user would be granted admin role.
*
* @param name Name to be given to the newly created user.
- * @return Newly created admin user, {@code null} if it fails to create a user.
+ * @return newly created admin user, {@code null} if it fails to create a user.
*/
@Nullable
private UserInfo createNewAdminUser(String name) {
@@ -545,79 +497,11 @@
Log.w(TAG_USER, "can't create admin user.");
return null;
}
- assignDefaultIcon(user);
+ mCarUserManagerHelper.assignDefaultIcon(user);
return user;
}
- /**
- * Creates a new non-admin user on the system.
- *
- * @param name Name to be given to the newly created user.
- * @return Newly created non-admin user, {@code null} if failed to create a user.
- */
- @Nullable
- private UserInfo createNewNonAdminUser(String name) {
- UserInfo user = mUserManager.createUser(name, /* flags= */ 0);
- if (user == null) {
- // Couldn't create user, most likely because there are too many.
- Log.w(TAG_USER, "can't create non-admin user.");
- return null;
- }
- setDefaultNonAdminRestrictions(user, /* enable= */ true);
-
- // Remove restrictions which are allowed for non-admin car users.
- for (String restriction : RELAXED_RESTRICTIONS_FOR_NON_ADMIN) {
- mUserManager.setUserRestriction(restriction, /* enable= */ false, user.getUserHandle());
- }
-
- assignDefaultIcon(user);
- return user;
- }
-
- private Bitmap getUserDefaultIcon(UserInfo userInfo) {
- return UserIcons.convertToBitmap(
- UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false));
- }
-
- private Bitmap getGuestDefaultIcon() {
- return UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(mContext.getResources(),
- UserHandle.USER_NULL, false));
- }
-
- /** Assigns a default icon to a user according to the user's id. */
- private void assignDefaultIcon(UserInfo userInfo) {
- Bitmap bitmap = userInfo.isGuest()
- ? getGuestDefaultIcon() : getUserDefaultIcon(userInfo);
- mUserManager.setUserIcon(userInfo.id, bitmap);
- }
-
- private void setDefaultNonAdminRestrictions(UserInfo userInfo, boolean enable) {
- for (String restriction : DEFAULT_NON_ADMIN_RESTRICTIONS) {
- mUserManager.setUserRestriction(restriction, enable, userInfo.getUserHandle());
- }
- }
-
- /** Gets the current user on the device. */
- @VisibleForTesting
- @UserIdInt
- int getCurrentUserId() {
- UserInfo user = getCurrentUser();
- return user != null ? user.id : UserHandle.USER_NULL;
- }
-
- @Nullable
- private UserInfo getCurrentUser() {
- UserInfo user = null;
- try {
- user = mAm.getCurrentUser();
- } catch (RemoteException e) {
- // ignore
- Log.w(TAG_USER, "error while getting current user", e);
- }
- return user;
- }
-
private interface UserFilter {
boolean isEligibleUser(UserInfo user);
}
@@ -636,17 +520,6 @@
}
/**
- * Sets last active user.
- *
- * @param userId Last active user id.
- */
- @VisibleForTesting
- void setLastActiveUser(@UserIdInt int userId) {
- Settings.Global.putInt(
- mContext.getContentResolver(), Settings.Global.LAST_ACTIVE_USER_ID, userId);
- }
-
- /**
* Enforces that apps which have the
* {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS}
* can make certain calls to the CarUserManager.
diff --git a/tests/carservice_unit_test/src/com/android/car/pm/VendorServiceControllerTest.java b/tests/carservice_unit_test/src/com/android/car/pm/VendorServiceControllerTest.java
index 904b2c7..34581c0 100644
--- a/tests/carservice_unit_test/src/com/android/car/pm/VendorServiceControllerTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/pm/VendorServiceControllerTest.java
@@ -90,7 +90,7 @@
public void setUp() {
mContext = new ServiceLauncherContext(ApplicationProvider.getApplicationContext());
mUserManagerHelper = Mockito.spy(new CarUserManagerHelper(mContext));
- mCarUserService = new CarUserService(mContext, mUserManager,
+ mCarUserService = new CarUserService(mContext, mUserManagerHelper, mUserManager,
ActivityManager.getService(), 2 /* max running users */);
CarLocalServices.addService(CarUserService.class, mCarUserService);
diff --git a/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java b/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
index c2fe86d..da9f7c9 100644
--- a/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
@@ -34,6 +34,7 @@
import android.app.ActivityManager;
import android.app.IActivityManager;
import android.car.settings.CarSettings;
+import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
import android.content.res.Resources;
@@ -85,6 +86,7 @@
@Mock private Context mMockContext;
@Mock private Context mApplicationContext;
@Mock private LocationManager mLocationManager;
+ @Mock private CarUserManagerHelper mMockedCarUserManagerHelper;
@Mock private IActivityManager mMockedIActivityManager;
@Mock private UserManager mMockedUserManager;
@Mock private Resources mMockedResources;
@@ -112,6 +114,7 @@
mCarUserService =
new CarUserService(
mMockContext,
+ mMockedCarUserManagerHelper,
mMockedUserManager,
mMockedIActivityManager,
3);
@@ -172,10 +175,7 @@
mCarUserService.onSwitchUser(lastActiveUserId);
- int writtenId = Settings.Global.getInt(
- InstrumentationRegistry.getTargetContext().getContentResolver(),
- Settings.Global.LAST_ACTIVE_USER_ID, 0);
- assertEquals(lastActiveUserId, writtenId);
+ verify(mMockedCarUserManagerHelper).setLastActiveUser(lastActiveUserId);
}
/**
@@ -242,7 +242,7 @@
doReturn(user4GuestInfo).when(mMockedUserManager).getUserInfo(user4Guest);
doReturn(user5Info).when(mMockedUserManager).getUserInfo(user5);
- doReturn(user1Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user1).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(UserHandle.USER_SYSTEM, true);
// user 0 should never go to that list.
assertTrue(mCarUserService.getBackgroundUsersToRestart().isEmpty());
@@ -257,19 +257,19 @@
assertEquals(new Integer[]{user1},
mCarUserService.getBackgroundUsersToRestart().toArray());
- doReturn(user3Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user3).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(user3, true);
mCarUserService.setUserLockStatus(user2, false);
assertEquals(new Integer[]{user3, user1},
mCarUserService.getBackgroundUsersToRestart().toArray());
- doReturn(user4GuestInfo).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user4Guest).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(user4Guest, true);
mCarUserService.setUserLockStatus(user3, false);
assertEquals(new Integer[]{user3, user1},
mCarUserService.getBackgroundUsersToRestart().toArray());
- doReturn(user5Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user5).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(user5, true);
mCarUserService.setUserLockStatus(user4Guest, false);
assertEquals(new Integer[]{user5, user3},
@@ -293,13 +293,13 @@
doReturn(user2Info).when(mMockedUserManager).getUserInfo(user2);
doReturn(user3Info).when(mMockedUserManager).getUserInfo(user3);
- doReturn(user1Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user1).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(UserHandle.USER_SYSTEM, true);
mCarUserService.setUserLockStatus(user1, true);
- doReturn(user2Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user2).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(user2, true);
mCarUserService.setUserLockStatus(user1, false);
- doReturn(user3Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user3).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
mCarUserService.setUserLockStatus(user3, true);
mCarUserService.setUserLockStatus(user2, false);
@@ -336,7 +336,7 @@
public void testStopBackgroundUserForFgUser() throws RemoteException {
int user1 = 101;
UserInfo user1Info = new UserInfo(user1, "user1", NO_USER_INFO_FLAGS);
- doReturn(user1Info).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(user1).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
assertFalse(mCarUserService.stopBackgroundUser(UserHandle.USER_SYSTEM));
}
@@ -359,7 +359,7 @@
public void testCreateNonAdminDriver() {
String userName = "testUser";
UserInfo userInfo = new UserInfo();
- doReturn(userInfo).when(mMockedUserManager).createUser(userName, NO_USER_INFO_FLAGS);
+ doReturn(userInfo).when(mMockedCarUserManagerHelper).createNewNonAdminUser(userName);
assertEquals(userInfo, mCarUserService.createDriver(userName, false));
}
@@ -408,7 +408,7 @@
int currentId = 11;
int targetId = 12;
UserInfo userInfo = new UserInfo(currentId, "test11", NO_USER_INFO_FLAGS);
- doReturn(userInfo).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(currentId).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
doReturn(true).when(mMockedIActivityManager).switchUser(targetId);
doReturn(false).when(mMockedUserManager)
.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
@@ -420,7 +420,7 @@
int currentId = 11;
int targetId = 12;
UserInfo userInfo = new UserInfo(currentId, "test11", NO_USER_INFO_FLAGS);
- doReturn(userInfo).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(currentId).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
doReturn(true).when(mMockedIActivityManager).switchUser(targetId);
doReturn(UserManager.SWITCHABILITY_STATUS_USER_SWITCH_DISALLOWED).when(mMockedUserManager)
.getUserSwitchability();
@@ -430,7 +430,7 @@
@Test
public void testSwitchDriver_IfSwitchedToCurrentUser() throws RemoteException {
UserInfo userInfo = new UserInfo(11, "test11", NO_USER_INFO_FLAGS);
- doReturn(userInfo).when(mMockedIActivityManager).getCurrentUser();
+ doReturn(userInfo.id).when(mMockedCarUserManagerHelper).getCurrentForegroundUserId();
doReturn(false).when(mMockedUserManager)
.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
assertTrue(mCarUserService.switchDriver(11));
diff --git a/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java b/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
index a008222..0b9d873 100644
--- a/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
+++ b/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
@@ -579,7 +579,7 @@
* @param userInfo User to set restrictions on.
* @param enable If true, restriction is ON, If false, restriction is OFF.
*/
- private void setDefaultNonAdminRestrictions(UserInfo userInfo, boolean enable) {
+ public void setDefaultNonAdminRestrictions(UserInfo userInfo, boolean enable) {
for (String restriction : DEFAULT_NON_ADMIN_RESTRICTIONS) {
mUserManager.setUserRestriction(restriction, enable, userInfo.getUserHandle());
}
@@ -774,8 +774,13 @@
return picture;
}
- // Assigns a default icon to a user according to the user's id.
- private Bitmap assignDefaultIcon(UserInfo userInfo) {
+ /**
+ * Assigns a default icon to a user according to the user's id.
+ *
+ * @param userInfo User whose avatar is set to default icon.
+ * @return Bitmap of the user icon.
+ */
+ public Bitmap assignDefaultIcon(UserInfo userInfo) {
Bitmap bitmap = userInfo.isGuest()
? getGuestDefaultIcon() : getUserDefaultIcon(userInfo);
mUserManager.setUserIcon(userInfo.id, bitmap);