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