Remove usage of CarUserManagerHelper#createNewNonAdminUser

Bug: 157990691
Test: manual, make -j50 RunCarSettingsRoboTests
ROBOTEST_FILTER=com.android.car.settings.users

Change-Id: I4ec2647e78d3488f62a859420a2a0fbe439e0b84
diff --git a/src/com/android/car/settings/users/AddNewUserTask.java b/src/com/android/car/settings/users/AddNewUserTask.java
index a109a2d..82ded0c 100644
--- a/src/com/android/car/settings/users/AddNewUserTask.java
+++ b/src/com/android/car/settings/users/AddNewUserTask.java
@@ -17,30 +17,58 @@
 package com.android.car.settings.users;
 
 import android.car.user.CarUserManager;
-import android.car.userlib.CarUserManagerHelper;
+import android.car.user.UserCreationResult;
+import android.car.userlib.UserHelper;
+import android.content.Context;
 import android.content.pm.UserInfo;
 import android.os.AsyncTask;
 
+import com.android.car.settings.common.Logger;
+import com.android.internal.infra.AndroidFuture;
+
+import java.util.concurrent.ExecutionException;
+
 /**
  * Task to add a new user to the device
  */
 public class AddNewUserTask extends AsyncTask<String, Void, UserInfo> {
+    private static final Logger LOG = new Logger(AddNewUserTask.class);
+
+    private final Context mContext;
     private final CarUserManager mCarUserManager;
-    private final CarUserManagerHelper mCarUserManagerHelper;
     private final AddNewUserListener mAddNewUserListener;
 
-    // TODO: Completely deprecate the usage of CarUserManagerHelper once all of its functionalities
-    // can be handled by CarUserManager's interfaces.
-    public AddNewUserTask(CarUserManagerHelper carUserManagerHelper, CarUserManager carUserManager,
+    public AddNewUserTask(Context context, CarUserManager carUserManager,
             AddNewUserListener addNewUserListener) {
+        mContext = context;
         mCarUserManager = carUserManager;
-        mCarUserManagerHelper = carUserManagerHelper;
         mAddNewUserListener = addNewUserListener;
     }
 
     @Override
     protected UserInfo doInBackground(String... userNames) {
-        return mCarUserManagerHelper.createNewNonAdminUser(userNames[0]);
+        AndroidFuture<UserCreationResult> future = mCarUserManager.createUser(userNames[0],
+                /* flags= */ 0);
+        try {
+            UserCreationResult result = future.get();
+            if (result.isSuccess()) {
+                UserInfo user = result.getUser();
+                if (user != null) {
+                    UserHelper.setDefaultNonAdminRestrictions(mContext, user, /* enable= */ true);
+                    UserHelper.assignDefaultIcon(mContext, user);
+                } else {
+                    LOG.wtf("Inconsistent state: successful future with null user - "
+                            + result.toString());
+                }
+                return user;
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            if (e instanceof InterruptedException) {
+                Thread.currentThread().interrupt();
+            }
+            LOG.e("Error creating new user: ", e);
+        }
+        return null;
     }
 
     @Override
diff --git a/src/com/android/car/settings/users/UserGridRecyclerView.java b/src/com/android/car/settings/users/UserGridRecyclerView.java
index e05147f..dbc6a3e 100644
--- a/src/com/android/car/settings/users/UserGridRecyclerView.java
+++ b/src/com/android/car/settings/users/UserGridRecyclerView.java
@@ -24,7 +24,6 @@
 import android.app.ActivityManager;
 import android.car.Car;
 import android.car.user.CarUserManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -72,7 +71,6 @@
             "com.android.car.settings.users.ConfirmCreateNewUserDialog";
 
     private UserAdapter mAdapter;
-    private CarUserManagerHelper mCarUserManagerHelper;
     private UserManager mUserManager;
     private Context mContext;
     private BaseFragment mBaseFragment;
@@ -92,7 +90,6 @@
     public UserGridRecyclerView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
         mUserManager = UserManager.get(mContext);
         mUserIconProvider = new UserIconProvider();
         mEnableAddUserButton = true;
@@ -257,10 +254,10 @@
     public final class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserAdapterViewHolder>
             implements AddNewUserTask.AddNewUserListener {
 
-        private final Context mContext;
         private final Resources mRes;
         private final String mGuestName;
 
+        private Context mContext;
         private List<UserRecord> mUsers;
         private String mNewUserName;
         // View that holds the add user button.  Used to enable/disable the view
@@ -270,7 +267,7 @@
         private boolean mIsAddUserRestricted;
 
         private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
-            mAddNewUserTask = new AddNewUserTask(mCarUserManagerHelper,
+            mAddNewUserTask = new AddNewUserTask(mContext,
                     mCarUserManager, /* addNewUserListener= */this);
             mAddNewUserTask.execute(mNewUserName);
         };
diff --git a/src/com/android/car/settings/users/UsersListFragment.java b/src/com/android/car/settings/users/UsersListFragment.java
index 2132db2..d7f067f 100644
--- a/src/com/android/car/settings/users/UsersListFragment.java
+++ b/src/com/android/car/settings/users/UsersListFragment.java
@@ -19,7 +19,6 @@
 import android.car.Car;
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.user.CarUserManager;
-import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.Intent;
 import android.os.AsyncTask;
@@ -62,7 +61,6 @@
 
     private Car mCar;
     private CarUserManager mCarUserManager;
-    private CarUserManagerHelper mCarUserManagerHelper;
     private UserManager mUserManager;
 
     private ProgressBarController mProgressBar;
@@ -74,7 +72,7 @@
 
     @VisibleForTesting
     final ConfirmationDialogFragment.ConfirmListener mConfirmCreateNewUserListener = arguments -> {
-        mAddNewUserTask = new AddNewUserTask(mCarUserManagerHelper,
+        mAddNewUserTask = new AddNewUserTask(getContext(),
                 mCarUserManager, /* addNewUserListener= */ this).execute(
                 getContext().getString(R.string.user_new_user_name));
         mIsBusy = true;
@@ -112,7 +110,6 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         mCar = Car.createCar(context);
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
         mCarUserManager = (CarUserManager) mCar.getCarManager(Car.CAR_USER_SERVICE);
         mUserManager = UserManager.get(getContext());
     }
@@ -186,6 +183,11 @@
         ErrorDialog.show(this, R.string.add_user_error_title);
     }
 
+    @VisibleForTesting
+    void setCarUserManager(CarUserManager carUserManager) {
+        mCarUserManager = carUserManager;
+    }
+
     private void updateUi() {
         mAddUserButton.setEnabled(!mIsBusy);
         mProgressBar.setVisible(mIsBusy);
diff --git a/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java b/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
index 4e66ab5..47981a3 100644
--- a/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
@@ -16,12 +16,22 @@
 
 package com.android.car.settings.users;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.car.user.CarUserManager;
-import android.car.userlib.CarUserManagerHelper;
+import android.car.user.UserCreationResult;
+import android.content.Context;
 import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.os.UserManager;
+
+import androidx.annotation.Nullable;
+import androidx.test.InstrumentationRegistry;
+
+import com.android.internal.infra.AndroidFuture;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -34,34 +44,43 @@
 @RunWith(RobolectricTestRunner.class)
 public class AddNewUserTaskTest {
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserManager mUserManager;
     @Mock
     private CarUserManager mCarUserManager;
     @Mock
     private AddNewUserTask.AddNewUserListener mAddNewUserListener;
+    @Mock
+    private Context mContext;
 
     private AddNewUserTask mTask;
 
+    private final Resources mResources = InstrumentationRegistry.getTargetContext().getResources();
+
     @Before
     public void createAsyncTask() {
         MockitoAnnotations.initMocks(this);
-        mTask = new AddNewUserTask(mCarUserManagerHelper, mCarUserManager, mAddNewUserListener);
+        mTask = new AddNewUserTask(mContext, mCarUserManager, mAddNewUserListener);
     }
 
     @Test
-    public void testTaskCallsCreateNewNonAdminUser() {
+    public void testTaskCallsCreateNewUser() {
         String newUserName = "Test name";
+        UserInfo newUser = new UserInfo(10, newUserName, /* flags= */ 0);
+
+        mockCreateUser(newUser, UserCreationResult.STATUS_SUCCESSFUL);
+
         mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
 
-        verify(mCarUserManagerHelper).createNewNonAdminUser(newUserName);
+        verify(mCarUserManager).createUser(newUserName, /* flags= */ 0);
     }
 
     @Test
     public void testSwitchToNewUserIfUserCreated() {
         String newUserName = "Test name";
         UserInfo newUser = new UserInfo(10, newUserName, /* flags= */ 0);
-        when(mCarUserManagerHelper.createNewNonAdminUser(newUserName)).thenReturn(newUser);
+
+        mockCreateUser(newUser, UserCreationResult.STATUS_SUCCESSFUL);
 
         mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
@@ -73,7 +92,8 @@
     public void testOnUserAddedSuccessCalledIfUserCreated() {
         String newUserName = "Test name";
         UserInfo newUser = new UserInfo(10, newUserName, /* flags= */ 0);
-        when(mCarUserManagerHelper.createNewNonAdminUser(newUserName)).thenReturn(newUser);
+
+        mockCreateUser(newUser, UserCreationResult.STATUS_SUCCESSFUL);
 
         mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
@@ -84,11 +104,22 @@
     @Test
     public void testOnUserAddedFailureCalledIfNullReturned() {
         String newUserName = "Test name";
-        when(mCarUserManagerHelper.createNewNonAdminUser(newUserName)).thenReturn(null);
+
+        mockCreateUser(/* user= */ null, UserCreationResult.STATUS_ANDROID_FAILURE);
 
         mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
 
         verify(mAddNewUserListener).onUserAddedFailure();
     }
+
+    private void mockCreateUser(@Nullable UserInfo user, int status) {
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mContext.getResources()).thenReturn(mResources);
+
+        AndroidFuture<UserCreationResult> future = new AndroidFuture<>();
+        future.complete(new UserCreationResult(status,
+                user, /* errorMessage= */ null));
+        when(mCarUserManager.createUser(anyString(), anyInt())).thenReturn(future);
+    }
 }
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 69e9f4e..365c57a 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
@@ -20,12 +20,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.anyString;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.userlib.CarUserManagerHelper;
+import android.car.user.CarUserManager;
+import android.car.user.UserCreationResult;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
@@ -33,7 +35,6 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.FragmentController;
-import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
 import com.android.car.settings.testutils.ShadowUserManager;
@@ -41,6 +42,7 @@
 import com.android.car.ui.toolbar.MenuItem;
 import com.android.car.ui.toolbar.ToolbarController;
 import com.android.car.ui.utils.CarUxRestrictionsUtil;
+import com.android.internal.infra.AndroidFuture;
 
 import org.junit.After;
 import org.junit.Before;
@@ -48,7 +50,6 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
@@ -60,8 +61,7 @@
  * Tests for UserDetailsFragment.
  */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class,
-        ShadowUserHelper.class, ShadowUserManager.class})
+@Config(shadows = {ShadowUserIconProvider.class, ShadowUserHelper.class, ShadowUserManager.class})
 public class UsersListFragmentTest {
 
     private Context mContext;
@@ -70,7 +70,7 @@
     private FragmentController<UsersListFragment> mFragmentController;
 
     @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
+    private CarUserManager mCarUserManager;
 
     @Mock
     private UserHelper mUserHelper;
@@ -78,7 +78,6 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         ShadowUserHelper.setInstance(mUserHelper);
         mContext = RuntimeEnvironment.application;
 
@@ -92,7 +91,6 @@
     @After
     public void tearDown() {
         ShadowUserHelper.reset();
-        ShadowCarUserManagerHelper.reset();
         ShadowUserManager.reset();
     }
 
@@ -123,12 +121,18 @@
 
     /* Test that onCreateNewUserConfirmed invokes a creation of a new non-admin. */
     @Test
-    public void testOnCreateNewUserConfirmedInvokesCreateNewNonAdminUser() {
+    public void testOnCreateNewUserConfirmedInvokesCreateNewUser() {
         createUsersListFragment(/* flags= */ 0, /* disallowAddUser= */ false);
+        mFragment.setCarUserManager(mCarUserManager);
+
+        AndroidFuture<UserCreationResult> future = new AndroidFuture<>();
+        future.complete(new UserCreationResult(UserCreationResult.STATUS_SUCCESSFUL,
+                /* user= */ null, /* errorMessage= */ null));
+        when(mCarUserManager.createUser(anyString(), anyInt())).thenReturn(future);
+
         mFragment.mConfirmCreateNewUserListener.onConfirm(/* arguments= */ null);
-        Robolectric.flushBackgroundThreadScheduler();
-        verify(mCarUserManagerHelper)
-                .createNewNonAdminUser(mContext.getString(R.string.user_new_user_name));
+        verify(mCarUserManager).createUser(mContext.getString(R.string.user_new_user_name),
+                /* flags= */ 0);
     }
 
     /* Test that if we're in demo user, click on the button starts exit out of the retail mode. */
@@ -164,7 +168,6 @@
                 testUser.getUserHandle(), UserManager.DISALLOW_ADD_USER, disallowAddUser);
         when(mUserHelper.getCurrentProcessUserInfo()).thenReturn(testUser);
         when(mUserHelper.getAllSwitchableUsers()).thenReturn(new ArrayList<>());
-        when(mCarUserManagerHelper.createNewNonAdminUser(any())).thenReturn(null);
         mFragmentController.setup();
 
         ToolbarController toolbar = (ToolbarController) requireToolbar(mFragment.requireActivity());