| /* |
| * 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); |
| } |
| } |
| } |