1 /* 2 * Copyright (C) 2021 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.security; 18 19 import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_FOR_WORK; 20 import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO; 21 import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGE_DEVICE_ADMIN_APPS; 22 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SECURITY_TITLE; 23 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE; 24 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_SUMMARY; 25 26 import android.app.settings.SettingsEnums; 27 import android.content.Context; 28 import android.content.Intent; 29 import android.os.Bundle; 30 31 import com.android.settings.R; 32 import com.android.settings.biometrics.combination.CombinedBiometricProfileStatusPreferenceController; 33 import com.android.settings.biometrics.face.FaceProfileStatusPreferenceController; 34 import com.android.settings.biometrics.fingerprint.FingerprintProfileStatusPreferenceController; 35 import com.android.settings.dashboard.DashboardFragment; 36 import com.android.settings.overlay.FeatureFactory; 37 import com.android.settings.safetycenter.SafetyCenterManagerWrapper; 38 import com.android.settings.search.BaseSearchIndexProvider; 39 import com.android.settings.security.trustagent.TrustAgentListPreferenceController; 40 import com.android.settings.widget.PreferenceCategoryController; 41 import com.android.settingslib.core.AbstractPreferenceController; 42 import com.android.settingslib.core.lifecycle.Lifecycle; 43 import com.android.settingslib.drawer.CategoryKey; 44 import com.android.settingslib.search.SearchIndexable; 45 46 import java.util.ArrayList; 47 import java.util.List; 48 49 /** 50 * An overflow menu for {@code SecuritySettings} containing advanced security settings. 51 * 52 * <p>This includes all work-profile related settings. 53 */ 54 @SearchIndexable 55 public class SecurityAdvancedSettings extends DashboardFragment { 56 57 private static final String TAG = "SecurityAdvancedSettings"; 58 private static final String WORK_PROFILE_SECURITY_CATEGORY = "security_category_profile"; 59 60 /** Used in case of old Security settings when SafetyCenter is disabled */ 61 private static final String CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS = 62 "com.android.settings.category.ia.legacy_advanced_security"; 63 64 @Override onCreate(Bundle icicle)65 public void onCreate(Bundle icicle) { 66 super.onCreate(icicle); 67 replaceEnterpriseStringTitle("unlock_set_or_change_profile", 68 WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE, 69 R.string.unlock_set_unlock_launch_picker_title_profile); 70 replaceEnterpriseStringSummary("unification", 71 WORK_PROFILE_UNIFY_LOCKS_SUMMARY, 72 R.string.lock_settings_profile_unification_summary); 73 replaceEnterpriseStringTitle("fingerprint_settings_profile", 74 FINGERPRINT_FOR_WORK, 75 R.string.security_settings_work_fingerprint_preference_title); 76 replaceEnterpriseStringTitle("manage_device_admin", 77 MANAGE_DEVICE_ADMIN_APPS, R.string.manage_device_admin); 78 replaceEnterpriseStringTitle("security_category_profile", 79 WORK_PROFILE_SECURITY_TITLE, R.string.lock_settings_profile_title); 80 replaceEnterpriseStringTitle("enterprise_privacy", MANAGED_DEVICE_INFO, 81 R.string.enterprise_privacy_settings); 82 83 } 84 85 @Override getMetricsCategory()86 public int getMetricsCategory() { 87 return SettingsEnums.SECURITY_ADVANCED; 88 } 89 90 @Override getCategoryKey()91 public String getCategoryKey() { 92 final Context context = getContext(); 93 if (context == null) { 94 return CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS; 95 } else if (SafetyCenterManagerWrapper.get().isEnabled(context)) { 96 return CategoryKey.CATEGORY_SECURITY_ADVANCED_SETTINGS; 97 } else { 98 final SecuritySettingsFeatureProvider securitySettingsFeatureProvider = 99 FeatureFactory.getFactory(context) 100 .getSecuritySettingsFeatureProvider(); 101 102 if (securitySettingsFeatureProvider.hasAlternativeSecuritySettingsFragment()) { 103 return securitySettingsFeatureProvider.getAlternativeAdvancedSettingsCategoryKey(); 104 } else { 105 return CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS; 106 } 107 } 108 } 109 110 @Override getPreferenceScreenResId()111 protected int getPreferenceScreenResId() { 112 return R.xml.security_advanced_settings; 113 } 114 115 @Override getLogTag()116 protected String getLogTag() { 117 return TAG; 118 } 119 120 @Override createPreferenceControllers(Context context)121 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 122 return buildPreferenceControllers(context, getSettingsLifecycle(), this /* host*/); 123 } 124 125 /** 126 * see confirmPatternThenDisableAndClear 127 */ 128 @Override onActivityResult(int requestCode, int resultCode, Intent data)129 public void onActivityResult(int requestCode, int resultCode, Intent data) { 130 if (use(TrustAgentListPreferenceController.class) 131 .handleActivityResult(requestCode, resultCode)) { 132 return; 133 } 134 if (use(LockUnificationPreferenceController.class) 135 .handleActivityResult(requestCode, resultCode, data)) { 136 return; 137 } 138 super.onActivityResult(requestCode, resultCode, data); 139 } 140 buildPreferenceControllers(Context context, Lifecycle lifecycle, DashboardFragment host)141 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, 142 Lifecycle lifecycle, DashboardFragment host) { 143 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 144 controllers.add(new TrustAgentListPreferenceController(context, host, lifecycle)); 145 146 final List<AbstractPreferenceController> profileSecurityControllers = new ArrayList<>(); 147 profileSecurityControllers.add(new ChangeProfileScreenLockPreferenceController( 148 context, host)); 149 profileSecurityControllers.add(new LockUnificationPreferenceController(context, host)); 150 profileSecurityControllers.add(new VisiblePatternProfilePreferenceController( 151 context, lifecycle)); 152 profileSecurityControllers.add(new FaceProfileStatusPreferenceController( 153 context, lifecycle)); 154 profileSecurityControllers.add(new FingerprintProfileStatusPreferenceController( 155 context, lifecycle)); 156 profileSecurityControllers 157 .add(new CombinedBiometricProfileStatusPreferenceController(context, lifecycle)); 158 controllers.add(new PreferenceCategoryController(context, WORK_PROFILE_SECURITY_CATEGORY) 159 .setChildren(profileSecurityControllers)); 160 controllers.addAll(profileSecurityControllers); 161 162 return controllers; 163 } 164 165 /** 166 * For Search. Please keep it in sync when updating "createPreferenceHierarchy()" 167 */ 168 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 169 new BaseSearchIndexProvider(R.xml.security_advanced_settings) { 170 171 @Override 172 public List<AbstractPreferenceController> createPreferenceControllers(Context 173 context) { 174 return buildPreferenceControllers(context, null /* lifecycle */, 175 null /* host*/); 176 } 177 }; 178 } 179