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