blob: 890ee5f4530933bd583fb7bd5034a64b5fd06bba [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.user;
import android.app.Activity;
import android.app.Dialog;
import android.app.IActivityManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.settingslib.users.EditUserInfoController;
import com.android.systemui.R;
import javax.inject.Inject;
/**
* This screen shows a Dialog for choosing nickname and photo for a new user, and then delegates the
* user creation to a UserCreator.
*/
public class CreateUserActivity extends Activity {
/**
* Creates an intent to start this activity.
*/
public static Intent createIntentForStart(Context context) {
return new Intent(context, CreateUserActivity.class);
}
private static final String TAG = "CreateUserActivity";
private static final String DIALOG_STATE_KEY = "create_user_dialog_state";
private final UserCreator mUserCreator;
private final EditUserInfoController mEditUserInfoController;
private final IActivityManager mActivityManager;
private Dialog mSetupUserDialog;
@Inject
public CreateUserActivity(UserCreator userCreator,
EditUserInfoController editUserInfoController, IActivityManager activityManager) {
mUserCreator = userCreator;
mEditUserInfoController = editUserInfoController;
mActivityManager = activityManager;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setShowWhenLocked(true);
setContentView(R.layout.activity_create_new_user);
if (savedInstanceState != null) {
mEditUserInfoController.onRestoreInstanceState(savedInstanceState);
}
mSetupUserDialog = createDialog();
mSetupUserDialog.show();
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
if (mSetupUserDialog != null && mSetupUserDialog.isShowing()) {
outState.putBundle(DIALOG_STATE_KEY, mSetupUserDialog.onSaveInstanceState());
}
mEditUserInfoController.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Bundle savedDialogState = savedInstanceState.getBundle(DIALOG_STATE_KEY);
if (savedDialogState != null && mSetupUserDialog != null) {
mSetupUserDialog.onRestoreInstanceState(savedDialogState);
}
}
private Dialog createDialog() {
String defaultUserName = getString(com.android.settingslib.R.string.user_new_user_name);
return mEditUserInfoController.createDialog(
this,
(intent, requestCode) -> {
mEditUserInfoController.startingActivityForResult();
startActivityForResult(intent, requestCode);
},
null,
defaultUserName,
getString(R.string.user_add_user),
this::addUserNow,
this::finish
);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mEditUserInfoController.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mSetupUserDialog != null) {
mSetupUserDialog.dismiss();
}
}
private void addUserNow(String userName, Drawable userIcon) {
mSetupUserDialog.dismiss();
userName = (userName == null || userName.trim().isEmpty())
? getString(R.string.user_new_user_name)
: userName;
mUserCreator.createUser(userName, userIcon,
userInfo -> {
switchToUser(userInfo.id);
finishIfNeeded();
}, () -> {
Log.e(TAG, "Unable to create user");
finishIfNeeded();
});
}
private void finishIfNeeded() {
if (!isFinishing() && !isDestroyed()) {
finish();
}
}
private void switchToUser(int userId) {
try {
mActivityManager.switchUser(userId);
} catch (RemoteException e) {
Log.e(TAG, "Couldn't switch user.", e);
}
}
}