• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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.settings.privatespace.delete;
18 
19 import static com.android.internal.app.SetScreenLockDialogActivity.LAUNCH_REASON_RESET_PRIVATE_SPACE_SETTINGS_ACCESS;
20 import static com.android.settings.system.ResetDashboardFragment.PRIVATE_SPACE_DELETE_CREDENTIAL_REQUEST;
21 
22 import android.app.Activity;
23 import android.app.Dialog;
24 import android.app.KeyguardManager;
25 import android.app.settings.SettingsEnums;
26 import android.content.Context;
27 import android.content.DialogInterface;
28 import android.content.Intent;
29 import android.os.Bundle;
30 import android.text.TextUtils;
31 
32 import androidx.annotation.NonNull;
33 import androidx.annotation.Nullable;
34 import androidx.annotation.VisibleForTesting;
35 import androidx.appcompat.app.AlertDialog;
36 import androidx.fragment.app.FragmentManager;
37 import androidx.preference.Preference;
38 
39 import com.android.internal.annotations.Initializer;
40 import com.android.internal.app.SetScreenLockDialogActivity;
41 import com.android.settings.R;
42 import com.android.settings.core.BasePreferenceController;
43 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
44 import com.android.settings.password.ChooseLockSettingsHelper;
45 import com.android.settings.privatespace.PrivateSpaceMaintainer;
46 import com.android.settings.system.ResetDashboardFragment;
47 
48 /** Controller to delete private space from Settings Reset options after authentication. */
49 public class ResetOptionsDeletePrivateSpaceController extends BasePreferenceController {
50     private static final String TAG = "PrivateSpaceResetCtrl";
51     private ResetDashboardFragment mHostFragment;
52     private KeyguardManager mKeyguardManager;
53 
ResetOptionsDeletePrivateSpaceController( @onNull Context context, @NonNull String preferenceKey)54     public ResetOptionsDeletePrivateSpaceController(
55             @NonNull Context context, @NonNull String preferenceKey) {
56         super(context, preferenceKey);
57     }
58 
59     @Initializer
setFragment(@onNull ResetDashboardFragment hostFragment)60     public void setFragment(@NonNull ResetDashboardFragment hostFragment) {
61         mHostFragment = hostFragment;
62     }
63 
64     @Override
getAvailabilityStatus()65     public int getAvailabilityStatus() {
66         return android.multiuser.Flags.enablePrivateSpaceFeatures()
67                         && android.multiuser.Flags.deletePrivateSpaceFromReset()
68                         && isPrivateSpaceEntryPointEnabled()
69                 ? AVAILABLE
70                 : UNSUPPORTED_ON_DEVICE;
71     }
72 
73     @Override
handlePreferenceTreeClick(@onNull Preference preference)74     public boolean handlePreferenceTreeClick(@NonNull Preference preference) {
75         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
76             return false;
77         }
78         startAuthenticationForDelete();
79         return true;
80     }
81 
82     @VisibleForTesting
startAuthenticationForDelete()83     boolean startAuthenticationForDelete() {
84         if (getKeyguardManager().isDeviceSecure()) {
85             final ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(
86                     mHostFragment.getActivity(), mHostFragment);
87             builder.setRequestCode(PRIVATE_SPACE_DELETE_CREDENTIAL_REQUEST).show();
88         } else {
89             promptToSetDeviceLock();
90         }
91         return true;
92     }
93 
94     /** Method to handle onActivityResult */
handleActivityResult(int requestCode, int resultCode, @Nullable Intent data)95     public boolean handleActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
96         if (requestCode == PRIVATE_SPACE_DELETE_CREDENTIAL_REQUEST
97                 && resultCode == Activity.RESULT_OK
98                 && data != null) {
99             DeletePrivateSpaceDialogFragment dialogFragment = getDeleteDialogFragment();
100             dialogFragment.show(
101                     getFragmentManager(), DeletePrivateSpaceDialogFragment.class.getName());
102             return true;
103         }
104         return false;
105     }
106 
107     @VisibleForTesting
getDeleteDialogFragment()108     DeletePrivateSpaceDialogFragment getDeleteDialogFragment() {
109         return new DeletePrivateSpaceDialogFragment();
110     }
111 
112     @VisibleForTesting
getFragmentManager()113     FragmentManager getFragmentManager() {
114         return mHostFragment.getFragmentManager();
115     }
116 
117     @VisibleForTesting
isPrivateSpaceEntryPointEnabled()118     boolean isPrivateSpaceEntryPointEnabled() {
119         return PrivateSpaceMaintainer.getInstance(mContext).isPrivateSpaceEntryPointEnabled();
120     }
121 
122     /* Dialog shown when deleting private space from Reset Options. */
123     public static class DeletePrivateSpaceDialogFragment extends InstrumentedDialogFragment {
124         private static final String TAG = "PrivateSpaceResetFrag";
125 
126         @Override
getMetricsCategory()127         public int getMetricsCategory() {
128             return SettingsEnums.RESET_DELETE_PRIVATE_SPACE_DIALOG;
129         }
130 
131         @NonNull
132         @Override
onCreateDialog(@ullable Bundle savedInstanceState)133         public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
134             Context context = getContext();
135             return new AlertDialog.Builder(context)
136                     .setTitle(R.string.private_space_delete_header)
137                     .setMessage(R.string.reset_private_space_delete_dialog)
138                     .setPositiveButton(
139                             R.string.private_space_delete_button_label,
140                             (DialogInterface dialog, int which) -> {
141                                 mMetricsFeatureProvider.action(
142                                         context, SettingsEnums.RESET_DELETE_PRIVATE_SPACE_CONFIRM);
143                                 PrivateSpaceMaintainer privateSpaceMaintainer =
144                                         PrivateSpaceMaintainer.getInstance(context);
145                                 privateSpaceMaintainer.deletePrivateSpace();
146                                 dialog.dismiss();
147                             })
148                     .setNegativeButton(
149                             R.string.private_space_cancel_label,
150                             (DialogInterface dialog, int which) -> {
151                                 mMetricsFeatureProvider.action(
152                                         context, SettingsEnums.RESET_DELETE_PRIVATE_SPACE_CANCEL);
153                                 dialog.cancel();
154                             })
155                     .create();
156         }
157     }
158 
getKeyguardManager()159     private KeyguardManager getKeyguardManager() {
160         if (mKeyguardManager == null) {
161             mKeyguardManager = mContext.getSystemService(KeyguardManager.class);
162         }
163         return mKeyguardManager;
164     }
165 
promptToSetDeviceLock()166     private void promptToSetDeviceLock() {
167         Intent setScreenLockPromptIntent = SetScreenLockDialogActivity.createBaseIntent(
168                 LAUNCH_REASON_RESET_PRIVATE_SPACE_SETTINGS_ACCESS);
169         mContext.startActivity(setScreenLockPromptIntent);
170     }
171 }
172