SecuritySettings.java revision f04211443e9cae815ad89f821b6ec83ec2790c0c
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
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2086624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
2186624a21540e2cd336573a55adb5d3997e4a717dJim Miller
22487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millettimport android.app.Activity;
232c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.app.AlertDialog;
244037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
258227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetHost;
268227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetManager;
278227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetProviderInfo;
288227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.content.ActivityNotFoundException;
298227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.content.ComponentName;
30abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
312c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.content.DialogInterface;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
33bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.PackageManager;
34bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.ResolveInfo;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
36bb06a427eb471227cf42a8078a54ca0581309493Dianne Hackbornimport android.os.UserHandle;
37edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasaniimport android.os.Vibrator;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
3986624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.preference.ListPreference;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
41f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.Preference.OnPreferenceChangeListener;
42f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.PreferenceGroup;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
459cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore;
4656e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager;
4786624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log;
488227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.widget.Toast;
49f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
50a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
51a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne
5286624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList;
53bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport java.util.List;
545ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings.
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
5836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Millerpublic class SecuritySettings extends SettingsPreferenceFragment
592c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        implements OnPreferenceChangeListener, DialogInterface.OnClickListener {
608227e303850d7c1162c62947b70d0592432b455eMichael Jurka    static final String TAG = "SecuritySettings";
616f8fb436178d12d11d6ab59671168f0603bdbdcbJason parks
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Lock Settings
6391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
64091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final String KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET =
65091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            "choose_lockscreen_status_widget";
668227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final String KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET =
678227e303850d7c1162c62947b70d0592432b455eMichael Jurka            "choose_user_selected_lockscreen_widget";
68487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING =
69487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            "biometric_weak_improve_matching";
70a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett    private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness";
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_LOCK_ENABLED = "lockenabled";
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
739e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller    private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback";
74edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani    private static final String KEY_SECURITY_CATEGORY = "security_category";
75f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings    private static final String KEY_DEVICE_ADMIN_CATEGORY = "device_admin_category";
7691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
778227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final String EXTRA_NO_WIDGET = "com.android.settings.NO_WIDGET";
78091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final String EXTRA_DEFAULT_WIDGET = "com.android.settings.DEFAULT_WIDGET";
7991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
80790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124;
814a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125;
82091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_PICK_USER_SELECTED_APPWIDGET = 126;
83091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_PICK_STATUS_APPWIDGET = 127;
84091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_CREATE_USER_SELECTED_APPWIDGET = 128;
85091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_CREATE_STATUS_APPWIDGET = 129;
867031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    // Misc Settings
8891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SIM_LOCK = "sim_lock";
8991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SHOW_PASSWORD = "show_password";
9091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_RESET_CREDENTIALS = "reset_credentials";
912c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";
92d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications";
93071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller    private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks";
947fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani    private static final String KEY_CREDENTIALS_MANAGER = "credentials_management";
95bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
9647d380f1e6c823cea444004cb799d4c791145cc6Jim Miller
97abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    DevicePolicyManager mDPM;
98122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
9900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
1008227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private Preference mUserSelectedWidget;
101122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    private LockPatternUtils mLockPatternUtils;
10286624a21540e2cd336573a55adb5d3997e4a717dJim Miller    private ListPreference mLockAfter;
10336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller
1044a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett    private CheckBoxPreference mBiometricWeakLiveliness;
10591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mVisiblePattern;
10691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mTactileFeedback;
10791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
10891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mShowPassword;
10991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
11091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private Preference mResetCredentials;
1115ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
1122c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private CheckBoxPreference mToggleAppInstallation;
1132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private DialogInterface mWarnInstallApps;
114d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private CheckBoxPreference mToggleVerifyApps;
115071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller    private CheckBoxPreference mPowerButtonInstantlyLocks;
1162c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
1177fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani    private boolean mIsPrimary;
1187fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
120d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
122122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
123d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mLockPatternUtils = new LockPatternUtils(getActivity());
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
125abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
126122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
127d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
12802cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    }
1295ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
13191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        PreferenceScreen root = getPreferenceScreen();
132122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (root != null) {
133122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            root.removeAll();
134122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
135122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        addPreferencesFromResource(R.xml.security_settings);
13691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        root = getPreferenceScreen();
137122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
13836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        // Add options for lock/unlock screen
13936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        int resid = 0;
140122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (!mLockPatternUtils.isSecure()) {
14136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            if (mLockPatternUtils.isLockScreenDisabled()) {
14236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_lockscreen;
14336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            } else {
14436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_chooser;
14536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            }
1460fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett        } else if (mLockPatternUtils.usingBiometricWeak() &&
1470fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett                mLockPatternUtils.isBiometricWeakInstalled()) {
1485541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            resid = R.xml.security_settings_biometric_weak;
149122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else {
150af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
151af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
15236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pattern;
153af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
154af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
15536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pin;
156af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
157af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
158af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
15957fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
16036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_password;
161af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
16200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
163122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
16436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        addPreferencesFromResource(resid);
165122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
1664112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
1674112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks        // Add options for device encryption
168f8217304073b5cd13823a0602568394be93bf310Jason parks        DevicePolicyManager dpm =
169f8217304073b5cd13823a0602568394be93bf310Jason parks                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
1704112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
1717fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mIsPrimary = UserHandle.myUserId() == UserHandle.USER_OWNER;
1727fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
1737fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mIsPrimary) {
174b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            switch (dpm.getStorageEncryptionStatus()) {
175b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
176b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                // The device is currently encrypted.
177b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                addPreferencesFromResource(R.xml.security_settings_encrypted);
178b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                break;
179b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
180b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                // This device supports encryption but isn't encrypted.
181b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                addPreferencesFromResource(R.xml.security_settings_unencrypted);
182b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                break;
183b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            }
1844112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks        }
1854112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
18686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // lock after preference
18791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT);
18891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        if (mLockAfter != null) {
18991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            setupLockAfterPreference();
19091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            updateLockAfterPreferenceSummary();
19191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        }
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
193a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        // biometric weak liveliness
194a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        mBiometricWeakLiveliness =
1954a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS);
196a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
19891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN);
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
200071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        // lock instantly on power key press
201071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        mPowerButtonInstantlyLocks = (CheckBoxPreference) root.findPreference(
202071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller                KEY_POWER_INSTANTLY_LOCKS);
203071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller
2048123493ef905a210bd00b0c623459f4c86505298Danielle Millett        // don't display visible pattern if biometric and backup is not pattern
2058123493ef905a210bd00b0c623459f4c86505298Danielle Millett        if (resid == R.xml.security_settings_biometric_weak &&
2068123493ef905a210bd00b0c623459f4c86505298Danielle Millett                mLockPatternUtils.getKeyguardStoredPasswordQuality() !=
2078123493ef905a210bd00b0c623459f4c86505298Danielle Millett                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
2088123493ef905a210bd00b0c623459f4c86505298Danielle Millett            PreferenceGroup securityCategory = (PreferenceGroup)
2098123493ef905a210bd00b0c623459f4c86505298Danielle Millett                    root.findPreference(KEY_SECURITY_CATEGORY);
2108123493ef905a210bd00b0c623459f4c86505298Danielle Millett            if (securityCategory != null && mVisiblePattern != null) {
2118123493ef905a210bd00b0c623459f4c86505298Danielle Millett                securityCategory.removePreference(root.findPreference(KEY_VISIBLE_PATTERN));
2128123493ef905a210bd00b0c623459f4c86505298Danielle Millett            }
2138123493ef905a210bd00b0c623459f4c86505298Danielle Millett        }
2148123493ef905a210bd00b0c623459f4c86505298Danielle Millett
215122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        // tactile feedback. Should be common to all unlock preference screens.
21691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mTactileFeedback = (CheckBoxPreference) root.findPreference(KEY_TACTILE_FEEDBACK_ENABLED);
217edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
218edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            PreferenceGroup securityCategory = (PreferenceGroup)
21991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                    root.findPreference(KEY_SECURITY_CATEGORY);
220edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            if (securityCategory != null && mTactileFeedback != null) {
221edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani                securityCategory.removePreference(mTactileFeedback);
222edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            }
223edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        }
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2257fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mUserSelectedWidget = root.findPreference(KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET);
2267fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mUserSelectedWidget != null) {
2277fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
2287fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            int appWidgetId = getStatusAppWidgetId();
2297fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            if (appWidgetId == -1) {
2307fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_default));
2317fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            } else {
2327fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
2337fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                if (appWidget != null) {
2347fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                    mUserSelectedWidget.setSummary(appWidget.label);
2357fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                }
2367fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            }
2377fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        }
2387fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
2397fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mUserSelectedWidget = root.findPreference(KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET);
2407fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mUserSelectedWidget != null) {
2417fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
2427fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            int appWidgetId = getUserSelectedAppWidgetId();
2437fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            if (appWidgetId == -1) {
2447fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_none));
2457fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            } else {
2467fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
2477fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                if (appWidget != null) {
2487fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                    mUserSelectedWidget.setSummary(appWidget.label);
2497fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                }
2507fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            }
251b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
252b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani
25391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Append the rest of the settings
25491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        addPreferencesFromResource(R.xml.security_settings_misc);
25591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
2565c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani        // Do not display SIM lock for devices without an Icc card
257cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville        TelephonyManager tm = TelephonyManager.getDefault();
2587fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (!mIsPrimary || !tm.hasIccCard()) {
25991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            root.removePreference(root.findPreference(KEY_SIM_LOCK));
260a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo        } else {
261a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            // Disable SIM lock if sim card is missing or unknown
262a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            if ((TelephonyManager.getDefault().getSimState() ==
263a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                                 TelephonyManager.SIM_STATE_ABSENT) ||
264a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                (TelephonyManager.getDefault().getSimState() ==
265a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                                 TelephonyManager.SIM_STATE_UNKNOWN)) {
266a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                root.findPreference(KEY_SIM_LOCK).setEnabled(false);
267a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            }
268386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
27091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Show password
27191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD);
272feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
2737fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        // Credential storage, only for primary user
2747fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mIsPrimary) {
2757fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS);
2767fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        } else {
2777fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            removePreference(KEY_CREDENTIALS_MANAGER);
2787fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        }
2798877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
2802c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mToggleAppInstallation = (CheckBoxPreference) findPreference(
2812c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                KEY_TOGGLE_INSTALL_APPLICATIONS);
2822c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
2832c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
2847fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        // Package verification, only visible to primary user and if enabled
2857fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS);
2867fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mIsPrimary && showVerifierSetting()) {
287bbc3045a265238fd80547dd9bb61f6801a038886rich cannings            if (isVerifierInstalled()) {
288bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                mToggleVerifyApps.setChecked(isVerifyAppsEnabled());
289bbc3045a265238fd80547dd9bb61f6801a038886rich cannings            } else {
290bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                mToggleVerifyApps.setChecked(false);
291bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                mToggleVerifyApps.setEnabled(false);
292bbc3045a265238fd80547dd9bb61f6801a038886rich cannings            }
293f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings        } else {
294f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings            PreferenceGroup deviceAdminCategory= (PreferenceGroup)
295f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings                    root.findPreference(KEY_DEVICE_ADMIN_CATEGORY);
296f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings            if (deviceAdminCategory != null) {
297f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings                deviceAdminCategory.removePreference(mToggleVerifyApps);
298f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings            } else {
299f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings                mToggleVerifyApps.setEnabled(false);
300f04211443e9cae815ad89f821b6ec83ec2790c0crich cannings            }
3018227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
3028227e303850d7c1162c62947b70d0592432b455eMichael Jurka
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
306091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private int getStatusAppWidgetId() {
307091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        int appWidgetId = -1;
308091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        String appWidgetIdString = Settings.Secure.getString(
309091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                getContentResolver(), Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID);
310091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        if (appWidgetIdString != null) {;
311091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            appWidgetId = (int) Integer.decode(appWidgetIdString);
312091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        }
313091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        return appWidgetId;
314091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    }
315091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka
3163028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka    private int getUserSelectedAppWidgetId() {
3173028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        int appWidgetId = -1;
3183028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        String appWidgetIdString = Settings.Secure.getString(
3193028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                getContentResolver(), Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID);
3203028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        if (appWidgetIdString != null) {;
3213028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka            appWidgetId = (int) Integer.decode(appWidgetIdString);
3223028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        }
3233028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        return appWidgetId;
3243028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka    }
3253028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka
3262c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private boolean isNonMarketAppsAllowed() {
3275a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate        return Settings.Global.getInt(getContentResolver(),
3285a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate                                      Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;
3292c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3302c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3312c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private void setNonMarketAppsAllowed(boolean enabled) {
3322c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        // Change the system setting
3335a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate        Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,
3342c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                                enabled ? 1 : 0);
3352c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3362c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
337d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private boolean isVerifyAppsEnabled() {
338d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        return Settings.Global.getInt(getContentResolver(),
339d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings                                      Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) > 0;
340d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    }
341d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings
342bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    private boolean isVerifierInstalled() {
343bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final PackageManager pm = getPackageManager();
344bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
345bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        verification.setType(PACKAGE_MIME_TYPE);
346bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
347bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0);
348bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        return (receivers.size() > 0) ? true : false;
349bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    }
350bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings
351bbc3045a265238fd80547dd9bb61f6801a038886rich cannings    private boolean showVerifierSetting() {
352bbc3045a265238fd80547dd9bb61f6801a038886rich cannings        return Settings.Global.getInt(getContentResolver(),
353bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                                      Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0;
354bbc3045a265238fd80547dd9bb61f6801a038886rich cannings    }
355bbc3045a265238fd80547dd9bb61f6801a038886rich cannings
3562c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private void warnAppInstallation() {
3572c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        // TODO: DialogFragment?
3582c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle(
3592c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                getResources().getString(R.string.error_title))
3602c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
3612c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setMessage(getResources().getString(R.string.install_all_warning))
3622c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setPositiveButton(android.R.string.yes, this)
3632c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setNegativeButton(android.R.string.no, null)
3642c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .show();
3652c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3662c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3672c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    public void onClick(DialogInterface dialog, int which) {
3682c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON_POSITIVE) {
3692c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            setNonMarketAppsAllowed(true);
370b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            if (mToggleAppInstallation != null) {
371b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                mToggleAppInstallation.setChecked(true);
372b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            }
3732c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        }
3742c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3752c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3762c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    @Override
3772c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    public void onDestroy() {
3782c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        super.onDestroy();
3792c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        if (mWarnInstallApps != null) {
3802c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            mWarnInstallApps.dismiss();
3812c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        }
3822c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3832c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
38491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private void setupLockAfterPreference() {
38591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Compatible with pre-Froyo
38691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
38791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
38891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setValue(String.valueOf(currentTimeout));
38991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setOnPreferenceChangeListener(this);
39091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final long adminTimeout = (mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0);
39191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final long displayTimeout = Math.max(0,
39291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0));
39391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        if (adminTimeout > 0) {
39491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // This setting is a slave to display timeout when a device policy is enforced.
39591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // As such, maxLockTimeout = adminTimeout - displayTimeout.
39691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // If there isn't enough time, shows "immediately" setting.
39791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            disableUnusableTimeouts(Math.max(0, adminTimeout - displayTimeout));
39886624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
39986624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
40086624a21540e2cd336573a55adb5d3997e4a717dJim Miller
401c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    private void updateLockAfterPreferenceSummary() {
402c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        // Update summary message with current value
403c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
40458bca8f15fbdc9e621b3c259a50ecf41c00e64c3Amith Yamasani                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
405c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] entries = mLockAfter.getEntries();
406c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] values = mLockAfter.getEntryValues();
407c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        int best = 0;
408c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        for (int i = 0; i < values.length; i++) {
409c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            long timeout = Long.valueOf(values[i].toString());
410c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            if (currentTimeout >= timeout) {
411c9787070bab332b80676b745a44dd8ee4d72073dJim Miller                best = i;
412c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            }
413c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        }
41491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setSummary(getString(R.string.lock_after_timeout_summary, entries[best]));
415c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    }
416c9787070bab332b80676b745a44dd8ee4d72073dJim Miller
41791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private void disableUnusableTimeouts(long maxTimeout) {
41891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final CharSequence[] entries = mLockAfter.getEntries();
41991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final CharSequence[] values = mLockAfter.getEntryValues();
42086624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
42186624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
42286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        for (int i = 0; i < values.length; i++) {
42386624a21540e2cd336573a55adb5d3997e4a717dJim Miller            long timeout = Long.valueOf(values[i].toString());
42486624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (timeout <= maxTimeout) {
42586624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedEntries.add(entries[i]);
42686624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedValues.add(values[i]);
42786624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
42886624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
42986624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) {
43091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            mLockAfter.setEntries(
43186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedEntries.toArray(new CharSequence[revisedEntries.size()]));
43291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            mLockAfter.setEntryValues(
43386624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedValues.toArray(new CharSequence[revisedValues.size()]));
43491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            final int userPreference = Integer.valueOf(mLockAfter.getValue());
43586624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (userPreference <= maxTimeout) {
43691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                mLockAfter.setValue(String.valueOf(userPreference));
43786624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } else {
43886624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // There will be no highlighted selection since nothing in the list matches
43986624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // maxTimeout. The user can still select anything less than maxTimeout.
44086624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // TODO: maybe append maxTimeout to the list and mark selected.
44186624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
44286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
44391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setEnabled(revisedEntries.size() > 0);
44486624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
44586624a21540e2cd336573a55adb5d3997e4a717dJim Miller
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
447d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
45086624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // Make sure we reload the preference hierarchy since some of these settings
45186624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // depend on others...
45286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        createPreferenceHierarchy();
45386624a21540e2cd336573a55adb5d3997e4a717dJim Miller
45400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
455a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        if (mBiometricWeakLiveliness != null) {
4564a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            mBiometricWeakLiveliness.setChecked(
4574a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    lockPatternUtils.isBiometricWeakLivelinessEnabled());
458a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        }
459122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mVisiblePattern != null) {
460122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled());
461122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
462122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mTactileFeedback != null) {
463122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled());
464122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
465071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        if (mPowerButtonInstantlyLocks != null) {
466071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller            mPowerButtonInstantlyLocks.setChecked(lockPatternUtils.getPowerButtonInstantlyLocks());
467071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        }
4687031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
469b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mShowPassword != null) {
470b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
471b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                    Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
472b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
473b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
474d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        KeyStore.State state = KeyStore.getInstance().state();
475b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mResetCredentials != null) {
476b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mResetCredentials.setEnabled(state != KeyStore.State.UNINITIALIZED);
477b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4808227e303850d7c1162c62947b70d0592432b455eMichael Jurka    void startActivityForResultSafely(Intent intent, int requestCode) {
4818227e303850d7c1162c62947b70d0592432b455eMichael Jurka        try {
4828227e303850d7c1162c62947b70d0592432b455eMichael Jurka            startActivityForResult(intent, requestCode);
4838227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } catch (ActivityNotFoundException e) {
4848227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
4858227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } catch (SecurityException e) {
4868227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
4878227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Log.e(TAG, "Settings does not have the permission to launch " + intent, e);
4888227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
4898227e303850d7c1162c62947b70d0592432b455eMichael Jurka    }
4908227e303850d7c1162c62947b70d0592432b455eMichael Jurka
49116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka    private void launchPickActivityIntent(int featuresFilter, int defaultLabelId, int defaultIconId,
492eeb464ae43180624b7a45c50f643802dda56f2b0Adam Cohen            ComponentName defaultComponentName, String defaultTag, int widgetType) {
49316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        // Create intent to pick widget
49416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
49516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
49616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        // Found in KeyguardHostView.java
49716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        final int KEYGUARD_HOST_ID = 0x4B455947;
49816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
49916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        if (appWidgetId != -1) {
50016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
50116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
50216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
50316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                    AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
50416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            if (featuresFilter != AppWidgetProviderInfo.WIDGET_FEATURES_NONE) {
50516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER, featuresFilter);
50616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            }
50716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
50816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            // Add an entry for "none" to let someone select no widget
50916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo();
51016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
51116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            defaultInfo.label = getResources().getString(defaultLabelId);
51216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            defaultInfo.icon = defaultIconId;
51316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            defaultInfo.provider = defaultComponentName;
51416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            extraInfos.add(defaultInfo);
51516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
51616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
51716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            Bundle b = new Bundle();
51816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            b.putBoolean(defaultTag, true);
51916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            extraExtras.add(b);
52016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
52116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            // Launch the widget picker
52216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
52316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
52416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
525eeb464ae43180624b7a45c50f643802dda56f2b0Adam Cohen            startActivityForResult(pickIntent, widgetType);
52616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        } else {
52716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
52816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        }
52916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka    }
53016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
53185d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen    private Intent getBaseIntent() {
53285d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        Intent baseIntent = new Intent(Intent.ACTION_MAIN, null);
53385d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        baseIntent.addCategory(Intent.CATEGORY_DEFAULT);
53485d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen
53585d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        Bundle options = new Bundle();
53685d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
53785d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen                AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
53885d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        baseIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);
53985d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        return baseIntent;
54085d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen    }
54185d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen
542afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
543a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
544afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
547bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
54817e9e1933055b207473b488595b2887bfcaea32eJim Miller            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
54917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
5508227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
55116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_NONE,
552eeb464ae43180624b7a45c50f643802dda56f2b0Adam Cohen                    R.string.widget_none, 0, new ComponentName("", ""), EXTRA_NO_WIDGET,
553eeb464ae43180624b7a45c50f643802dda56f2b0Adam Cohen                    REQUEST_PICK_USER_SELECTED_APPWIDGET);
554091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        } else if (KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET.equals(key)) {
55516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            int defaultIconId;
55616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ComponentName clock = new ComponentName(
55716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                    "com.google.android.deskclock", "com.android.deskclock.DeskClock");
55816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            try {
55916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                defaultIconId = getActivity().getPackageManager().getActivityInfo(clock, 0).icon;
56016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            } catch (PackageManager.NameNotFoundException e) {
56116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                defaultIconId = 0;
5628227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
56316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_STATUS,
564eeb464ae43180624b7a45c50f643802dda56f2b0Adam Cohen                    R.string.widget_default, defaultIconId, clock, EXTRA_DEFAULT_WIDGET,
565eeb464ae43180624b7a45c50f643802dda56f2b0Adam Cohen                    REQUEST_PICK_STATUS_APPWIDGET);
566487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
567487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            ChooseLockSettingsHelper helper =
568487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                    new ChooseLockSettingsHelper(this.getActivity(), this);
569487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            if (!helper.launchConfirmationActivity(
570790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                    CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST, null, null)) {
571790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // If this returns false, it means no password confirmation is required, so
572790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // go ahead and start improve.
573790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // Note: currently a backup is required for biometric_weak so this code path
574790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // can't be reached, but is here in case things change in the future
575790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                startBiometricWeakImprove();
576487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            }
5774a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett        } else if (KEY_BIOMETRIC_WEAK_LIVELINESS.equals(key)) {
5784a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            if (isToggled(preference)) {
5794a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                lockPatternUtils.setBiometricWeakLivelinessEnabled(true);
5804a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            } else {
5814a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // In this case the user has just unchecked the checkbox, but this action requires
5824a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // them to confirm their password.  We need to re-check the checkbox until
5834a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // they've confirmed their password
5844a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                mBiometricWeakLiveliness.setChecked(true);
5854a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                ChooseLockSettingsHelper helper =
5864a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                        new ChooseLockSettingsHelper(this.getActivity(), this);
5874a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                if (!helper.launchConfirmationActivity(
5884a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                                CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) {
5894a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // If this returns false, it means no password confirmation is required, so
5904a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // go ahead and uncheck it here.
5914a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // Note: currently a backup is required for biometric_weak so this code path
5924a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // can't be reached, but is here in case things change in the future
5934a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
5944a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    mBiometricWeakLiveliness.setChecked(false);
5954a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                }
5964a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            }
597122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else if (KEY_LOCK_ENABLED.equals(key)) {
59800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setLockPatternEnabled(isToggled(preference));
599afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
60000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
601afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
60200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
603071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        } else if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) {
604071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller            lockPatternUtils.setPowerButtonInstantlyLocks(isToggled(preference));
605afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
606afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
6082c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        } else if (preference == mToggleAppInstallation) {
6092c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            if (mToggleAppInstallation.isChecked()) {
6102c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                mToggleAppInstallation.setChecked(false);
6112c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                warnAppInstallation();
6122c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            } else {
6132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                setNonMarketAppsAllowed(false);
6142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            }
615d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        } else if (KEY_TOGGLE_VERIFY_APPLICATIONS.equals(key)) {
616d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings            Settings.Global.putInt(getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE,
617d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings                    mToggleVerifyApps.isChecked() ? 1 : 0);
61836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        } else {
61936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            // If we didn't handle it, let preferences handle it.
62036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            return super.onPreferenceTreeClick(preferenceScreen, preference);
621afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
6224bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
62336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        return true;
624afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
625afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
626afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
628afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
629afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
631a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne     * see confirmPatternThenDisableAndClear
632afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
634d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode, Intent data) {
635afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
636790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett        if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST &&
637487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                resultCode == Activity.RESULT_OK) {
638487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            startBiometricWeakImprove();
639487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            return;
6404a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett        } else if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF &&
6414a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                resultCode == Activity.RESULT_OK) {
6424a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
6434a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
6448227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // Setting the mBiometricWeakLiveliness checked value to false is handled when onResume
6458227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // is called by grabbing the value from lockPatternUtils.  We can't set it here
6468227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // because mBiometricWeakLiveliness could be null
6474a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            return;
648091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        } else if (requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ||
649091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                requestCode == REQUEST_PICK_STATUS_APPWIDGET ||
650091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ||
651091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                requestCode == REQUEST_CREATE_STATUS_APPWIDGET) {
6528227e303850d7c1162c62947b70d0592432b455eMichael Jurka            int appWidgetId = (data == null) ? -1 : data.getIntExtra(
6538227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
654091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            if ((requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ||
655091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                 requestCode == REQUEST_PICK_STATUS_APPWIDGET) &&
656091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                resultCode == Activity.RESULT_OK) {
6578227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
658091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                boolean defaultOrNoWidget = data.getBooleanExtra(EXTRA_NO_WIDGET, false) ||
659091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        data.getBooleanExtra(EXTRA_DEFAULT_WIDGET, false);
6608227e303850d7c1162c62947b70d0592432b455eMichael Jurka
6618227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetProviderInfo appWidget = null;
662091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                if (!defaultOrNoWidget) {
6638227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
6648227e303850d7c1162c62947b70d0592432b455eMichael Jurka                }
6658227e303850d7c1162c62947b70d0592432b455eMichael Jurka
666091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                int newRequestCode = requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ?
667091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    REQUEST_CREATE_USER_SELECTED_APPWIDGET :
668091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    REQUEST_CREATE_STATUS_APPWIDGET;
669091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                if (!defaultOrNoWidget && appWidget.configure != null) {
6708227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    // Launch over to configure widget, if needed
6718227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
6728227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    intent.setComponent(appWidget.configure);
6738227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
6748227e303850d7c1162c62947b70d0592432b455eMichael Jurka
675091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    startActivityForResultSafely(intent, newRequestCode);
6768227e303850d7c1162c62947b70d0592432b455eMichael Jurka                } else {
6778227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    // Otherwise just add it
678091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    if (defaultOrNoWidget) {
6793028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                        // If we selected "none", delete the allocated id
6801dd0024327159deff0401978683b49a7d3879021Adam Cohen                        AppWidgetHost.deleteAppWidgetIdForSystem(appWidgetId);
6818227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
6828227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    }
683091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    onActivityResult(newRequestCode, Activity.RESULT_OK, data);
6848227e303850d7c1162c62947b70d0592432b455eMichael Jurka                }
685091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            } else if ((requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ||
686091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        requestCode == REQUEST_CREATE_STATUS_APPWIDGET) &&
687091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                       resultCode == Activity.RESULT_OK) {
6883028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                // If a widget existed before, delete it
689091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                int oldAppWidgetId = requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ?
690091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        getUserSelectedAppWidgetId() : getStatusAppWidgetId();
6913028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                if (oldAppWidgetId != -1) {
6921dd0024327159deff0401978683b49a7d3879021Adam Cohen                    AppWidgetHost.deleteAppWidgetIdForSystem(oldAppWidgetId);
6933028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                }
6948227e303850d7c1162c62947b70d0592432b455eMichael Jurka                Settings.Secure.putString(getContentResolver(),
695091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        (requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ?
696091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                                Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID :
697091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                                Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID),
6988227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        Integer.toString(appWidgetId));
6998227e303850d7c1162c62947b70d0592432b455eMichael Jurka            } else {
7001dd0024327159deff0401978683b49a7d3879021Adam Cohen                AppWidgetHost.deleteAppWidgetIdForSystem(appWidgetId);
7018227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
702487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        }
703122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        createPreferenceHierarchy();
704afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
705f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
70686624a21540e2cd336573a55adb5d3997e4a717dJim Miller    public boolean onPreferenceChange(Preference preference, Object value) {
70786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (preference == mLockAfter) {
70891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            int timeout = Integer.parseInt((String) value);
70986624a21540e2cd336573a55adb5d3997e4a717dJim Miller            try {
71086624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Settings.Secure.putInt(getContentResolver(),
71191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                        Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout);
71286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } catch (NumberFormatException e) {
71386624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e);
71486624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
715c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            updateLockAfterPreferenceSummary();
71686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
71786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        return true;
71886624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
719487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett
720487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    public void startBiometricWeakImprove(){
721487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        Intent intent = new Intent();
722487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup");
723487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        startActivity(intent);
724487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    }
725afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
726