1 /* 2 * Copyright (C) 2025 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settingslib.users; 18 19 import android.app.Activity; 20 import android.app.Dialog; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.graphics.drawable.Drawable; 24 import android.os.Bundle; 25 import android.view.MotionEvent; 26 27 import androidx.annotation.NonNull; 28 import androidx.annotation.Nullable; 29 30 import com.android.internal.annotations.VisibleForTesting; 31 import com.android.settingslib.R; 32 33 34 public class CreateUserActivity extends Activity { 35 private static final String TAG = "CreateUserActivity"; 36 37 public static final String EXTRA_USER_NAME = "new_user_name"; 38 public static final String EXTRA_IS_ADMIN = "is_admin"; 39 public static final String EXTRA_USER_ICON_PATH = "user_icon_path"; 40 private static final String DIALOG_STATE_KEY = "create_user_dialog_state"; 41 private static final String EXTRA_CAN_CREATE_ADMIN = "can_create_admin"; 42 private static final String EXTRA_FILE_AUTHORITY = "file_authority"; 43 44 private CreateUserDialogController mCreateUserDialogController; 45 @VisibleForTesting 46 Dialog mSetupUserDialog; 47 48 49 /** 50 * Creates intent to start CreateUserActivity 51 */ createIntentForStart(@onNull Context context, boolean canCreateAdminUser, @NonNull String fileAuth)52 public static @NonNull Intent createIntentForStart(@NonNull Context context, 53 boolean canCreateAdminUser, @NonNull String fileAuth) { 54 Intent intent = new Intent(context, CreateUserActivity.class); 55 intent.putExtra(EXTRA_CAN_CREATE_ADMIN, canCreateAdminUser); 56 intent.putExtra(EXTRA_FILE_AUTHORITY, fileAuth); 57 return intent; 58 } 59 60 @Override onCreate(@ullable Bundle savedInstanceState)61 protected void onCreate(@Nullable Bundle savedInstanceState) { 62 super.onCreate(savedInstanceState); 63 Intent intent = getIntent(); 64 65 mCreateUserDialogController = new CreateUserDialogController( 66 intent.getStringExtra(EXTRA_FILE_AUTHORITY)); 67 setContentView(R.layout.activity_create_new_user); 68 if (savedInstanceState != null) { 69 mCreateUserDialogController.onRestoreInstanceState(savedInstanceState); 70 } 71 mSetupUserDialog = createDialog(intent.getBooleanExtra(EXTRA_CAN_CREATE_ADMIN, false)); 72 mSetupUserDialog.show(); 73 } 74 75 @Override onRestoreInstanceState(@onNull Bundle savedInstanceState)76 protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { 77 super.onRestoreInstanceState(savedInstanceState); 78 Bundle savedDialogState = savedInstanceState.getBundle(DIALOG_STATE_KEY); 79 if (savedDialogState != null && mSetupUserDialog != null) { 80 mSetupUserDialog.onRestoreInstanceState(savedDialogState); 81 } 82 } 83 createDialog(boolean canCreateAdminUser)84 private Dialog createDialog(boolean canCreateAdminUser) { 85 return mCreateUserDialogController.createDialog( 86 this, 87 this::startActivity, 88 canCreateAdminUser, 89 this::setSuccessResult, 90 this::cancel 91 ); 92 } 93 94 @Override onTouchEvent(@ullable MotionEvent event)95 public boolean onTouchEvent(@Nullable MotionEvent event) { 96 cancel(); 97 return super.onTouchEvent(event); 98 } 99 100 @VisibleForTesting setSuccessResult(String userName, Drawable userIcon, String path, Boolean isAdmin)101 void setSuccessResult(String userName, Drawable userIcon, String path, Boolean isAdmin) { 102 Intent intent = new Intent(this, CreateUserActivity.class); 103 intent.putExtra(EXTRA_USER_NAME, userName); 104 intent.putExtra(EXTRA_IS_ADMIN, isAdmin); 105 intent.putExtra(EXTRA_USER_ICON_PATH, path); 106 107 setResult(RESULT_OK, intent); 108 finish(); 109 } 110 111 @VisibleForTesting cancel()112 void cancel() { 113 setResult(RESULT_CANCELED); 114 finish(); 115 } 116 117 @Override onSaveInstanceState(@onNull Bundle outState)118 protected void onSaveInstanceState(@NonNull Bundle outState) { 119 if (mSetupUserDialog != null && mSetupUserDialog.isShowing()) { 120 outState.putBundle(DIALOG_STATE_KEY, mSetupUserDialog.onSaveInstanceState()); 121 } 122 mCreateUserDialogController.onSaveInstanceState(outState); 123 super.onSaveInstanceState(outState); 124 } 125 126 @Override onActivityResult(int requestCode, int resultCode, Intent data)127 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 128 mCreateUserDialogController.onActivityResult(requestCode, resultCode, data); 129 } 130 startActivity(Intent intent, int requestCode)131 private void startActivity(Intent intent, int requestCode) { 132 startActivityForResult(intent, requestCode); 133 mCreateUserDialogController.startingActivityForResult(); 134 } 135 } 136