1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles Heimport static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
20fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles Heimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
21fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He
22487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millettimport android.app.Activity;
232c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.app.AlertDialog;
2452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarriimport android.app.Dialog;
2552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarriimport android.app.FragmentManager;
264037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
27524a63b493c2c9692dd09669173c96e69e09297cIdo Ofirimport android.content.ComponentName;
28abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
292c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.content.DialogInterface;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
31bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.PackageManager;
32bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.ResolveInfo;
33d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglioimport android.content.res.Resources;
343bcd76ce63c77b229e2d25a0191ccb568824f5c4Jason Monkimport android.hardware.fingerprint.FingerprintManager;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
3680753bc275ba82a08671325771f96306848d41c3Junda Liuimport android.os.PersistableBundle;
37bb06a427eb471227cf42a8078a54ca0581309493Dianne Hackbornimport android.os.UserHandle;
38783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager;
39fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles Heimport android.os.storage.StorageManager;
40d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglioimport android.provider.SearchIndexableResource;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
426f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.service.trust.TrustAgentService;
435c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Aminiimport android.support.annotation.VisibleForTesting;
4439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v14.preference.SwitchPreference;
4539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
4639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceChangeListener;
4739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceGroup;
4839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
4980753bc275ba82a08671325771f96306848d41c3Junda Liuimport android.telephony.CarrierConfigManager;
50ca7566125e00ed267aba831bd1d6d1ad78d90c17Wink Savilleimport android.telephony.SubscriptionInfo;
513bcd76ce63c77b229e2d25a0191ccb568824f5c4Jason Monkimport android.telephony.SubscriptionManager;
523bcd76ce63c77b229e2d25a0191ccb568824f5c4Jason Monkimport android.telephony.TelephonyManager;
53524a63b493c2c9692dd09669173c96e69e09297cIdo Ofirimport android.text.TextUtils;
5486624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log;
55301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang
56265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
57a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
58fe7655914de3852093c35600df996824d03ddf63Jim Millerimport com.android.settings.TrustAgentUtils.TrustAgentComponentInfo;
591e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhangimport com.android.settings.core.instrumentation.InstrumentedDialogFragment;
60301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhangimport com.android.settings.dashboard.DashboardFeatureProvider;
615c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Aminiimport com.android.settings.dashboard.SummaryLoader;
62ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowskiimport com.android.settings.enterprise.EnterprisePrivacyPreferenceController;
63ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowskiimport com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
645ad75f07b1861b802b75c720830db260b4f93417Jorim Jaggiimport com.android.settings.fingerprint.FingerprintSettings;
6581610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Lingimport com.android.settings.location.LocationPreferenceController;
66cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Lingimport com.android.settings.notification.LockScreenNotificationPreferenceController;
67301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhangimport com.android.settings.overlay.FeatureFactory;
68d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglioimport com.android.settings.search.BaseSearchIndexProvider;
69d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglioimport com.android.settings.search.Indexable;
70d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglioimport com.android.settings.search.SearchIndexableRaw;
7193582995daff3b92b89a24c271fbd719293a41daDoris Lingimport com.android.settings.security.OwnerInfoPreferenceController;
724774b58b4c0d53f6a436397cb099b95ac08d6923Shahriyar Aminiimport com.android.settings.security.SecurityFeatureProvider;
73ccae73f228f98bc8412c435a273525514d78843aZachary Iqbalimport com.android.settings.trustagent.TrustAgentManager;
7462e66c9ca4dc7140b9089519c171cd1cc40b0c63Fan Zhangimport com.android.settings.widget.GearPreference;
75550d068abd5a38e77507eab704ecdf1be70695cbSudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
769c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedPreference;
77301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhangimport com.android.settingslib.drawer.CategoryKey;
78a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne
7986624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList;
80bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport java.util.List;
815ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings.
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
85565653cef1039ab4e34e505185f1c77d847357cdJulia Reynoldspublic class SecuritySettings extends SettingsPreferenceFragment
86f61f11b87029d41521bedff56132a068a172190fSuprabh Shukla        implements OnPreferenceChangeListener, Indexable,
8762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        GearPreference.OnGearClickListener {
889218687e4baaf0226ef16b58f78123d979711e5dJim Miller
899218687e4baaf0226ef16b58f78123d979711e5dJim Miller    private static final String TAG = "SecuritySettings";
90301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang
91250b9bee685de8f4060dd410f0894c22de1909cfJim Miller    private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent";
926f482447b05492906755d91ac4c29ec505a8a544Ido Ofir    private static final Intent TRUST_AGENT_INTENT =
936f482447b05492906755d91ac4c29ec505a8a544Ido Ofir            new Intent(TrustAgentService.SERVICE_INTERFACE);
946f8fb436178d12d11d6ab59671168f0603bdbdcbJason parks
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Lock Settings
9691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
9752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final String KEY_UNLOCK_SET_OR_CHANGE_PROFILE = "unlock_set_or_change_profile";
9852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final String KEY_VISIBLE_PATTERN_PROFILE = "visiblepattern_profile";
99edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani    private static final String KEY_SECURITY_CATEGORY = "security_category";
1002db8c867d170c02bae267503b0111d4076b8df21Doris Ling    @VisibleForTesting
1012db8c867d170c02bae267503b0111d4076b8df21Doris Ling    static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
10252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final String KEY_UNIFICATION = "unification";
103cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling    @VisibleForTesting
104cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling    static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
1053a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze    private static final String KEY_ENCRYPTION_AND_CREDENTIALS = "encryption_and_credential";
1063a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze    private static final String KEY_LOCATION_SCANNING  = "location_scanning";
107ef3e701b78134baf753484c44b7d1915029faa3fJim Miller
10891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
1096f482447b05492906755d91ac4c29ec505a8a544Ido Ofir    private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
11052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE = 127;
11152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final int UNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 128;
11252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129;
11326632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra    private static final int UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 130;
11452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private static final String TAG_UNIFICATION_DIALOG = "unification_dialog";
1157031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
11691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    // Misc Settings
11781610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling    private static final String KEY_SIM_LOCK = "sim_lock_settings";
11891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SHOW_PASSWORD = "show_password";
1196f482447b05492906755d91ac4c29ec505a8a544Ido Ofir    private static final String KEY_TRUST_AGENT = "trust_agent";
12027d7ea56f3f02ea7efaf1e57b5d6758ddb56c353Jason Monk    private static final String KEY_SCREEN_PINNING = "screen_pinning_settings";
12147d380f1e6c823cea444004cb799d4c791145cc6Jim Miller
122c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini    // Security status
123c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini    private static final String KEY_SECURITY_STATUS = "security_status";
124c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini    private static final String SECURITY_STATUS_KEY_PREFIX = "security_status_";
125c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini
1265c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    // Package verifier Settings
1275c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
128c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini    static final String KEY_PACKAGE_VERIFIER_STATUS = "security_status_package_verifier";
1295c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    private static final int PACKAGE_VERIFIER_STATE_ENABLED = 1;
1305c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini
131ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski    // Device management settings
132ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski    private static final String KEY_ENTERPRISE_PRIVACY = "enterprise_privacy";
133ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski    private static final String KEY_MANAGE_DEVICE_ADMIN = "manage_device_admin";
134ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski
1354a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller    // These switch preferences need special handling since they're not all stored in Settings.
13662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    private static final String SWITCH_PREFERENCE_KEYS[] = {
137f61f11b87029d41521bedff56132a068a172190fSuprabh Shukla            KEY_SHOW_PASSWORD, KEY_UNIFICATION, KEY_VISIBLE_PATTERN_PROFILE
138a1276e49561016cb1f82f1d2d5d15b356c422374Mahaver Chopra    };
1394a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller
140fe7655914de3852093c35600df996824d03ddf63Jim Miller    // Only allow one trust agent on the platform.
141fe7655914de3852093c35600df996824d03ddf63Jim Miller    private static final boolean ONLY_ONE_TRUST_AGENT = true;
142fe7655914de3852093c35600df996824d03ddf63Jim Miller
1435437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos    private static final int MY_USER_ID = UserHandle.myUserId();
1445437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos
145301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang    private DashboardFeatureProvider mDashboardFeatureProvider;
146f48206e37e8a88a2f5f9b019995488696f8bf964Maggie Benthall    private DevicePolicyManager mDPM;
1474774b58b4c0d53f6a436397cb099b95ac08d6923Shahriyar Amini    private SecurityFeatureProvider mSecurityFeatureProvider;
148ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal    private TrustAgentManager mTrustAgentManager;
1490183fb5394f105d544472a52b2b4ba628e01da92Wink Saville    private SubscriptionManager mSubscriptionManager;
15044879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen    private UserManager mUm;
151122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
15200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
153122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    private LockPatternUtils mLockPatternUtils;
154e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic    private ManagedLockPasswordProvider mManagedPasswordProvider;
15591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
15652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private SwitchPreference mVisiblePatternProfile;
15756462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri    private SwitchPreference mUnifyProfile;
15852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
1594a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller    private SwitchPreference mShowPassword;
16091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
16144879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen    private boolean mIsAdmin;
1627fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
163250b9bee685de8f4060dd410f0894c22de1909cfJim Miller    private Intent mTrustAgentClickIntent;
1641682a0d1be53562a8ca2d0eb8fcd41b07af2f144Ido Ofir
1656934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri    private int mProfileChallengeUserId;
1666934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri
16752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private String mCurrentDevicePassword;
16852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private String mCurrentProfilePassword;
16952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
17081610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling    private LocationPreferenceController mLocationcontroller;
171ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski    private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
172ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski    private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
173cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling    private LockScreenNotificationPreferenceController mLockScreenNotificationPreferenceController;
17481610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1766507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang    public int getMetricsCategory() {
1779d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.SECURITY;
1788a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
1798a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
181d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
183122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
184301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        final Activity activity = getActivity();
1850183fb5394f105d544472a52b2b4ba628e01da92Wink Saville
186301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        mSubscriptionManager = SubscriptionManager.from(activity);
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
188301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        mLockPatternUtils = new LockPatternUtils(activity);
189301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang
190301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        mManagedPasswordProvider = ManagedLockPasswordProvider.get(activity, MY_USER_ID);
191e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
192abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
193122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
194301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        mUm = UserManager.get(activity);
195301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang
196301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(activity);
19744879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen
198301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang        mDashboardFeatureProvider = FeatureFactory.getFactory(activity)
199301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang                .getDashboardFeatureProvider(activity);
200250b9bee685de8f4060dd410f0894c22de1909cfJim Miller
2014774b58b4c0d53f6a436397cb099b95ac08d6923Shahriyar Amini        mSecurityFeatureProvider = FeatureFactory.getFactory(activity).getSecurityFeatureProvider();
2024774b58b4c0d53f6a436397cb099b95ac08d6923Shahriyar Amini
203ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal        mTrustAgentManager = mSecurityFeatureProvider.getTrustAgentManager();
204ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal
205250b9bee685de8f4060dd410f0894c22de1909cfJim Miller        if (savedInstanceState != null
206250b9bee685de8f4060dd410f0894c22de1909cfJim Miller                && savedInstanceState.containsKey(TRUST_AGENT_CLICK_INTENT)) {
207250b9bee685de8f4060dd410f0894c22de1909cfJim Miller            mTrustAgentClickIntent = savedInstanceState.getParcelable(TRUST_AGENT_CLICK_INTENT);
208250b9bee685de8f4060dd410f0894c22de1909cfJim Miller        }
20981610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling
21081610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling        mLocationcontroller = new LocationPreferenceController(activity);
211ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski        mManageDeviceAdminPreferenceController
212ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski                = new ManageDeviceAdminPreferenceController(activity);
213ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski        mEnterprisePrivacyPreferenceController
214ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski                = new EnterprisePrivacyPreferenceController(activity, null /* lifecycle */);
215cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling        mLockScreenNotificationPreferenceController
216cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling                = new LockScreenNotificationPreferenceController(activity);
21702cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    }
2185ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
219d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    private static int getResIdForLockUnlockScreen(Context context,
220e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            LockPatternUtils lockPatternUtils, ManagedLockPasswordProvider managedPasswordProvider,
221e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            int userId) {
22252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        final boolean isMyUser = userId == MY_USER_ID;
22336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        int resid = 0;
22452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (!lockPatternUtils.isSecure(userId)) {
22552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            if (!isMyUser) {
22652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                resid = R.xml.security_settings_lockscreen_profile;
22752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            } else if (lockPatternUtils.isLockScreenDisabled(userId)) {
22836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_lockscreen;
22936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            } else {
23036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_chooser;
23136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            }
232122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else {
23352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            switch (lockPatternUtils.getKeyguardStoredPasswordQuality(userId)) {
234af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
23552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    resid = isMyUser ? R.xml.security_settings_pattern
23652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                            : R.xml.security_settings_pattern_profile;
237af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
238af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
2398fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
24052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    resid = isMyUser ? R.xml.security_settings_pin
24152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                            : R.xml.security_settings_pin_profile;
242af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
243af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
244af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
24557fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
24652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    resid = isMyUser ? R.xml.security_settings_password
24752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                            : R.xml.security_settings_password_profile;
248af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
249e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
250e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    resid = managedPasswordProvider.getResIdForLockUnlockScreen(!isMyUser);
251e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    break;
25200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
253122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
254d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        return resid;
255d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    }
256d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
257d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    /**
258d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio     * Important!
259d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio     *
2606f482447b05492906755d91ac4c29ec505a8a544Ido Ofir     * Don't forget to update the SecuritySearchIndexProvider if you are doing any change in the
261d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio     * logic or adding/removing preferences here.
262d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio     */
263d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    private PreferenceScreen createPreferenceHierarchy() {
264d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        PreferenceScreen root = getPreferenceScreen();
265d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        if (root != null) {
266d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            root.removeAll();
267d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        }
268d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        addPreferencesFromResource(R.xml.security_settings);
269d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        root = getPreferenceScreen();
270122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
271c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini        // Add category for security status
272c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini        addPreferencesFromResource(R.xml.security_settings_status);
273c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini
274d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        // Add options for lock/unlock screen
275e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        final int resid = getResIdForLockUnlockScreen(getActivity(), mLockPatternUtils,
276e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                mManagedPasswordProvider, MY_USER_ID);
277d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        addPreferencesFromResource(resid);
2784112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
2797aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        // DO or PO installed in the user may disallow to change password.
2807aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        disableIfPasswordQualityManaged(KEY_UNLOCK_SET_OR_CHANGE, MY_USER_ID);
28141d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi
282462cce1a4caef7705766c6ebecd353f2e84a8543Clara Bayarri        mProfileChallengeUserId = Utils.getManagedProfileId(mUm, MY_USER_ID);
28352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (mProfileChallengeUserId != UserHandle.USER_NULL
28452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                && mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
28552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            addPreferencesFromResource(R.xml.security_settings_profile);
28626632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra            addPreferencesFromResource(R.xml.security_settings_unification);
28752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            final int profileResid = getResIdForLockUnlockScreen(
288e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    getActivity(), mLockPatternUtils, mManagedPasswordProvider,
289e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    mProfileChallengeUserId);
29052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            addPreferencesFromResource(profileResid);
29152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            maybeAddFingerprintPreference(root, mProfileChallengeUserId);
29256462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)) {
2937aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                final Preference lockPreference =
2947aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                        root.findPreference(KEY_UNLOCK_SET_OR_CHANGE_PROFILE);
2957aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                final String summary = getContext().getString(
29652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                        R.string.lock_settings_profile_unified_summary);
29752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                lockPreference.setSummary(summary);
29856462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                lockPreference.setEnabled(false);
2997aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                // PO may disallow to change password for the profile, but screen lock and managed
3007aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                // profile's lock is the same. Disable main "Screen lock" menu.
3017aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                disableIfPasswordQualityManaged(KEY_UNLOCK_SET_OR_CHANGE, mProfileChallengeUserId);
3027aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            } else {
3037aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                // PO may disallow to change profile password, and the profile's password is
3047aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                // separated from screen lock password. Disable profile specific "Screen lock" menu.
3057aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                disableIfPasswordQualityManaged(KEY_UNLOCK_SET_OR_CHANGE_PROFILE,
3067aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                        mProfileChallengeUserId);
3076934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri            }
3086934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri        }
3096934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri
31062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        Preference unlockSetOrChange = findPreference(KEY_UNLOCK_SET_OR_CHANGE);
31162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        if (unlockSetOrChange instanceof GearPreference) {
31262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            ((GearPreference) unlockSetOrChange).setOnGearClickListener(this);
31362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
31462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
31544879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen        mIsAdmin = mUm.isAdminUser();
3167fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
31794d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller        // Fingerprint and trust agents
3182db8c867d170c02bae267503b0111d4076b8df21Doris Ling        int numberOfTrustAgent = 0;
3191682a0d1be53562a8ca2d0eb8fcd41b07af2f144Ido Ofir        PreferenceGroup securityCategory = (PreferenceGroup)
3201682a0d1be53562a8ca2d0eb8fcd41b07af2f144Ido Ofir                root.findPreference(KEY_SECURITY_CATEGORY);
3219d25005e7ab39bcc14722f7bdb977ceccb6107dcJim Miller        if (securityCategory != null) {
32252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            maybeAddFingerprintPreference(securityCategory, UserHandle.myUserId());
3232db8c867d170c02bae267503b0111d4076b8df21Doris Ling            numberOfTrustAgent = addTrustAgentSettings(securityCategory);
324cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling            setLockscreenPreferencesSummary(securityCategory);
3251682a0d1be53562a8ca2d0eb8fcd41b07af2f144Ido Ofir        }
3261682a0d1be53562a8ca2d0eb8fcd41b07af2f144Ido Ofir
32752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        mVisiblePatternProfile =
32852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                (SwitchPreference) root.findPreference(KEY_VISIBLE_PATTERN_PROFILE);
32956462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        mUnifyProfile = (SwitchPreference) root.findPreference(KEY_UNIFICATION);
33052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
33191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Append the rest of the settings
33291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        addPreferencesFromResource(R.xml.security_settings_misc);
33391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
3345c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani        // Do not display SIM lock for devices without an Icc card
335cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville        TelephonyManager tm = TelephonyManager.getDefault();
33680753bc275ba82a08671325771f96306848d41c3Junda Liu        CarrierConfigManager cfgMgr = (CarrierConfigManager)
33780753bc275ba82a08671325771f96306848d41c3Junda Liu                getActivity().getSystemService(Context.CARRIER_CONFIG_SERVICE);
33880753bc275ba82a08671325771f96306848d41c3Junda Liu        PersistableBundle b = cfgMgr.getConfig();
33944879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen        if (!mIsAdmin || !isSimIccReady() ||
34080753bc275ba82a08671325771f96306848d41c3Junda Liu                b.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
34191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            root.removePreference(root.findPreference(KEY_SIM_LOCK));
342a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo        } else {
34350e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest            // Disable SIM lock if there is no ready SIM card.
34450e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest            root.findPreference(KEY_SIM_LOCK).setEnabled(isSimReady());
345386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
346b08853aad9f3ef2dc3ba1f1c7a513a16220d4d9eJason Monk        if (Settings.System.getInt(getContentResolver(),
347b08853aad9f3ef2dc3ba1f1c7a513a16220d4d9eJason Monk                Settings.System.LOCK_TO_APP_ENABLED, 0) != 0) {
348b08853aad9f3ef2dc3ba1f1c7a513a16220d4d9eJason Monk            root.findPreference(KEY_SCREEN_PINNING).setSummary(
349b08853aad9f3ef2dc3ba1f1c7a513a16220d4d9eJason Monk                    getResources().getString(R.string.switch_on_text));
35027d7ea56f3f02ea7efaf1e57b5d6758ddb56c353Jason Monk        }
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
35291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Show password
3534a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller        mShowPassword = (SwitchPreference) root.findPreference(KEY_SHOW_PASSWORD);
354feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
355c5550c2012c505dfb27d9a8da8ecb4787f366283Kenny Root        // Credential storage
35611bd33a564d4ae9a48195ad11dbbd09d80e59b55Emily Bernier        final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
3578877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
358fe7655914de3852093c35600df996824d03ddf63Jim Miller        // Advanced Security features
3592db8c867d170c02bae267503b0111d4076b8df21Doris Ling        initTrustAgentPreference(root, numberOfTrustAgent);
360fe7655914de3852093c35600df996824d03ddf63Jim Miller
361fe7655914de3852093c35600df996824d03ddf63Jim Miller        // The above preferences come and go based on security state, so we need to update
362fe7655914de3852093c35600df996824d03ddf63Jim Miller        // the index. This call is expected to be fairly cheap, but we may want to do something
363fe7655914de3852093c35600df996824d03ddf63Jim Miller        // smarter in the future.
3645c83cfa27805ac0f96d04ac99f0e8fbde20329edMatthew Fritze        final Activity activity = getActivity();
3655c83cfa27805ac0f96d04ac99f0e8fbde20329edMatthew Fritze        FeatureFactory.getFactory(activity).getSearchFeatureProvider().getIndexingManager(activity)
3668a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                .updateFromClassNameResource(SecuritySettings.class.getName(),
3678a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                        true /* includeInSearchResults */);
368fe7655914de3852093c35600df996824d03ddf63Jim Miller
369c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini        PreferenceGroup securityStatusPreferenceGroup =
370c60464e46d867cc962e9bb16307ab6df45ba389bShahriyar Amini                (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS);
371f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling        final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory(
372f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            getActivity(), getPrefContext(), getMetricsCategory(),
373f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            CategoryKey.CATEGORY_SECURITY);
374f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling        int numSecurityStatusPrefs = 0;
375f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling        if (tilePrefs != null && !tilePrefs.isEmpty()) {
376f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            for (Preference preference : tilePrefs) {
377f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                if (!TextUtils.isEmpty(preference.getKey())
378f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    && preference.getKey().startsWith(SECURITY_STATUS_KEY_PREFIX)) {
379f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    // Injected security status settings are placed under the Security status
380f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    // category.
381f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    securityStatusPreferenceGroup.addPreference(preference);
382f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    numSecurityStatusPrefs++;
383f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                } else {
384f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    // Other injected settings are placed under the Security preference screen.
385f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    root.addPreference(preference);
3865c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini                }
387301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang            }
388f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling        }
389301fe80fa7e63c3afe927919e4fa7bb386fa7fa2Fan Zhang
390f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling        if (numSecurityStatusPrefs == 0) {
391f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            root.removePreference(securityStatusPreferenceGroup);
392f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling        } else if (numSecurityStatusPrefs > 0) {
393f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            // Update preference data with tile data. Security feature provider only updates the
394f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            // data if it actually needs to be changed.
395f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling            mSecurityFeatureProvider.updatePreferences(getActivity(), root,
396f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                mDashboardFeatureProvider.getTilesForCategory(
397f2cf2aea3777ef5298bb1131890552f5f619dd30Doris Ling                    CategoryKey.CATEGORY_SECURITY));
3985c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        }
3994774b58b4c0d53f6a436397cb099b95ac08d6923Shahriyar Amini
4004a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller        for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) {
4014a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller            final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]);
4024a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller            if (pref != null) pref.setOnPreferenceChangeListener(this);
4034a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller        }
40481610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling
40581610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling        mLocationcontroller.displayPreference(root);
406ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski        mManageDeviceAdminPreferenceController.updateState(
407ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski                root.findPreference(KEY_MANAGE_DEVICE_ADMIN));
408ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski        mEnterprisePrivacyPreferenceController.displayPreference(root);
409ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski        mEnterprisePrivacyPreferenceController.onResume();
410ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4142db8c867d170c02bae267503b0111d4076b8df21Doris Ling    @VisibleForTesting
4152db8c867d170c02bae267503b0111d4076b8df21Doris Ling    void initTrustAgentPreference(PreferenceScreen root, int numberOfTrustAgent) {
4162db8c867d170c02bae267503b0111d4076b8df21Doris Ling        Preference manageAgents = root.findPreference(KEY_MANAGE_TRUST_AGENTS);
4172db8c867d170c02bae267503b0111d4076b8df21Doris Ling        if (manageAgents != null) {
4182db8c867d170c02bae267503b0111d4076b8df21Doris Ling            if (!mLockPatternUtils.isSecure(MY_USER_ID)) {
4192db8c867d170c02bae267503b0111d4076b8df21Doris Ling                manageAgents.setEnabled(false);
4202db8c867d170c02bae267503b0111d4076b8df21Doris Ling                manageAgents.setSummary(R.string.disabled_because_no_backup_security);
4212db8c867d170c02bae267503b0111d4076b8df21Doris Ling            } else if (numberOfTrustAgent > 0) {
4222db8c867d170c02bae267503b0111d4076b8df21Doris Ling                manageAgents.setSummary(getActivity().getResources().getQuantityString(
4232db8c867d170c02bae267503b0111d4076b8df21Doris Ling                    R.plurals.manage_trust_agents_summary_on,
4242db8c867d170c02bae267503b0111d4076b8df21Doris Ling                    numberOfTrustAgent, numberOfTrustAgent));
4252db8c867d170c02bae267503b0111d4076b8df21Doris Ling            } else {
4262db8c867d170c02bae267503b0111d4076b8df21Doris Ling                manageAgents.setSummary(R.string.manage_trust_agents_summary);
4272db8c867d170c02bae267503b0111d4076b8df21Doris Ling            }
4282db8c867d170c02bae267503b0111d4076b8df21Doris Ling        }
4292db8c867d170c02bae267503b0111d4076b8df21Doris Ling    }
4302db8c867d170c02bae267503b0111d4076b8df21Doris Ling
431cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling    @VisibleForTesting
432cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling    void setLockscreenPreferencesSummary(PreferenceGroup group) {
433cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling        final Preference lockscreenPreferences = group.findPreference(KEY_LOCKSCREEN_PREFERENCES);
434cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling        if (lockscreenPreferences != null) {
435cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling            lockscreenPreferences.setSummary(
436cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling                mLockScreenNotificationPreferenceController.getSummaryResource());
437cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling        }
438cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling    }
439cee83e4bbf80da6193feb65b67a29a2a970fc73eDoris Ling
4407aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi    /*
4417aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi     * Sets the preference as disabled by admin if PASSWORD_QUALITY_MANAGED is set.
4427aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi     * The preference must be a RestrictedPreference.
4437aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi     */
4447aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi    private void disableIfPasswordQualityManaged(String preferenceKey, int userId) {
4457aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        final EnforcedAdmin admin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
4467aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                getActivity(), userId);
4477aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        if (admin != null && mDPM.getPasswordQuality(admin.component, userId) ==
4487aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
4497aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            final RestrictedPreference pref =
4507aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                    (RestrictedPreference) getPreferenceScreen().findPreference(preferenceKey);
4517aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            pref.setDisabledByAdmin(admin);
4527aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        }
4537aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi    }
4547aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi
45552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private void maybeAddFingerprintPreference(PreferenceGroup securityCategory, int userId) {
45640db4bbbb5dd262d801b0247fbfac39c7ab383b0Clara Bayarri        Preference fingerprintPreference =
45740db4bbbb5dd262d801b0247fbfac39c7ab383b0Clara Bayarri                FingerprintSettings.getFingerprintPreferenceForUser(
45852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                        securityCategory.getContext(), userId);
45940db4bbbb5dd262d801b0247fbfac39c7ab383b0Clara Bayarri        if (fingerprintPreference != null) {
46040db4bbbb5dd262d801b0247fbfac39c7ab383b0Clara Bayarri            securityCategory.addPreference(fingerprintPreference);
46194d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller        }
46294d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller    }
46394d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller
4642db8c867d170c02bae267503b0111d4076b8df21Doris Ling    // Return the number of trust agents being added
4652db8c867d170c02bae267503b0111d4076b8df21Doris Ling    private int addTrustAgentSettings(PreferenceGroup securityCategory) {
4665437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos        final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);
467ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal        ArrayList<TrustAgentComponentInfo> agents = getActiveTrustAgents(
468ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal            getActivity(), mTrustAgentManager, mLockPatternUtils, mDPM);
46994d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller        for (int i = 0; i < agents.size(); i++) {
47094d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            final TrustAgentComponentInfo agent = agents.get(i);
471ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka            RestrictedPreference trustAgentPreference =
472ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka                    new RestrictedPreference(securityCategory.getContext());
47394d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            trustAgentPreference.setKey(KEY_TRUST_AGENT);
47494d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            trustAgentPreference.setTitle(agent.title);
47594d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            trustAgentPreference.setSummary(agent.summary);
47694d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            // Create intent for this preference.
47794d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            Intent intent = new Intent();
47894d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            intent.setComponent(agent.componentName);
47994d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            intent.setAction(Intent.ACTION_MAIN);
48094d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            trustAgentPreference.setIntent(intent);
48194d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            // Add preference to the settings menu.
48294d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            securityCategory.addPreference(trustAgentPreference);
483088de47aa8595f9e4142ce0fe6885840b83edc93Adrian Roos
484ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka            trustAgentPreference.setDisabledByAdmin(agent.admin);
485ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka            if (!trustAgentPreference.isDisabledByAdmin() && !hasSecurity) {
48694d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller                trustAgentPreference.setEnabled(false);
48794d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller                trustAgentPreference.setSummary(R.string.disabled_because_no_backup_security);
48894d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller            }
48994d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller        }
4902db8c867d170c02bae267503b0111d4076b8df21Doris Ling        return agents.size();
49194d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller    }
49294d4bd9390b9b9003788a2e779e2b4b256d07c3bJim Miller
4930b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest    /* Return true if a there is a Slot that has Icc.
4940b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest     */
4950b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest    private boolean isSimIccReady() {
4960b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest        TelephonyManager tm = TelephonyManager.getDefault();
4970b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest        final List<SubscriptionInfo> subInfoList =
4980b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest                mSubscriptionManager.getActiveSubscriptionInfoList();
4990b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest
5000b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest        if (subInfoList != null) {
5010b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest            for (SubscriptionInfo subInfo : subInfoList) {
502247842017e2a3b330b13b469ac8f9f3d3fa19a0eSanket Padawe                if (tm.hasIccCard(subInfo.getSimSlotIndex())) {
5030b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest                    return true;
5040b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest                }
5050b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest            }
5060b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest        }
5070b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest
5080b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest        return false;
5090b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest    }
5100b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest
51150e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest    /* Return true if a SIM is ready for locking.
51250e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest     * TODO: consider adding to TelephonyManager or SubscritpionManasger.
51350e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest     */
5140183fb5394f105d544472a52b2b4ba628e01da92Wink Saville    private boolean isSimReady() {
51550e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest        int simState = TelephonyManager.SIM_STATE_UNKNOWN;
5160183fb5394f105d544472a52b2b4ba628e01da92Wink Saville        final List<SubscriptionInfo> subInfoList =
5170183fb5394f105d544472a52b2b4ba628e01da92Wink Saville                mSubscriptionManager.getActiveSubscriptionInfoList();
51850e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest        if (subInfoList != null) {
519ca7566125e00ed267aba831bd1d6d1ad78d90c17Wink Saville            for (SubscriptionInfo subInfo : subInfoList) {
5203ada2ecbe02c98da529aa106e538a4439219cb62Stuart Scott                simState = TelephonyManager.getDefault().getSimState(subInfo.getSimSlotIndex());
52150e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest                if((simState != TelephonyManager.SIM_STATE_ABSENT) &&
52250e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest                            (simState != TelephonyManager.SIM_STATE_UNKNOWN)){
52350e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest                    return true;
52450e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest                }
52550e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest            }
52650e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest        }
52750e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest        return false;
52850e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest    }
52950e6ecacf99c30bf239e68bd54895e3632315063PauloftheWest
530ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal    private static ArrayList<TrustAgentComponentInfo> getActiveTrustAgents(Context context,
531ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal        TrustAgentManager trustAgentManager, LockPatternUtils utils,
532ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal        DevicePolicyManager dpm) {
533ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka        PackageManager pm = context.getPackageManager();
534fe7655914de3852093c35600df996824d03ddf63Jim Miller        ArrayList<TrustAgentComponentInfo> result = new ArrayList<TrustAgentComponentInfo>();
535fe7655914de3852093c35600df996824d03ddf63Jim Miller        List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
536fe7655914de3852093c35600df996824d03ddf63Jim Miller                PackageManager.GET_META_DATA);
5375437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos        List<ComponentName> enabledTrustAgents = utils.getEnabledTrustAgents(MY_USER_ID);
538088de47aa8595f9e4142ce0fe6885840b83edc93Adrian Roos
539ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka        EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(context,
540ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka                DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS, UserHandle.myUserId());
541088de47aa8595f9e4142ce0fe6885840b83edc93Adrian Roos
542fe7655914de3852093c35600df996824d03ddf63Jim Miller        if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) {
543fe7655914de3852093c35600df996824d03ddf63Jim Miller            for (int i = 0; i < resolveInfos.size(); i++) {
544fe7655914de3852093c35600df996824d03ddf63Jim Miller                ResolveInfo resolveInfo = resolveInfos.get(i);
545fe7655914de3852093c35600df996824d03ddf63Jim Miller                if (resolveInfo.serviceInfo == null) continue;
546ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                if (!trustAgentManager.shouldProvideTrust(resolveInfo, pm)) {
547ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                    continue;
548ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                }
549fe7655914de3852093c35600df996824d03ddf63Jim Miller                TrustAgentComponentInfo trustAgentComponentInfo =
550fe7655914de3852093c35600df996824d03ddf63Jim Miller                        TrustAgentUtils.getSettingsComponent(pm, resolveInfo);
551fe7655914de3852093c35600df996824d03ddf63Jim Miller                if (trustAgentComponentInfo.componentName == null ||
552fe7655914de3852093c35600df996824d03ddf63Jim Miller                        !enabledTrustAgents.contains(
553fe7655914de3852093c35600df996824d03ddf63Jim Miller                                TrustAgentUtils.getComponentName(resolveInfo)) ||
554fe7655914de3852093c35600df996824d03ddf63Jim Miller                        TextUtils.isEmpty(trustAgentComponentInfo.title)) continue;
555ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka                if (admin != null && dpm.getTrustAgentConfiguration(
556088de47aa8595f9e4142ce0fe6885840b83edc93Adrian Roos                        null, TrustAgentUtils.getComponentName(resolveInfo)) == null) {
557ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka                    trustAgentComponentInfo.admin = admin;
558088de47aa8595f9e4142ce0fe6885840b83edc93Adrian Roos                }
559fe7655914de3852093c35600df996824d03ddf63Jim Miller                result.add(trustAgentComponentInfo);
560fe7655914de3852093c35600df996824d03ddf63Jim Miller                if (ONLY_ONE_TRUST_AGENT) break;
561fe7655914de3852093c35600df996824d03ddf63Jim Miller            }
562fe7655914de3852093c35600df996824d03ddf63Jim Miller        }
563fe7655914de3852093c35600df996824d03ddf63Jim Miller        return result;
564fe7655914de3852093c35600df996824d03ddf63Jim Miller    }
565fe7655914de3852093c35600df996824d03ddf63Jim Miller
56673c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos    private static CharSequence getActiveTrustAgentLabel(Context context,
56773c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos            TrustAgentManager trustAgentManager, LockPatternUtils utils,
56873c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos            DevicePolicyManager dpm) {
56973c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos        ArrayList<TrustAgentComponentInfo> agents = getActiveTrustAgents(context,
57073c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                trustAgentManager, utils, dpm);
57173c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos        return agents.isEmpty() ? null : agents.get(0).title;
57273c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos    }
57373c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos
5742c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    @Override
57562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    public void onGearClick(GearPreference p) {
57662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        if (KEY_UNLOCK_SET_OR_CHANGE.equals(p.getKey())) {
57762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            startFragment(this, SecuritySubSettings.class.getName(), 0, 0, null);
57862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
57962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    }
58062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
58162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    @Override
582250b9bee685de8f4060dd410f0894c22de1909cfJim Miller    public void onSaveInstanceState(Bundle outState) {
583250b9bee685de8f4060dd410f0894c22de1909cfJim Miller        super.onSaveInstanceState(outState);
584250b9bee685de8f4060dd410f0894c22de1909cfJim Miller        if (mTrustAgentClickIntent != null) {
585250b9bee685de8f4060dd410f0894c22de1909cfJim Miller            outState.putParcelable(TRUST_AGENT_CLICK_INTENT, mTrustAgentClickIntent);
586250b9bee685de8f4060dd410f0894c22de1909cfJim Miller        }
587250b9bee685de8f4060dd410f0894c22de1909cfJim Miller    }
588250b9bee685de8f4060dd410f0894c22de1909cfJim Miller
589250b9bee685de8f4060dd410f0894c22de1909cfJim Miller    @Override
590d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
591afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
592afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
59386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // Make sure we reload the preference hierarchy since some of these settings
59486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // depend on others...
59586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        createPreferenceHierarchy();
59686624a21540e2cd336573a55adb5d3997e4a717dJim Miller
59752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (mVisiblePatternProfile != null) {
59856462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            mVisiblePatternProfile.setChecked(mLockPatternUtils.isVisiblePatternEnabled(
59952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    mProfileChallengeUserId));
60052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
60152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
60256462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        updateUnificationPreference();
60356462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri
604b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mShowPassword != null) {
605b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
606b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                    Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
607b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
608b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
60981610543a9d26cf52a4b8aad0bbdde4aa010e197Doris Ling        mLocationcontroller.updateSummary();
610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61256462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri    private void updateUnificationPreference() {
61356462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        if (mUnifyProfile != null) {
61456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            mUnifyProfile.setChecked(!mLockPatternUtils.isSeparateProfileChallengeEnabled(
61556462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                    mProfileChallengeUserId));
61656462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        }
61756462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri    }
61856462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri
619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
62039b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public boolean onPreferenceTreeClick(Preference preference) {
621afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
622bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
623fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He            // TODO(b/35930129): Remove once existing password can be passed into vold directly.
624fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He            // Currently we need this logic to ensure that the QUIET_MODE is off for any work
625fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He            // profile with unified challenge on FBE-enabled devices. Otherwise, vold would not be
626fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He            // able to complete the operation due to the lack of (old) encryption key.
627fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He            if (mProfileChallengeUserId != UserHandle.USER_NULL
628fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He                    && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)
629fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He                    && StorageManager.isFileEncryptedNativeOnly()) {
630fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He                if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
631fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He                        mProfileChallengeUserId)) {
632fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He                    return false;
633fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He                }
634fc6c0169698075ae6458c2e0a1288ac1b52a407fCharles He            }
63517e9e1933055b207473b488595b2887bfcaea32eJim Miller            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
6365bdf0423f9dbc3cf5970045aacdfef79daacc430Fabrice Di Meglio                    R.string.lock_settings_picker_title, SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
6376934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri        } else if (KEY_UNLOCK_SET_OR_CHANGE_PROFILE.equals(key)) {
63888d523bc5cc011bb0a4efc6abad201b244f5fbb5Bernard Chau            if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
639616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai                    mProfileChallengeUserId)) {
640616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai                return false;
641616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai            }
6426934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri            Bundle extras = new Bundle();
6436934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri            extras.putInt(Intent.EXTRA_USER_ID, mProfileChallengeUserId);
64452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
64552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    R.string.lock_settings_picker_title_profile,
64652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE, extras);
6476f482447b05492906755d91ac4c29ec505a8a544Ido Ofir        } else if (KEY_TRUST_AGENT.equals(key)) {
6486f482447b05492906755d91ac4c29ec505a8a544Ido Ofir            ChooseLockSettingsHelper helper =
6496f482447b05492906755d91ac4c29ec505a8a544Ido Ofir                    new ChooseLockSettingsHelper(this.getActivity(), this);
650250b9bee685de8f4060dd410f0894c22de1909cfJim Miller            mTrustAgentClickIntent = preference.getIntent();
6518a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi            boolean confirmationLaunched = helper.launchConfirmationActivity(
6528a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi                    CHANGE_TRUST_AGENT_SETTINGS, preference.getTitle());
6538a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi            if (!confirmationLaunched&&  mTrustAgentClickIntent != null) {
6546f482447b05492906755d91ac4c29ec505a8a544Ido Ofir                // If this returns false, it means no password confirmation is required.
655250b9bee685de8f4060dd410f0894c22de1909cfJim Miller                startActivity(mTrustAgentClickIntent);
656250b9bee685de8f4060dd410f0894c22de1909cfJim Miller                mTrustAgentClickIntent = null;
6576f482447b05492906755d91ac4c29ec505a8a544Ido Ofir            }
65836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        } else {
65936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            // If we didn't handle it, let preferences handle it.
66039b467482d1bf256a111c757e9b7621c6f523271Jason Monk            return super.onPreferenceTreeClick(preference);
661afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
66236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        return true;
663afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
664afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
665afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
666a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne     * see confirmPatternThenDisableAndClear
667afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
668afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
669d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode, Intent data) {
670afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
671f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        if (requestCode == CHANGE_TRUST_AGENT_SETTINGS && resultCode == Activity.RESULT_OK) {
672250b9bee685de8f4060dd410f0894c22de1909cfJim Miller            if (mTrustAgentClickIntent != null) {
673250b9bee685de8f4060dd410f0894c22de1909cfJim Miller                startActivity(mTrustAgentClickIntent);
674250b9bee685de8f4060dd410f0894c22de1909cfJim Miller                mTrustAgentClickIntent = null;
6756f482447b05492906755d91ac4c29ec505a8a544Ido Ofir            }
676250b9bee685de8f4060dd410f0894c22de1909cfJim Miller            return;
67752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        } else if (requestCode == UNIFY_LOCK_CONFIRM_DEVICE_REQUEST
67852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                && resultCode == Activity.RESULT_OK) {
67952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            mCurrentDevicePassword =
68052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
68152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            launchConfirmProfileLockForUnification();
68252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            return;
68352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        } else if (requestCode == UNIFY_LOCK_CONFIRM_PROFILE_REQUEST
68452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                && resultCode == Activity.RESULT_OK) {
68552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            mCurrentProfilePassword =
68652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
68752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            unifyLocks();
68852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            return;
68926632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra        } else if (requestCode == UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST
69026632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                && resultCode == Activity.RESULT_OK) {
69126632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra            ununifyLocks();
69226632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra            return;
693487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        }
694122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        createPreferenceHierarchy();
695afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
696f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
69752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private void launchConfirmDeviceLockForUnification() {
69852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        final String title = getActivity().getString(
69926632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                R.string.unlock_set_unlock_launch_picker_title);
70052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        final ChooseLockSettingsHelper helper =
70152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                new ChooseLockSettingsHelper(getActivity(), this);
70252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (!helper.launchConfirmationActivity(
70326632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                UNIFY_LOCK_CONFIRM_DEVICE_REQUEST, title, true, MY_USER_ID)) {
70452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            launchConfirmProfileLockForUnification();
70552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
70652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    }
70752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
70852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private void launchConfirmProfileLockForUnification() {
70952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        final String title = getActivity().getString(
71026632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                R.string.unlock_set_unlock_launch_picker_title_profile);
71152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        final ChooseLockSettingsHelper helper =
71252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                new ChooseLockSettingsHelper(getActivity(), this);
71352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (!helper.launchConfirmationActivity(
71452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                UNIFY_LOCK_CONFIRM_PROFILE_REQUEST, title, true, mProfileChallengeUserId)) {
71552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            unifyLocks();
71652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            createPreferenceHierarchy();
71752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
71852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    }
71952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
72052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    private void unifyLocks() {
72152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        int profileQuality =
72252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId);
72352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (profileQuality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
72452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            mLockPatternUtils.saveLockPattern(
72552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    LockPatternUtils.stringToPattern(mCurrentProfilePassword),
72626632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                    mCurrentDevicePassword, MY_USER_ID);
72752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        } else {
72852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            mLockPatternUtils.saveLockPassword(
72952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    mCurrentProfilePassword, mCurrentDevicePassword,
73026632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                    profileQuality, MY_USER_ID);
73152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
732a0a073864a8948fc016bbfd26a04a7374d6a2c73Ricky Wai        mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, false,
733a0a073864a8948fc016bbfd26a04a7374d6a2c73Ricky Wai                mCurrentProfilePassword);
7344af1661bfb62f322b066d7a7fd537e5c1deb989cDaniel U        final boolean profilePatternVisibility =
7354af1661bfb62f322b066d7a7fd537e5c1deb989cDaniel U                mLockPatternUtils.isVisiblePatternEnabled(mProfileChallengeUserId);
7364af1661bfb62f322b066d7a7fd537e5c1deb989cDaniel U        mLockPatternUtils.setVisiblePatternEnabled(profilePatternVisibility, MY_USER_ID);
73752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        mCurrentDevicePassword = null;
73852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        mCurrentProfilePassword = null;
73952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    }
74052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
74156462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri    private void unifyUncompliantLocks() {
7424bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai        mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, false,
7434bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                mCurrentProfilePassword);
74456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
74556462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                R.string.lock_settings_picker_title, SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
74656462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri    }
74756462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri
74826632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra    private void ununifyLocks() {
74926632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra        Bundle extras = new Bundle();
75026632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra        extras.putInt(Intent.EXTRA_USER_ID, mProfileChallengeUserId);
75126632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra        startFragment(this,
75226632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
75326632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                R.string.lock_settings_picker_title_profile,
75426632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE, extras);
75526632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra    }
75626632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra
7570c5a401a58b30041d5fe712d78fccbd47f5b744dMaggie Benthall    @Override
75886624a21540e2cd336573a55adb5d3997e4a717dJim Miller    public boolean onPreferenceChange(Preference preference, Object value) {
759300e920f66c03b390ce738ccf4d4646ffa039d40arete        boolean result = true;
7604a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller        final String key = preference.getKey();
7614a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
76252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        if (KEY_VISIBLE_PATTERN_PROFILE.equals(key)) {
76388d523bc5cc011bb0a4efc6abad201b244f5fbb5Bernard Chau            if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
764616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai                    mProfileChallengeUserId)) {
765616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai                return false;
766616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai            }
76752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            lockPatternUtils.setVisiblePatternEnabled((Boolean) value, mProfileChallengeUserId);
76856462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        } else if (KEY_UNIFICATION.equals(key)) {
76988d523bc5cc011bb0a4efc6abad201b244f5fbb5Bernard Chau            if (Utils.startQuietModeDialogIfNecessary(this.getActivity(), mUm,
770616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai                    mProfileChallengeUserId)) {
771616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai                return false;
772616342bb9471f4dda6bcb1dd5c4e1ad7017e2441Ricky Wai            }
77356462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            if ((Boolean) value) {
77456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                final boolean compliantForDevice =
77556462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                        (mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId)
77656462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
77756462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                        && mLockPatternUtils.isSeparateProfileChallengeAllowedToUnify(
77856462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                mProfileChallengeUserId));
77956462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                UnificationConfirmationDialog dialog =
78056462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                        UnificationConfirmationDialog.newIntance(compliantForDevice);
78156462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                dialog.show(getChildFragmentManager(), TAG_UNIFICATION_DIALOG);
78256462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            } else {
78326632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                final String title = getActivity().getString(
78426632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                        R.string.unlock_set_unlock_launch_picker_title);
78526632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                final ChooseLockSettingsHelper helper =
78626632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                        new ChooseLockSettingsHelper(getActivity(), this);
78726632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                if(!helper.launchConfirmationActivity(
78826632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                        UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST, title, true, MY_USER_ID)) {
78926632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                    ununifyLocks();
79026632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                }
79156462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            }
79252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        } else if (KEY_SHOW_PASSWORD.equals(key)) {
7934a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
7944a9065e6547c24c751b0aecbc151e57bcbcf92eaJim Miller                    ((Boolean) value) ? 1 : 0);
795c04420ce2581627478b59cc5d8b453f1fa329e02Paul Lawrence            lockPatternUtils.setVisiblePasswordEnabled((Boolean) value, MY_USER_ID);
79686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
797300e920f66c03b390ce738ccf4d4646ffa039d40arete        return result;
79886624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
799487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett
80093c0ee52cc5709ec7353fee5a01e4dd9000e42d1rich cannings    @Override
80193c0ee52cc5709ec7353fee5a01e4dd9000e42d1rich cannings    protected int getHelpResource() {
80293c0ee52cc5709ec7353fee5a01e4dd9000e42d1rich cannings        return R.string.help_url_security;
80393c0ee52cc5709ec7353fee5a01e4dd9000e42d1rich cannings    }
80493c0ee52cc5709ec7353fee5a01e4dd9000e42d1rich cannings
805d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    /**
806d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio     * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
807d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio     */
808d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
809d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            new SecuritySearchIndexProvider();
810d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
811fe7655914de3852093c35600df996824d03ddf63Jim Miller    private static class SecuritySearchIndexProvider extends BaseSearchIndexProvider {
812d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
813d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        @Override
814d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        public List<SearchIndexableResource> getXmlResourcesToIndex(
815d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio                Context context, boolean enabled) {
81641d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            final List<SearchIndexableResource> index = new ArrayList<SearchIndexableResource>();
817d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
81841d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
819e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            final ManagedLockPasswordProvider managedPasswordProvider =
820e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    ManagedLockPasswordProvider.get(context, MY_USER_ID);
82141d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            final DevicePolicyManager dpm = (DevicePolicyManager)
82241d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi                    context.getSystemService(Context.DEVICE_POLICY_SERVICE);
82341d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            final UserManager um = UserManager.get(context);
8247aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
825d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
8267aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            // To add option for unlock screen, user's password must not be managed and
8277aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            // must not be unified with managed profile, whose password is managed.
8287aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            if (!isPasswordManaged(MY_USER_ID, context, dpm)
8297aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                    && (profileUserId == UserHandle.USER_NULL
8307aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                            || lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)
8317aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                            || !isPasswordManaged(profileUserId, context, dpm))) {
83241d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi                // Add options for lock/unlock screen
83341d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi                final int resId = getResIdForLockUnlockScreen(context, lockPatternUtils,
834e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        managedPasswordProvider, MY_USER_ID);
83541d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi                index.add(getSearchResource(context, resId));
83641d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            }
837d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
83852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            if (profileUserId != UserHandle.USER_NULL
8397aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                    && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)
8407aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                    && !isPasswordManaged(profileUserId, context, dpm)) {
84141d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi                index.add(getSearchResource(context, getResIdForLockUnlockScreen(context,
842e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        lockPatternUtils, managedPasswordProvider, profileUserId)));
8436934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri            }
8446934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri
84541d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            final SearchIndexableResource sir = getSearchResource(context,
846e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    SecuritySubSettings.getResIdForLockUnlockSubScreen(context, lockPatternUtils,
847e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                            managedPasswordProvider));
84862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            sir.className = SecuritySubSettings.class.getName();
84941d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            index.add(sir);
85062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
851d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            // Append the rest of the settings
85241d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            index.add(getSearchResource(context, R.xml.security_settings_misc));
85341d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi
85441d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            return index;
85541d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi        }
856d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
85741d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi        private SearchIndexableResource getSearchResource(Context context, int xmlResId) {
85841d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            final SearchIndexableResource sir = new SearchIndexableResource(context);
85941d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            sir.xmlResId = xmlResId;
86041d99408cb40f16a0f6833961fa4b77c4d025dafOleksandr Peletskyi            return sir;
861d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        }
862d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
8637aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        private boolean isPasswordManaged(int userId, Context context, DevicePolicyManager dpm) {
8647aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            final EnforcedAdmin admin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
8657aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                    context, userId);
8667aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi            return admin != null && dpm.getPasswordQuality(admin.component, userId) ==
8677aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi                    DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
8687aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi        }
8697aeb56ce6b4090fdc58bf5fc4b22516d53aa003dOleksandr Peletskyi
870d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        @Override
871d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
872d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
873d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            final Resources res = context.getResources();
874d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
875d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            final String screenTitle = res.getString(R.string.security_settings_title);
876d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
877d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            SearchIndexableRaw data = new SearchIndexableRaw(context);
878d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            data.title = screenTitle;
879d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            data.screenTitle = screenTitle;
880d729029b904d43c5c6d06f1d95004fe35445873dFabrice Di Meglio            result.add(data);
881d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
88244879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen            final UserManager um = UserManager.get(context);
883d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
884f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds            // Fingerprint
885ab50807d1edacb4fca5447525bb5270a853eaafcJeff Sharkey            final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(context);
886b528b26ea730fa468a92970f515c312a91bfcf37Jim Miller            if (fpm != null && fpm.isHardwareDetected()) {
887c5fa6e26dffd43d8fab12117d7994d8ab6466048Jim Miller                // This catches the title which can be overloaded in an overlay
888f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds                data = new SearchIndexableRaw(context);
889f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds                data.title = res.getString(R.string.security_settings_fingerprint_preference_title);
890f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds                data.screenTitle = screenTitle;
891f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds                result.add(data);
892c5fa6e26dffd43d8fab12117d7994d8ab6466048Jim Miller                // Fallback for when the above doesn't contain "fingerprint"
893c5fa6e26dffd43d8fab12117d7994d8ab6466048Jim Miller                data = new SearchIndexableRaw(context);
894c5fa6e26dffd43d8fab12117d7994d8ab6466048Jim Miller                data.title = res.getString(R.string.fingerprint_manage_category_title);
895c5fa6e26dffd43d8fab12117d7994d8ab6466048Jim Miller                data.screenTitle = screenTitle;
896c5fa6e26dffd43d8fab12117d7994d8ab6466048Jim Miller                result.add(data);
897f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds            }
898f516e7dde0074416dbf51650cbfb9cc763027b27Julia Reynolds
89952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
900462cce1a4caef7705766c6ebecd353f2e84a8543Clara Bayarri            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
90152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            if (profileUserId != UserHandle.USER_NULL
90252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
90352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                if (lockPatternUtils.getKeyguardStoredPasswordQuality(profileUserId)
90452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                        >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
90552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                        && lockPatternUtils.isSeparateProfileChallengeAllowedToUnify(
90652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                                profileUserId)) {
90752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    data = new SearchIndexableRaw(context);
90852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    data.title = res.getString(R.string.lock_settings_profile_unification_title);
90952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    data.screenTitle = screenTitle;
91052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    result.add(data);
91152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                }
91252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            }
91352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
914fe7655914de3852093c35600df996824d03ddf63Jim Miller            // Advanced
9155437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos            if (lockPatternUtils.isSecure(MY_USER_ID)) {
916ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                final TrustAgentManager trustAgentManager =
917ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                    FeatureFactory.getFactory(context).getSecurityFeatureProvider()
918ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                        .getTrustAgentManager();
919ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                final List<TrustAgentComponentInfo> agents =
920ccae73f228f98bc8412c435a273525514d78843aZachary Iqbal                        getActiveTrustAgents(context, trustAgentManager, lockPatternUtils,
921088de47aa8595f9e4142ce0fe6885840b83edc93Adrian Roos                                context.getSystemService(DevicePolicyManager.class));
922fe7655914de3852093c35600df996824d03ddf63Jim Miller                for (int i = 0; i < agents.size(); i++) {
923fe7655914de3852093c35600df996824d03ddf63Jim Miller                    final TrustAgentComponentInfo agent = agents.get(i);
924fe7655914de3852093c35600df996824d03ddf63Jim Miller                    data = new SearchIndexableRaw(context);
925fe7655914de3852093c35600df996824d03ddf63Jim Miller                    data.title = agent.title;
926fe7655914de3852093c35600df996824d03ddf63Jim Miller                    data.screenTitle = screenTitle;
927fe7655914de3852093c35600df996824d03ddf63Jim Miller                    result.add(data);
928fe7655914de3852093c35600df996824d03ddf63Jim Miller                }
929fe7655914de3852093c35600df996824d03ddf63Jim Miller            }
930d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            return result;
931d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        }
932d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
933d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        @Override
934d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        public List<String> getNonIndexableKeys(Context context) {
9353a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            final List<String> keys = super.getNonIndexableKeys(context);
936d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
937d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
938d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
939d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            // Do not display SIM lock for devices without an Icc card
94044879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen            final UserManager um = UserManager.get(context);
94144879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen            final TelephonyManager tm = TelephonyManager.from(context);
94244879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen            if (!um.isAdminUser() || !tm.hasIccCard()) {
943d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio                keys.add(KEY_SIM_LOCK);
944d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            }
945d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
946fe7655914de3852093c35600df996824d03ddf63Jim Miller            // TrustAgent settings disappear when the user has no primary security.
9475437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos            if (!lockPatternUtils.isSecure(MY_USER_ID)) {
948fe7655914de3852093c35600df996824d03ddf63Jim Miller                keys.add(KEY_TRUST_AGENT);
949fe7655914de3852093c35600df996824d03ddf63Jim Miller                keys.add(KEY_MANAGE_TRUST_AGENTS);
950fe7655914de3852093c35600df996824d03ddf63Jim Miller            }
951ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski
952ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski            if (!(new EnterprisePrivacyPreferenceController(context, null /* lifecycle */))
953ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski                    .isAvailable()) {
954ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski                keys.add(KEY_ENTERPRISE_PRIVACY);
955ba66a0ef09a6bbeb6e7e2cfbef82f15b9b625bc8Bartosz Fabianowski            }
956fe7655914de3852093c35600df996824d03ddf63Jim Miller
9573a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            // Duplicate in special app access
9583a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            keys.add(KEY_MANAGE_DEVICE_ADMIN);
9593a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            // Duplicates between parent-child
9603a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            keys.add((new LocationPreferenceController(context)).getPreferenceKey());
9613a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            keys.add(KEY_ENCRYPTION_AND_CREDENTIALS);
9623a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            keys.add(KEY_SCREEN_PINNING);
9633a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze            keys.add(KEY_LOCATION_SCANNING);
9643a50f5c290971367a2274f7c5da9eafd779e63ecMatthew Fritze
965d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio            return keys;
966d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio        }
967d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio    }
968d1d2f0222443ace71e0cd48c7ad1538627f7a286Fabrice Di Meglio
96962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    public static class SecuritySubSettings extends SettingsPreferenceFragment
97093582995daff3b92b89a24c271fbd719293a41daDoris Ling            implements OnPreferenceChangeListener, OwnerInfoPreferenceController.OwnerInfoCallback {
97162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
97262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
97362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
97462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks";
97562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
97662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        // These switch preferences need special handling since they're not all stored in Settings.
97762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private static final String SWITCH_PREFERENCE_KEYS[] = { KEY_LOCK_AFTER_TIMEOUT,
978b4d55a20505351c90f526f4a29418572674ffb0eClara Bayarri                KEY_VISIBLE_PATTERN, KEY_POWER_INSTANTLY_LOCKS };
97962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
980900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka        private TimeoutListPreference mLockAfter;
98162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private SwitchPreference mVisiblePattern;
98262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private SwitchPreference mPowerButtonInstantlyLocks;
98362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
98473c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos        private TrustAgentManager mTrustAgentManager;
98562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private LockPatternUtils mLockPatternUtils;
98662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private DevicePolicyManager mDPM;
98793582995daff3b92b89a24c271fbd719293a41daDoris Ling        private OwnerInfoPreferenceController mOwnerInfoPreferenceController;
98862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
98962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        @Override
9906507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang        public int getMetricsCategory() {
99162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            return MetricsEvent.SECURITY;
99262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
99362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
99462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        @Override
99562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        public void onCreate(Bundle icicle) {
99662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            super.onCreate(icicle);
99773c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos            SecurityFeatureProvider securityFeatureProvider =
99873c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                    FeatureFactory.getFactory(getActivity()).getSecurityFeatureProvider();
99973c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos            mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
100062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mLockPatternUtils = new LockPatternUtils(getContext());
100162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mDPM = getContext().getSystemService(DevicePolicyManager.class);
100293582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPreferenceController =
100393582995daff3b92b89a24c271fbd719293a41daDoris Ling                new OwnerInfoPreferenceController(getContext(), this, null /* lifecycle */);
10043686ef5e0331398612da213d4bdd7794d0fc7c2bAdrian Roos            createPreferenceHierarchy();
100562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
100662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
100762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        @Override
100862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        public void onResume() {
100962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            super.onResume();
101062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
101162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            createPreferenceHierarchy();
101262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
101362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (mVisiblePattern != null) {
101456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled(
101562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        MY_USER_ID));
101662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
101762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (mPowerButtonInstantlyLocks != null) {
10184f80f221c6f90c7d931caf7146efee483d8cb4ccWilliam Luh                mPowerButtonInstantlyLocks.setChecked(
10194f80f221c6f90c7d931caf7146efee483d8cb4ccWilliam Luh                        mLockPatternUtils.getPowerButtonInstantlyLocks(MY_USER_ID));
102062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
102162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
102293582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPreferenceController.updateSummary();
102362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
102462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
102562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        @Override
102662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        public void onActivityResult(int requestCode, int resultCode, Intent data) {
102762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            super.onActivityResult(requestCode, resultCode, data);
102862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
102962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            createPreferenceHierarchy();
103062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
103162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
103262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private void createPreferenceHierarchy() {
103362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            PreferenceScreen root = getPreferenceScreen();
103462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (root != null) {
103562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                root.removeAll();
103662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
103762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
103862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            final int resid = getResIdForLockUnlockSubScreen(getActivity(),
1039e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    new LockPatternUtils(getContext()),
1040e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    ManagedLockPasswordProvider.get(getContext(), MY_USER_ID));
104162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            addPreferencesFromResource(resid);
104262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
104362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            // lock after preference
1044900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            mLockAfter = (TimeoutListPreference) findPreference(KEY_LOCK_AFTER_TIMEOUT);
104562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (mLockAfter != null) {
104662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                setupLockAfterPreference();
104762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                updateLockAfterPreferenceSummary();
104862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
104962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
105062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            // visible pattern
105162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mVisiblePattern = (SwitchPreference) findPreference(KEY_VISIBLE_PATTERN);
105262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
105362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            // lock instantly on power key press
105462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mPowerButtonInstantlyLocks = (SwitchPreference) findPreference(
105562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    KEY_POWER_INSTANTLY_LOCKS);
105673c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos            CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(),
105773c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                    mTrustAgentManager, mLockPatternUtils, mDPM);
105873c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos            if (mPowerButtonInstantlyLocks != null && !TextUtils.isEmpty(trustAgentLabel)) {
105962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                mPowerButtonInstantlyLocks.setSummary(getString(
106062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        R.string.lockpattern_settings_power_button_instantly_locks_summary,
106173c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                        trustAgentLabel));
106262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
106362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
106493582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPreferenceController.displayPreference(getPreferenceScreen());
106593582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPreferenceController.updateEnableState();
106662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
106762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) {
106862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]);
106962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (pref != null) pref.setOnPreferenceChangeListener(this);
107062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
107162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
107262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
107362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private void setupLockAfterPreference() {
107462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            // Compatible with pre-Froyo
107562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            long currentTimeout = Settings.Secure.getLong(getContentResolver(),
107662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
107762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mLockAfter.setValue(String.valueOf(currentTimeout));
107862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mLockAfter.setOnPreferenceChangeListener(this);
1079900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka            if (mDPM != null) {
1080900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                final EnforcedAdmin admin = RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(
1081900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                        getActivity());
108236cce830b9319985b138432b89ea1022acf68785Ricky Wai                final long adminTimeout = mDPM
108336cce830b9319985b138432b89ea1022acf68785Ricky Wai                        .getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId());
108462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                final long displayTimeout = Math.max(0,
108562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0));
1086900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // This setting is a slave to display timeout when a device policy is enforced.
1087900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // As such, maxLockTimeout = adminTimeout - displayTimeout.
1088900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                // If there isn't enough time, shows "immediately" setting.
1089900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                final long maxTimeout = Math.max(0, adminTimeout - displayTimeout);
1090900adce6ca6fa6e0034b43898ed663f0386ef998Sudheer Shanka                mLockAfter.removeUnusableTimeouts(maxTimeout, admin);
109162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
109262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
109362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
109462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private void updateLockAfterPreferenceSummary() {
109562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            final String summary;
109662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (mLockAfter.isDisabledByAdmin()) {
109762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                summary = getString(R.string.disabled_by_policy_title);
109862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            } else {
109962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                // Update summary message with current value
110062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                long currentTimeout = Settings.Secure.getLong(getContentResolver(),
110162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
110262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                final CharSequence[] entries = mLockAfter.getEntries();
110362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                final CharSequence[] values = mLockAfter.getEntryValues();
110462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                int best = 0;
110562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                for (int i = 0; i < values.length; i++) {
110662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    long timeout = Long.valueOf(values[i].toString());
110762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    if (currentTimeout >= timeout) {
110862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        best = i;
110962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    }
111062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
111162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
111273c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(),
111373c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                        mTrustAgentManager, mLockPatternUtils, mDPM);
111473c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                if (!TextUtils.isEmpty(trustAgentLabel)) {
111562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    if (Long.valueOf(values[best].toString()) == 0) {
111662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        summary = getString(R.string.lock_immediately_summary_with_exception,
111773c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                                trustAgentLabel);
111862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    } else {
111962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        summary = getString(R.string.lock_after_timeout_summary_with_exception,
112073c52f291d3a0a6230e18911fc8007375bd4c34bAdrian Roos                                entries[best], trustAgentLabel);
112162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    }
112262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                } else {
112362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    summary = getString(R.string.lock_after_timeout_summary, entries[best]);
112462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
112562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
112662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mLockAfter.setSummary(summary);
112762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
112862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
112993582995daff3b92b89a24c271fbd719293a41daDoris Ling        @Override
113093582995daff3b92b89a24c271fbd719293a41daDoris Ling        public void onOwnerInfoUpdated() {
113193582995daff3b92b89a24c271fbd719293a41daDoris Ling            mOwnerInfoPreferenceController.updateSummary();
113262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
113362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
113462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private static int getResIdForLockUnlockSubScreen(Context context,
1135e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                LockPatternUtils lockPatternUtils,
1136e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                ManagedLockPasswordProvider managedPasswordProvider) {
113762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (lockPatternUtils.isSecure(MY_USER_ID)) {
113862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                switch (lockPatternUtils.getKeyguardStoredPasswordQuality(MY_USER_ID)) {
113962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
114062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        return R.xml.security_settings_pattern_sub;
114162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
114262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
114362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        return R.xml.security_settings_pin_sub;
114462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
114562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
114662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
114762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        return R.xml.security_settings_password_sub;
1148e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
1149e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        return managedPasswordProvider.getResIdForLockUnlockSubScreen();
115062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
115162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            } else if (!lockPatternUtils.isLockScreenDisabled(MY_USER_ID)) {
115262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                return R.xml.security_settings_slide_sub;
115362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
115462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            return 0;
115562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
115662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos
115762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        @Override
115862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        public boolean onPreferenceChange(Preference preference, Object value) {
115962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            String key = preference.getKey();
116062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) {
116162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                mLockPatternUtils.setPowerButtonInstantlyLocks((Boolean) value, MY_USER_ID);
116262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            } else if (KEY_LOCK_AFTER_TIMEOUT.equals(key)) {
116362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                int timeout = Integer.parseInt((String) value);
116462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                try {
116562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    Settings.Secure.putInt(getContentResolver(),
116662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                            Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout);
116762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                } catch (NumberFormatException e) {
116862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e);
116962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
1170de4f471e558620f2cce57b4160e3c728baef2fbbJulia Reynolds                setupLockAfterPreference();
117162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                updateLockAfterPreferenceSummary();
117262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            } else if (KEY_VISIBLE_PATTERN.equals(key)) {
117362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                mLockPatternUtils.setVisiblePatternEnabled((Boolean) value, MY_USER_ID);
117462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
117562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            return true;
117662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        }
117762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos    }
117852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
11791e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhang    public static class UnificationConfirmationDialog extends InstrumentedDialogFragment {
118056462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        private static final String EXTRA_COMPLIANT = "compliant";
118152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
118256462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri        public static UnificationConfirmationDialog newIntance(boolean compliant) {
118352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            UnificationConfirmationDialog dialog = new UnificationConfirmationDialog();
118456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            Bundle args = new Bundle();
118556462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            args.putBoolean(EXTRA_COMPLIANT, compliant);
118656462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            dialog.setArguments(args);
118752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            return dialog;
118852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
118952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
119052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        @Override
119152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        public void show(FragmentManager manager, String tag) {
119252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            if (manager.findFragmentByTag(tag) == null) {
119352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                // Prevent opening multiple dialogs if tapped on button quickly
119452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                super.show(manager, tag);
119552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            }
119652681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
119752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
119852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        @Override
119952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        public Dialog onCreateDialog(Bundle savedInstanceState) {
120052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment());
120156462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri            final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT);
120252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri            return new AlertDialog.Builder(getActivity())
120352681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    .setTitle(R.string.lock_settings_profile_unification_dialog_title)
120456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                    .setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body
120556462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                            : R.string.lock_settings_profile_unification_dialog_uncompliant_body)
120626632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                    .setPositiveButton(
120726632097ba7ae5d9a4fb3db08be588e686520f55Mahaver Chopra                            compliant ? R.string.lock_settings_profile_unification_dialog_confirm
120856462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                            : R.string.lock_settings_profile_unification_dialog_uncompliant_confirm,
120952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                            new DialogInterface.OnClickListener() {
121052681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                                @Override
121152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                                public void onClick(DialogInterface dialog, int whichButton) {
121256462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                    if (compliant) {
121356462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                        parentFragment.launchConfirmDeviceLockForUnification();
121456462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                    }    else {
121556462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                        parentFragment.unifyUncompliantLocks();
121656462d668a7a81ef17c01b1ca70a9d462eae79d2Clara Bayarri                                    }
121752681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                                }
121852681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                            }
121952681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    )
1220f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai                    .setNegativeButton(R.string.cancel, null)
122152681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri                    .create();
122252681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri        }
1223f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai
1224f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai        @Override
1225f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai        public void onDismiss(DialogInterface dialog) {
1226f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai            super.onDismiss(dialog);
1227f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai            ((SecuritySettings) getParentFragment()).updateUnificationPreference();
1228f6fc22092a8dede9b983b5e30cab2979193bf0c6Ricky Wai        }
12291e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhang
12301e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhang        @Override
12311e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhang        public int getMetricsCategory() {
12321e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhang            return MetricsEvent.DIALOG_UNIFICATION_CONFIRMATION;
12331e516287bd0c910f83d2ead28bf67e26dfbead86Fan Zhang        }
123452681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri    }
123552681ece0454f830401388a71f0db4ff8b1d126bClara Bayarri
12365c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    static class SummaryProvider implements SummaryLoader.SummaryProvider {
12375c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini
12385c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        private final Context mContext;
12395c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        private final SummaryLoader mSummaryLoader;
12405c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini
12415c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
12425c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini            mContext = context;
12435c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini            mSummaryLoader = summaryLoader;
12445c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        }
12455c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini
12465c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        @Override
12475c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        public void setListening(boolean listening) {
124848ffe67611c68d966795bf95e4ec5438b7a2db27Doris Ling            if (listening) {
124948ffe67611c68d966795bf95e4ec5438b7a2db27Doris Ling                final FingerprintManager fpm =
125048ffe67611c68d966795bf95e4ec5438b7a2db27Doris Ling                    Utils.getFingerprintManagerOrNull(mContext);
12512cab298f13233a0fb2bf27d5fa5fc5271c33843bFan Zhang                if (fpm != null && fpm.isHardwareDetected()) {
12522cab298f13233a0fb2bf27d5fa5fc5271c33843bFan Zhang                    mSummaryLoader.setSummary(this,
125348ffe67611c68d966795bf95e4ec5438b7a2db27Doris Ling                        mContext.getString(R.string.security_dashboard_summary));
12542cab298f13233a0fb2bf27d5fa5fc5271c33843bFan Zhang                } else {
125548ffe67611c68d966795bf95e4ec5438b7a2db27Doris Ling                    mSummaryLoader.setSummary(this, mContext.getString(
125648ffe67611c68d966795bf95e4ec5438b7a2db27Doris Ling                        R.string.security_dashboard_summary_no_fingerprint));
12575c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini                }
12585c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini            }
12595c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        }
12605c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    }
12615c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini
12625c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
12635c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini            new SummaryLoader.SummaryProviderFactory() {
12645c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        @Override
12655c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
12665c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini                SummaryLoader summaryLoader) {
12675c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini            return new SummaryProvider(activity, summaryLoader);
12685c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini        }
12695c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini    };
12705c1ad614a68d4e1287d4161651a60eb6748637b1Shahriyar Amini
1271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1272