1 /* 2 * Copyright (C) 2018 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 package com.android.settings.security; 17 18 import static com.android.settings.biometrics.face.FaceSettings.isFaceHardwareDetected; 19 import static com.android.settings.biometrics.fingerprint.FingerprintSettings.isFingerprintHardwareDetected; 20 21 import android.app.settings.SettingsEnums; 22 import android.content.Context; 23 import android.content.Intent; 24 25 import androidx.annotation.VisibleForTesting; 26 27 import com.android.settings.R; 28 import com.android.settings.biometrics.combination.CombinedBiometricStatusPreferenceController; 29 import com.android.settings.biometrics.face.FaceStatusPreferenceController; 30 import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController; 31 import com.android.settings.dashboard.DashboardFragment; 32 import com.android.settings.overlay.FeatureFactory; 33 import com.android.settings.safetycenter.SafetyCenterManagerWrapper; 34 import com.android.settings.search.BaseSearchIndexProvider; 35 import com.android.settings.security.trustagent.TrustAgentListPreferenceController; 36 import com.android.settings.widget.PreferenceCategoryController; 37 import com.android.settingslib.core.AbstractPreferenceController; 38 import com.android.settingslib.core.lifecycle.Lifecycle; 39 import com.android.settingslib.search.SearchIndexable; 40 41 import java.util.ArrayList; 42 import java.util.List; 43 44 @SearchIndexable 45 public class SecuritySettings extends DashboardFragment { 46 47 private static final String TAG = "SecuritySettings"; 48 protected static final String SECURITY_CATEGORY = "security_category"; 49 50 public static final int CHANGE_TRUST_AGENT_SETTINGS = 126; 51 public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129; 52 public static final int UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 130; 53 @VisibleForTesting 54 static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; 55 @VisibleForTesting 56 static final String KEY_FACE_SETTINGS = "face_settings"; 57 58 @Override getMetricsCategory()59 public int getMetricsCategory() { 60 return SettingsEnums.SECURITY; 61 } 62 63 @Override getPreferenceScreenResId()64 protected int getPreferenceScreenResId() { 65 return R.xml.security_dashboard_settings; 66 } 67 68 @Override getLogTag()69 protected String getLogTag() { 70 return TAG; 71 } 72 73 @Override getHelpResource()74 public int getHelpResource() { 75 return R.string.help_url_security; 76 } 77 78 @Override createPreferenceControllers(Context context)79 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 80 return buildPreferenceControllers(context, getSettingsLifecycle(), this /* host*/); 81 } 82 83 /** 84 * see confirmPatternThenDisableAndClear 85 */ 86 @Override onActivityResult(int requestCode, int resultCode, Intent data)87 public void onActivityResult(int requestCode, int resultCode, Intent data) { 88 if (use(TrustAgentListPreferenceController.class) 89 .handleActivityResult(requestCode, resultCode)) { 90 return; 91 } 92 if (use(LockUnificationPreferenceController.class) 93 .handleActivityResult(requestCode, resultCode, data)) { 94 return; 95 } 96 super.onActivityResult(requestCode, resultCode, data); 97 } 98 startUnification()99 void startUnification() { 100 use(LockUnificationPreferenceController.class).startUnification(); 101 } 102 updateUnificationPreference()103 void updateUnificationPreference() { 104 use(LockUnificationPreferenceController.class).updateState(null); 105 } 106 buildPreferenceControllers(Context context, Lifecycle lifecycle, SecuritySettings host)107 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 108 Lifecycle lifecycle, SecuritySettings host) { 109 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 110 final List<AbstractPreferenceController> securityPreferenceControllers = new ArrayList<>(); 111 securityPreferenceControllers.add(new FaceStatusPreferenceController(context, lifecycle)); 112 securityPreferenceControllers.add(new FingerprintStatusPreferenceController( 113 context, lifecycle)); 114 securityPreferenceControllers.add(new CombinedBiometricStatusPreferenceController( 115 context, lifecycle)); 116 securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); 117 controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) 118 .setChildren(securityPreferenceControllers)); 119 controllers.addAll(securityPreferenceControllers); 120 121 return controllers; 122 } 123 124 /** 125 * For Search. Please keep it in sync when updating "createPreferenceHierarchy()" 126 */ 127 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 128 new BaseSearchIndexProvider(R.xml.security_dashboard_settings) { 129 130 @Override 131 public List<AbstractPreferenceController> createPreferenceControllers(Context 132 context) { 133 return buildPreferenceControllers(context, null /* lifecycle */, 134 null /* host*/); 135 } 136 137 @Override 138 protected boolean isPageSearchEnabled(Context context) { 139 return !FeatureFactory.getFeatureFactory().getSecuritySettingsFeatureProvider() 140 .hasAlternativeSecuritySettingsFragment() 141 && !SafetyCenterManagerWrapper.get().isEnabled(context); 142 } 143 144 @Override 145 public List<String> getNonIndexableKeys(Context context) { 146 final List<String> keys = super.getNonIndexableKeys(context); 147 if (!isFingerprintHardwareDetected(context)) { 148 keys.add(KEY_FINGERPRINT_SETTINGS); 149 } 150 if (!isFaceHardwareDetected(context)) { 151 keys.add(KEY_FACE_SETTINGS); 152 } 153 return keys; 154 } 155 }; 156 157 @Override getSettingsLifecycle()158 public Lifecycle getSettingsLifecycle() { 159 return super.getSettingsLifecycle(); 160 } 161 } 162