• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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