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);