Update user creation dialog to happen in a single dialog

Bug: 279566609
Test: atest UserInteractorTest
Change-Id: I8592a8f3c6b4350e3ed1f389447ebc8511ca90cb
This commit is contained in:
Tetiana Meronyk
2023-05-02 17:48:27 +00:00
parent 709264ad6a
commit 39492a907f
4 changed files with 32 additions and 85 deletions

View File

@@ -32,11 +32,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.users.EditUserInfoController;
import com.android.settingslib.users.GrantAdminDialogController;
import com.android.settingslib.users.CreateUserDialogController;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.user.utils.MultiUserActionsEvent;
import javax.inject.Inject;
@@ -61,20 +59,18 @@ public class CreateUserActivity extends Activity {
private static final String EXTRA_IS_KEYGUARD_SHOWING = "extra_is_keyguard_showing";
private final UserCreator mUserCreator;
private final EditUserInfoController mEditUserInfoController;
private CreateUserDialogController mCreateUserDialogController;
private final IActivityManager mActivityManager;
private final ActivityStarter mActivityStarter;
private final UiEventLogger mUiEventLogger;
private Dialog mGrantAdminDialog;
private Dialog mSetupUserDialog;
private final OnBackInvokedCallback mBackCallback = this::onBackInvoked;
private boolean mGrantAdminRights;
@Inject
public CreateUserActivity(UserCreator userCreator,
EditUserInfoController editUserInfoController, IActivityManager activityManager,
CreateUserDialogController createUserDialogController, IActivityManager activityManager,
ActivityStarter activityStarter, UiEventLogger uiEventLogger) {
mUserCreator = userCreator;
mEditUserInfoController = editUserInfoController;
mCreateUserDialogController = createUserDialogController;
mActivityManager = activityManager;
mActivityStarter = activityStarter;
mUiEventLogger = uiEventLogger;
@@ -86,19 +82,10 @@ public class CreateUserActivity extends Activity {
setShowWhenLocked(true);
setContentView(R.layout.activity_create_new_user);
if (savedInstanceState != null) {
mEditUserInfoController.onRestoreInstanceState(savedInstanceState);
}
boolean isKeyguardShowing = getIntent().getBooleanExtra(EXTRA_IS_KEYGUARD_SHOWING, true);
// Display grant admin dialog only on unlocked device to admin users if multiple admins
// are allowed on this device.
if (mUserCreator.isMultipleAdminEnabled() && mUserCreator.isUserAdmin()
&& !isKeyguardShowing) {
mGrantAdminDialog = buildGrantAdminDialog();
mGrantAdminDialog.show();
} else {
mSetupUserDialog = createDialog();
mSetupUserDialog.show();
mCreateUserDialogController.onRestoreInstanceState(savedInstanceState);
}
mSetupUserDialog = createDialog();
mSetupUserDialog.show();
getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
OnBackInvokedDispatcher.PRIORITY_DEFAULT,
mBackCallback);
@@ -110,7 +97,7 @@ public class CreateUserActivity extends Activity {
outState.putBundle(DIALOG_STATE_KEY, mSetupUserDialog.onSaveInstanceState());
}
mEditUserInfoController.onSaveInstanceState(outState);
mCreateUserDialogController.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@@ -125,48 +112,21 @@ public class CreateUserActivity extends Activity {
private Dialog createDialog() {
String defaultUserName = getString(com.android.settingslib.R.string.user_new_user_name);
return mEditUserInfoController.createDialog(
boolean isKeyguardShowing = getIntent().getBooleanExtra(EXTRA_IS_KEYGUARD_SHOWING, true);
return mCreateUserDialogController.createDialog(
this,
this::startActivity,
null,
defaultUserName,
getString(com.android.settingslib.R.string.user_add_user),
(mUserCreator.isMultipleAdminEnabled() && mUserCreator.isUserAdmin()
&& !isKeyguardShowing),
this::addUserNow,
this::finish
);
}
/**
* Returns dialog that allows to grant user admin rights.
*/
private Dialog buildGrantAdminDialog() {
return new GrantAdminDialogController().createDialog(
this,
(grantAdminRights) -> {
mGrantAdminDialog.dismiss();
mGrantAdminRights = grantAdminRights;
if (mGrantAdminRights) {
mUiEventLogger.log(MultiUserActionsEvent
.GRANT_ADMIN_FROM_USER_SWITCHER_CREATION_DIALOG);
} else {
mUiEventLogger.log(MultiUserActionsEvent
.NOT_GRANT_ADMIN_FROM_USER_SWITCHER_CREATION_DIALOG);
}
mSetupUserDialog = createDialog();
mSetupUserDialog.show();
},
() -> {
mGrantAdminRights = false;
finish();
}
);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mEditUserInfoController.onActivityResult(requestCode, resultCode, data);
mCreateUserDialogController.onActivityResult(requestCode, resultCode, data);
}
@Override
@@ -178,9 +138,6 @@ public class CreateUserActivity extends Activity {
if (mSetupUserDialog != null) {
mSetupUserDialog.dismiss();
}
if (mGrantAdminDialog != null) {
mGrantAdminDialog.dismiss();
}
finish();
}
@@ -190,7 +147,7 @@ public class CreateUserActivity extends Activity {
super.onDestroy();
}
private void addUserNow(String userName, Drawable userIcon) {
private void addUserNow(String userName, Drawable userIcon, Boolean isAdmin) {
mSetupUserDialog.dismiss();
userName = (userName == null || userName.trim().isEmpty())
? getString(com.android.settingslib.R.string.user_new_user_name)
@@ -198,7 +155,7 @@ public class CreateUserActivity extends Activity {
mUserCreator.createUser(userName, userIcon,
userInfo -> {
if (mGrantAdminRights) {
if (isAdmin) {
mUserCreator.setUserAdmin(userInfo.id);
}
switchToUser(userInfo.id);
@@ -230,7 +187,7 @@ public class CreateUserActivity extends Activity {
*/
private void startActivity(Intent intent, int requestCode) {
mActivityStarter.dismissKeyguardThenExecute(() -> {
mEditUserInfoController.startingActivityForResult();
mCreateUserDialogController.startingActivityForResult();
startActivityForResult(intent, requestCode);
return true;
}, /* cancel= */ null, /* afterKeyguardGone= */ true);

View File

@@ -49,6 +49,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.user.UserSwitchDialogController
import com.android.systemui.telephony.domain.interactor.TelephonyInteractor
import com.android.systemui.user.CreateUserActivity
import com.android.systemui.user.data.model.UserSwitcherSettingsModel
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.user.data.source.UserRecord
@@ -454,13 +455,16 @@ constructor(
UserActionModel.ADD_USER -> {
uiEventLogger.log(MultiUserActionsEvent.CREATE_USER_FROM_USER_SWITCHER)
val currentUser = repository.getSelectedUserInfo()
showDialog(
ShowDialogRequestModel.ShowAddUserDialog(
userHandle = currentUser.userHandle,
isKeyguardShowing = keyguardInteractor.isKeyguardShowing(),
showEphemeralMessage = currentUser.isGuest && currentUser.isEphemeral,
dialogShower = dialogShower,
)
dismissDialog()
activityStarter.startActivity(
CreateUserActivity.createIntentForStart(
applicationContext,
keyguardInteractor.isKeyguardShowing()
),
/* dismissShade= */ true,
/* animationController */ null,
/* showOverLockscreenWhenLocked */ true,
/* userHandle */ currentUser.getUserHandle(),
)
}
UserActionModel.ADD_SUPERVISED_USER -> {

View File

@@ -6,6 +6,7 @@ import android.testing.TestableLooper
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.nullable
import com.android.systemui.util.mockito.whenever
@@ -27,9 +28,7 @@ class CreateUserActivityTest : SysuiTestCase() {
createDialog(
/* activity = */ nullable(),
/* activityStarter = */ nullable(),
/* oldUserIcon = */ nullable(),
/* defaultUserName = */ nullable(),
/* title = */ nullable(),
/* isMultipleAdminsEnabled = */ any(),
/* successCallback = */ nullable(),
/* cancelCallback = */ nullable()
)

View File

@@ -482,30 +482,17 @@ class UserInteractorTest : SysuiTestCase() {
}
@Test
fun executeAction_addUser_dialogShown() =
fun executeAction_addUser_dismissesDialogAndStartsActivity() =
testScope.runTest {
val userInfos = createUserInfos(count = 2, includeGuest = false)
userRepository.setUserInfos(userInfos)
userRepository.setSelectedUserInfo(userInfos[0])
keyguardRepository.setKeyguardShowing(false)
val dialogRequest = collectLastValue(underTest.dialogShowRequests)
val dialogShower: UserSwitchDialogController.DialogShower = mock()
underTest.executeAction(UserActionModel.ADD_USER, dialogShower)
underTest.executeAction(UserActionModel.ADD_USER)
verify(uiEventLogger, times(1))
.log(MultiUserActionsEvent.CREATE_USER_FROM_USER_SWITCHER)
assertThat(dialogRequest())
.isEqualTo(
ShowDialogRequestModel.ShowAddUserDialog(
userHandle = userInfos[0].userHandle,
isKeyguardShowing = false,
showEphemeralMessage = false,
dialogShower = dialogShower,
)
)
underTest.onDialogShown()
assertThat(dialogRequest()).isNull()
}
@Test
@@ -862,7 +849,7 @@ class UserInteractorTest : SysuiTestCase() {
// Dialog is shown.
assertThat(dialogRequest())
.isEqualTo(ShowDialogRequestModel.ShowUserSwitcherFullscreenDialog(expandable))
.isEqualTo(ShowDialogRequestModel.ShowUserSwitcherFullscreenDialog(expandable))
underTest.onDialogShown()
assertThat(dialogRequest()).isNull()