SecuritySettings.java revision 8666b9e170c23a9595d611a49b7c8262e357ced1
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 {
608666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani
618227e303850d7c1162c62947b70d0592432b455eMichael Jurka    static final String TAG = "SecuritySettings";
626f8fb436178d12d11d6ab59671168f0603bdbdcbJason parks
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Lock Settings
6491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
65091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final String KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET =
66091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            "choose_lockscreen_status_widget";
678227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final String KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET =
688227e303850d7c1162c62947b70d0592432b455eMichael Jurka            "choose_user_selected_lockscreen_widget";
69487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING =
70487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            "biometric_weak_improve_matching";
71a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett    private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness";
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_LOCK_ENABLED = "lockenabled";
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
749e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller    private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback";
75edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani    private static final String KEY_SECURITY_CATEGORY = "security_category";
7691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
778666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani    private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings";
788227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final String EXTRA_NO_WIDGET = "com.android.settings.NO_WIDGET";
79091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final String EXTRA_DEFAULT_WIDGET = "com.android.settings.DEFAULT_WIDGET";
8091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
81790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124;
824a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125;
83091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_PICK_USER_SELECTED_APPWIDGET = 126;
84091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_PICK_STATUS_APPWIDGET = 127;
85091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_CREATE_USER_SELECTED_APPWIDGET = 128;
86091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private static final int REQUEST_CREATE_STATUS_APPWIDGET = 129;
877031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    // Misc Settings
8991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SIM_LOCK = "sim_lock";
9091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SHOW_PASSWORD = "show_password";
9191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_RESET_CREDENTIALS = "reset_credentials";
922c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";
93d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications";
94071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller    private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks";
957fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani    private static final String KEY_CREDENTIALS_MANAGER = "credentials_management";
96bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
9747d380f1e6c823cea444004cb799d4c791145cc6Jim Miller
98abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    DevicePolicyManager mDPM;
99122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
10000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
1018227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private Preference mUserSelectedWidget;
102122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    private LockPatternUtils mLockPatternUtils;
10386624a21540e2cd336573a55adb5d3997e4a717dJim Miller    private ListPreference mLockAfter;
10436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller
1054a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett    private CheckBoxPreference mBiometricWeakLiveliness;
10691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mVisiblePattern;
10791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mTactileFeedback;
10891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
10991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mShowPassword;
11091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
11191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private Preference mResetCredentials;
1125ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
1132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private CheckBoxPreference mToggleAppInstallation;
1142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private DialogInterface mWarnInstallApps;
115d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private CheckBoxPreference mToggleVerifyApps;
116071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller    private CheckBoxPreference mPowerButtonInstantlyLocks;
1172c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
1187fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani    private boolean mIsPrimary;
1197fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
121d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
123122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
124d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mLockPatternUtils = new LockPatternUtils(getActivity());
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
126abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
127122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
128d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
12902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    }
1305ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
13291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        PreferenceScreen root = getPreferenceScreen();
133122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (root != null) {
134122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            root.removeAll();
135122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
136122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        addPreferencesFromResource(R.xml.security_settings);
13791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        root = getPreferenceScreen();
138122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
13936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        // Add options for lock/unlock screen
14036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        int resid = 0;
141122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (!mLockPatternUtils.isSecure()) {
14236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            if (mLockPatternUtils.isLockScreenDisabled()) {
14336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_lockscreen;
14436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            } else {
14536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_chooser;
14636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            }
1470fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett        } else if (mLockPatternUtils.usingBiometricWeak() &&
1480fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett                mLockPatternUtils.isBiometricWeakInstalled()) {
1495541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            resid = R.xml.security_settings_biometric_weak;
150122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else {
151af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
152af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
15336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pattern;
154af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
155af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
15636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pin;
157af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
158af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
159af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
16057fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
16136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_password;
162af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
16300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
164122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
16536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        addPreferencesFromResource(resid);
166122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
1674112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
1684112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks        // Add options for device encryption
169f8217304073b5cd13823a0602568394be93bf310Jason parks        DevicePolicyManager dpm =
170f8217304073b5cd13823a0602568394be93bf310Jason parks                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
1714112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
1727fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mIsPrimary = UserHandle.myUserId() == UserHandle.USER_OWNER;
1737fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
1748666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani        if (!mIsPrimary) {
1758666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani            // Rename owner info settings
1768666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani            Preference ownerInfoPref = findPreference(KEY_OWNER_INFO_SETTINGS);
1778666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani            if (ownerInfoPref != null) {
1788666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani                ownerInfoPref.setTitle(R.string.user_info_settings_title);
1798666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani            }
1808666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani        }
1818666b9e170c23a9595d611a49b7c8262e357ced1Amith Yamasani
1827fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mIsPrimary) {
183b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            switch (dpm.getStorageEncryptionStatus()) {
184b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
185b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                // The device is currently encrypted.
186b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                addPreferencesFromResource(R.xml.security_settings_encrypted);
187b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                break;
188b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
189b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                // This device supports encryption but isn't encrypted.
190b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                addPreferencesFromResource(R.xml.security_settings_unencrypted);
191b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                break;
192b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            }
1934112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks        }
1944112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
19586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // lock after preference
19691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT);
19791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        if (mLockAfter != null) {
19891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            setupLockAfterPreference();
19991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            updateLockAfterPreferenceSummary();
20091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        }
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
202a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        // biometric weak liveliness
203a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        mBiometricWeakLiveliness =
2044a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS);
205a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
20791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN);
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
209071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        // lock instantly on power key press
210071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        mPowerButtonInstantlyLocks = (CheckBoxPreference) root.findPreference(
211071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller                KEY_POWER_INSTANTLY_LOCKS);
212071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller
2138123493ef905a210bd00b0c623459f4c86505298Danielle Millett        // don't display visible pattern if biometric and backup is not pattern
2148123493ef905a210bd00b0c623459f4c86505298Danielle Millett        if (resid == R.xml.security_settings_biometric_weak &&
2158123493ef905a210bd00b0c623459f4c86505298Danielle Millett                mLockPatternUtils.getKeyguardStoredPasswordQuality() !=
2168123493ef905a210bd00b0c623459f4c86505298Danielle Millett                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
2178123493ef905a210bd00b0c623459f4c86505298Danielle Millett            PreferenceGroup securityCategory = (PreferenceGroup)
2188123493ef905a210bd00b0c623459f4c86505298Danielle Millett                    root.findPreference(KEY_SECURITY_CATEGORY);
2198123493ef905a210bd00b0c623459f4c86505298Danielle Millett            if (securityCategory != null && mVisiblePattern != null) {
2208123493ef905a210bd00b0c623459f4c86505298Danielle Millett                securityCategory.removePreference(root.findPreference(KEY_VISIBLE_PATTERN));
2218123493ef905a210bd00b0c623459f4c86505298Danielle Millett            }
2228123493ef905a210bd00b0c623459f4c86505298Danielle Millett        }
2238123493ef905a210bd00b0c623459f4c86505298Danielle Millett
224122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        // tactile feedback. Should be common to all unlock preference screens.
22591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mTactileFeedback = (CheckBoxPreference) root.findPreference(KEY_TACTILE_FEEDBACK_ENABLED);
226edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
227edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            PreferenceGroup securityCategory = (PreferenceGroup)
22891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                    root.findPreference(KEY_SECURITY_CATEGORY);
229edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            if (securityCategory != null && mTactileFeedback != null) {
230edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani                securityCategory.removePreference(mTactileFeedback);
231edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            }
232edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        }
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2347fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mUserSelectedWidget = root.findPreference(KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET);
2357fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mUserSelectedWidget != null) {
2367fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
2377fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            int appWidgetId = getStatusAppWidgetId();
2387fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            if (appWidgetId == -1) {
2397fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_default));
2407fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            } else {
2417fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
2427fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                if (appWidget != null) {
2437fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                    mUserSelectedWidget.setSummary(appWidget.label);
2447fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                }
2457fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            }
2467fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        }
2477fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani
2487fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mUserSelectedWidget = root.findPreference(KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET);
2497fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mUserSelectedWidget != null) {
2507fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
2517fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            int appWidgetId = getUserSelectedAppWidgetId();
2527fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            if (appWidgetId == -1) {
2537fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_none));
2547fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            } else {
2557fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
2567fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                if (appWidget != null) {
2577fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                    mUserSelectedWidget.setSummary(appWidget.label);
2587fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani                }
2597fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            }
260b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
261b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani
26291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Append the rest of the settings
26391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        addPreferencesFromResource(R.xml.security_settings_misc);
26491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
2655c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani        // Do not display SIM lock for devices without an Icc card
266cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville        TelephonyManager tm = TelephonyManager.getDefault();
2677fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (!mIsPrimary || !tm.hasIccCard()) {
26891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            root.removePreference(root.findPreference(KEY_SIM_LOCK));
269a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo        } else {
270a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            // Disable SIM lock if sim card is missing or unknown
271a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            if ((TelephonyManager.getDefault().getSimState() ==
272a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                                 TelephonyManager.SIM_STATE_ABSENT) ||
273a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                (TelephonyManager.getDefault().getSimState() ==
274a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                                 TelephonyManager.SIM_STATE_UNKNOWN)) {
275a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                root.findPreference(KEY_SIM_LOCK).setEnabled(false);
276a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            }
277386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
27991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Show password
28091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD);
281feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
2827fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        // Credential storage, only for primary user
2837fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mIsPrimary) {
2847fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS);
2857fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        } else {
2867fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            removePreference(KEY_CREDENTIALS_MANAGER);
2877fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        }
2888877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
2892c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mToggleAppInstallation = (CheckBoxPreference) findPreference(
2902c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                KEY_TOGGLE_INSTALL_APPLICATIONS);
2912c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
2922c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
2937fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        // Package verification, only visible to primary user and if enabled
2947fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS);
2957fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        if (mIsPrimary && showVerifierSetting()) {
296bbc3045a265238fd80547dd9bb61f6801a038886rich cannings            if (isVerifierInstalled()) {
297bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                mToggleVerifyApps.setChecked(isVerifyAppsEnabled());
298bbc3045a265238fd80547dd9bb61f6801a038886rich cannings            } else {
299bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                mToggleVerifyApps.setChecked(false);
300bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                mToggleVerifyApps.setEnabled(false);
301bbc3045a265238fd80547dd9bb61f6801a038886rich cannings            }
3027fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani        } else if (mToggleVerifyApps != null) {
3037fb4f850eabc017bab6090bf9268cf3fae1e08ebAmith Yamasani            mToggleVerifyApps.setEnabled(false);
3048227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
3058227e303850d7c1162c62947b70d0592432b455eMichael Jurka
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
309091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    private int getStatusAppWidgetId() {
310091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        int appWidgetId = -1;
311091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        String appWidgetIdString = Settings.Secure.getString(
312091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                getContentResolver(), Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID);
313091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        if (appWidgetIdString != null) {;
314091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            appWidgetId = (int) Integer.decode(appWidgetIdString);
315091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        }
316091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        return appWidgetId;
317091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka    }
318091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka
3193028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka    private int getUserSelectedAppWidgetId() {
3203028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        int appWidgetId = -1;
3213028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        String appWidgetIdString = Settings.Secure.getString(
3223028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                getContentResolver(), Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID);
3233028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        if (appWidgetIdString != null) {;
3243028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka            appWidgetId = (int) Integer.decode(appWidgetIdString);
3253028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        }
3263028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka        return appWidgetId;
3273028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka    }
3283028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka
3292c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private boolean isNonMarketAppsAllowed() {
3305a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate        return Settings.Global.getInt(getContentResolver(),
3315a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate                                      Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;
3322c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3332c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3342c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private void setNonMarketAppsAllowed(boolean enabled) {
3352c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        // Change the system setting
3365a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate        Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,
3372c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                                enabled ? 1 : 0);
3382c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3392c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
340d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private boolean isVerifyAppsEnabled() {
341d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        return Settings.Global.getInt(getContentResolver(),
342d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings                                      Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) > 0;
343d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    }
344d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings
345bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    private boolean isVerifierInstalled() {
346bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final PackageManager pm = getPackageManager();
347bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
348bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        verification.setType(PACKAGE_MIME_TYPE);
349bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
350bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0);
351bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        return (receivers.size() > 0) ? true : false;
352bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    }
353bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings
354bbc3045a265238fd80547dd9bb61f6801a038886rich cannings    private boolean showVerifierSetting() {
355bbc3045a265238fd80547dd9bb61f6801a038886rich cannings        return Settings.Global.getInt(getContentResolver(),
356bbc3045a265238fd80547dd9bb61f6801a038886rich cannings                                      Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0;
357bbc3045a265238fd80547dd9bb61f6801a038886rich cannings    }
358bbc3045a265238fd80547dd9bb61f6801a038886rich cannings
3592c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private void warnAppInstallation() {
3602c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        // TODO: DialogFragment?
3612c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle(
3622c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                getResources().getString(R.string.error_title))
3632c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
3642c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setMessage(getResources().getString(R.string.install_all_warning))
3652c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setPositiveButton(android.R.string.yes, this)
3662c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setNegativeButton(android.R.string.no, null)
3672c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .show();
3682c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3692c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3702c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    public void onClick(DialogInterface dialog, int which) {
3712c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON_POSITIVE) {
3722c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            setNonMarketAppsAllowed(true);
373b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            if (mToggleAppInstallation != null) {
374b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                mToggleAppInstallation.setChecked(true);
375b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            }
3762c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        }
3772c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3782c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3792c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    @Override
3802c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    public void onDestroy() {
3812c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        super.onDestroy();
3822c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        if (mWarnInstallApps != null) {
3832c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            mWarnInstallApps.dismiss();
3842c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        }
3852c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3862c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
38791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private void setupLockAfterPreference() {
38891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Compatible with pre-Froyo
38991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
39091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
39191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setValue(String.valueOf(currentTimeout));
39291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setOnPreferenceChangeListener(this);
39391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final long adminTimeout = (mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0);
39491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final long displayTimeout = Math.max(0,
39591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0));
39691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        if (adminTimeout > 0) {
39791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // This setting is a slave to display timeout when a device policy is enforced.
39891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // As such, maxLockTimeout = adminTimeout - displayTimeout.
39991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // If there isn't enough time, shows "immediately" setting.
40091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            disableUnusableTimeouts(Math.max(0, adminTimeout - displayTimeout));
40186624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
40286624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
40386624a21540e2cd336573a55adb5d3997e4a717dJim Miller
404c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    private void updateLockAfterPreferenceSummary() {
405c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        // Update summary message with current value
406c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
40758bca8f15fbdc9e621b3c259a50ecf41c00e64c3Amith Yamasani                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
408c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] entries = mLockAfter.getEntries();
409c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] values = mLockAfter.getEntryValues();
410c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        int best = 0;
411c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        for (int i = 0; i < values.length; i++) {
412c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            long timeout = Long.valueOf(values[i].toString());
413c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            if (currentTimeout >= timeout) {
414c9787070bab332b80676b745a44dd8ee4d72073dJim Miller                best = i;
415c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            }
416c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        }
41791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setSummary(getString(R.string.lock_after_timeout_summary, entries[best]));
418c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    }
419c9787070bab332b80676b745a44dd8ee4d72073dJim Miller
42091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private void disableUnusableTimeouts(long maxTimeout) {
42191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final CharSequence[] entries = mLockAfter.getEntries();
42291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final CharSequence[] values = mLockAfter.getEntryValues();
42386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
42486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
42586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        for (int i = 0; i < values.length; i++) {
42686624a21540e2cd336573a55adb5d3997e4a717dJim Miller            long timeout = Long.valueOf(values[i].toString());
42786624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (timeout <= maxTimeout) {
42886624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedEntries.add(entries[i]);
42986624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedValues.add(values[i]);
43086624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
43186624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
43286624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) {
43391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            mLockAfter.setEntries(
43486624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedEntries.toArray(new CharSequence[revisedEntries.size()]));
43591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            mLockAfter.setEntryValues(
43686624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedValues.toArray(new CharSequence[revisedValues.size()]));
43791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            final int userPreference = Integer.valueOf(mLockAfter.getValue());
43886624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (userPreference <= maxTimeout) {
43991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                mLockAfter.setValue(String.valueOf(userPreference));
44086624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } else {
44186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // There will be no highlighted selection since nothing in the list matches
44286624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // maxTimeout. The user can still select anything less than maxTimeout.
44386624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // TODO: maybe append maxTimeout to the list and mark selected.
44486624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
44586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
44691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setEnabled(revisedEntries.size() > 0);
44786624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
44886624a21540e2cd336573a55adb5d3997e4a717dJim Miller
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
450d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
45386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // Make sure we reload the preference hierarchy since some of these settings
45486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // depend on others...
45586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        createPreferenceHierarchy();
45686624a21540e2cd336573a55adb5d3997e4a717dJim Miller
45700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
458a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        if (mBiometricWeakLiveliness != null) {
4594a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            mBiometricWeakLiveliness.setChecked(
4604a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    lockPatternUtils.isBiometricWeakLivelinessEnabled());
461a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        }
462122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mVisiblePattern != null) {
463122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled());
464122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
465122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mTactileFeedback != null) {
466122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled());
467122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
468071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        if (mPowerButtonInstantlyLocks != null) {
469071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller            mPowerButtonInstantlyLocks.setChecked(lockPatternUtils.getPowerButtonInstantlyLocks());
470071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        }
4717031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
472b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mShowPassword != null) {
473b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
474b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                    Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
475b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
476b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
477d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        KeyStore.State state = KeyStore.getInstance().state();
478b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mResetCredentials != null) {
479b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mResetCredentials.setEnabled(state != KeyStore.State.UNINITIALIZED);
480b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4838227e303850d7c1162c62947b70d0592432b455eMichael Jurka    void startActivityForResultSafely(Intent intent, int requestCode) {
4848227e303850d7c1162c62947b70d0592432b455eMichael Jurka        try {
4858227e303850d7c1162c62947b70d0592432b455eMichael Jurka            startActivityForResult(intent, requestCode);
4868227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } catch (ActivityNotFoundException e) {
4878227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
4888227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } catch (SecurityException e) {
4898227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
4908227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Log.e(TAG, "Settings does not have the permission to launch " + intent, e);
4918227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
4928227e303850d7c1162c62947b70d0592432b455eMichael Jurka    }
4938227e303850d7c1162c62947b70d0592432b455eMichael Jurka
49416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka    private void launchPickActivityIntent(int featuresFilter, int defaultLabelId, int defaultIconId,
49516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ComponentName defaultComponentName, String defaultTag) {
49616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        // Create intent to pick widget
49716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
49816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
49916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        // Found in KeyguardHostView.java
50016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        final int KEYGUARD_HOST_ID = 0x4B455947;
50116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
50216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        if (appWidgetId != -1) {
50316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
50416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
50516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
50616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                    AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
50716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            if (featuresFilter != AppWidgetProviderInfo.WIDGET_FEATURES_NONE) {
50816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER, featuresFilter);
50916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            }
51016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
51116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            // Add an entry for "none" to let someone select no widget
51216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo();
51316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
51416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            defaultInfo.label = getResources().getString(defaultLabelId);
51516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            defaultInfo.icon = defaultIconId;
51616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            defaultInfo.provider = defaultComponentName;
51716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            extraInfos.add(defaultInfo);
51816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
51916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
52016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            Bundle b = new Bundle();
52116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            b.putBoolean(defaultTag, true);
52216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            extraExtras.add(b);
52316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
52416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            // Launch the widget picker
52516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
52616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
52716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
52816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            startActivityForResult(pickIntent, REQUEST_PICK_USER_SELECTED_APPWIDGET);
52916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        } else {
53016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
53116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka        }
53216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka    }
53316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka
53485d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen    private Intent getBaseIntent() {
53585d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        Intent baseIntent = new Intent(Intent.ACTION_MAIN, null);
53685d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        baseIntent.addCategory(Intent.CATEGORY_DEFAULT);
53785d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen
53885d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        Bundle options = new Bundle();
53985d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
54085d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen                AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
54185d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        baseIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);
54285d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen        return baseIntent;
54385d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen    }
54485d4b5f78e831fdfe6da39f6edafd32c7d63dfeaAdam Cohen
545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
546a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
547afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
548afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
550bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
55117e9e1933055b207473b488595b2887bfcaea32eJim Miller            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
55217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
5538227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
55416398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_NONE,
55516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                    R.string.widget_none, 0, new ComponentName("", ""), EXTRA_NO_WIDGET);
556091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        } else if (KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET.equals(key)) {
55716398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            int defaultIconId;
55816398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            ComponentName clock = new ComponentName(
55916398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                    "com.google.android.deskclock", "com.android.deskclock.DeskClock");
56016398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            try {
56116398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                defaultIconId = getActivity().getPackageManager().getActivityInfo(clock, 0).icon;
56216398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            } catch (PackageManager.NameNotFoundException e) {
56316398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                defaultIconId = 0;
5648227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
56516398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka            launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_STATUS,
56616398c9c973ba16a14455c4eee9ca162e0273792Michael Jurka                    R.string.widget_default, defaultIconId, clock, EXTRA_DEFAULT_WIDGET);
567487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
568487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            ChooseLockSettingsHelper helper =
569487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                    new ChooseLockSettingsHelper(this.getActivity(), this);
570487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            if (!helper.launchConfirmationActivity(
571790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                    CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST, null, null)) {
572790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // If this returns false, it means no password confirmation is required, so
573790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // go ahead and start improve.
574790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // Note: currently a backup is required for biometric_weak so this code path
575790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // can't be reached, but is here in case things change in the future
576790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                startBiometricWeakImprove();
577487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            }
5784a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett        } else if (KEY_BIOMETRIC_WEAK_LIVELINESS.equals(key)) {
5794a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            if (isToggled(preference)) {
5804a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                lockPatternUtils.setBiometricWeakLivelinessEnabled(true);
5814a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            } else {
5824a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // In this case the user has just unchecked the checkbox, but this action requires
5834a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // them to confirm their password.  We need to re-check the checkbox until
5844a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // they've confirmed their password
5854a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                mBiometricWeakLiveliness.setChecked(true);
5864a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                ChooseLockSettingsHelper helper =
5874a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                        new ChooseLockSettingsHelper(this.getActivity(), this);
5884a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                if (!helper.launchConfirmationActivity(
5894a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                                CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) {
5904a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // If this returns false, it means no password confirmation is required, so
5914a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // go ahead and uncheck it here.
5924a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // Note: currently a backup is required for biometric_weak so this code path
5934a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // can't be reached, but is here in case things change in the future
5944a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
5954a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    mBiometricWeakLiveliness.setChecked(false);
5964a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                }
5974a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            }
598122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else if (KEY_LOCK_ENABLED.equals(key)) {
59900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setLockPatternEnabled(isToggled(preference));
600afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
60100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
60300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
604071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        } else if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) {
605071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller            lockPatternUtils.setPowerButtonInstantlyLocks(isToggled(preference));
606afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
608afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
6092c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        } else if (preference == mToggleAppInstallation) {
6102c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            if (mToggleAppInstallation.isChecked()) {
6112c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                mToggleAppInstallation.setChecked(false);
6122c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                warnAppInstallation();
6132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            } else {
6142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                setNonMarketAppsAllowed(false);
6152c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            }
616d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        } else if (KEY_TOGGLE_VERIFY_APPLICATIONS.equals(key)) {
617d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings            Settings.Global.putInt(getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE,
618d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings                    mToggleVerifyApps.isChecked() ? 1 : 0);
61936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        } else {
62036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            // If we didn't handle it, let preferences handle it.
62136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            return super.onPreferenceTreeClick(preferenceScreen, preference);
622afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
6234bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
62436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        return true;
625afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
626afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
628afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
629afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
631afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
632a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne     * see confirmPatternThenDisableAndClear
633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
634afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
635d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode, Intent data) {
636afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
637790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett        if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST &&
638487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                resultCode == Activity.RESULT_OK) {
639487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            startBiometricWeakImprove();
640487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            return;
6414a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett        } else if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF &&
6424a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                resultCode == Activity.RESULT_OK) {
6434a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
6444a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
6458227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // Setting the mBiometricWeakLiveliness checked value to false is handled when onResume
6468227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // is called by grabbing the value from lockPatternUtils.  We can't set it here
6478227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // because mBiometricWeakLiveliness could be null
6484a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            return;
649091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka        } else if (requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ||
650091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                requestCode == REQUEST_PICK_STATUS_APPWIDGET ||
651091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ||
652091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                requestCode == REQUEST_CREATE_STATUS_APPWIDGET) {
6538227e303850d7c1162c62947b70d0592432b455eMichael Jurka            int appWidgetId = (data == null) ? -1 : data.getIntExtra(
6548227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
655091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            if ((requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ||
656091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                 requestCode == REQUEST_PICK_STATUS_APPWIDGET) &&
657091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                resultCode == Activity.RESULT_OK) {
6588227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
659091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                boolean defaultOrNoWidget = data.getBooleanExtra(EXTRA_NO_WIDGET, false) ||
660091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        data.getBooleanExtra(EXTRA_DEFAULT_WIDGET, false);
6618227e303850d7c1162c62947b70d0592432b455eMichael Jurka
6628227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetProviderInfo appWidget = null;
663091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                if (!defaultOrNoWidget) {
6648227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
6658227e303850d7c1162c62947b70d0592432b455eMichael Jurka                }
6668227e303850d7c1162c62947b70d0592432b455eMichael Jurka
667091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                int newRequestCode = requestCode == REQUEST_PICK_USER_SELECTED_APPWIDGET ?
668091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    REQUEST_CREATE_USER_SELECTED_APPWIDGET :
669091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    REQUEST_CREATE_STATUS_APPWIDGET;
670091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                if (!defaultOrNoWidget && appWidget.configure != null) {
6718227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    // Launch over to configure widget, if needed
6728227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
6738227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    intent.setComponent(appWidget.configure);
6748227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
6758227e303850d7c1162c62947b70d0592432b455eMichael Jurka
676091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    startActivityForResultSafely(intent, newRequestCode);
6778227e303850d7c1162c62947b70d0592432b455eMichael Jurka                } else {
6788227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    // Otherwise just add it
679091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    if (defaultOrNoWidget) {
6803028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                        // If we selected "none", delete the allocated id
6811dd0024327159deff0401978683b49a7d3879021Adam Cohen                        AppWidgetHost.deleteAppWidgetIdForSystem(appWidgetId);
6828227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
6838227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    }
684091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                    onActivityResult(newRequestCode, Activity.RESULT_OK, data);
6858227e303850d7c1162c62947b70d0592432b455eMichael Jurka                }
686091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka            } else if ((requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ||
687091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        requestCode == REQUEST_CREATE_STATUS_APPWIDGET) &&
688091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                       resultCode == Activity.RESULT_OK) {
6893028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                // If a widget existed before, delete it
690091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                int oldAppWidgetId = requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ?
691091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        getUserSelectedAppWidgetId() : getStatusAppWidgetId();
6923028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                if (oldAppWidgetId != -1) {
6931dd0024327159deff0401978683b49a7d3879021Adam Cohen                    AppWidgetHost.deleteAppWidgetIdForSystem(oldAppWidgetId);
6943028051ba8e694da7a3e527092d7d99f964aabe9Michael Jurka                }
6958227e303850d7c1162c62947b70d0592432b455eMichael Jurka                Settings.Secure.putString(getContentResolver(),
696091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                        (requestCode == REQUEST_CREATE_USER_SELECTED_APPWIDGET ?
697091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                                Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID :
698091477b4dec614b9b0153ebe1444d2ae81ee1ab6Michael Jurka                                Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID),
6998227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        Integer.toString(appWidgetId));
7008227e303850d7c1162c62947b70d0592432b455eMichael Jurka            } else {
7011dd0024327159deff0401978683b49a7d3879021Adam Cohen                AppWidgetHost.deleteAppWidgetIdForSystem(appWidgetId);
7028227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
703487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        }
704122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        createPreferenceHierarchy();
705afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
706f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
70786624a21540e2cd336573a55adb5d3997e4a717dJim Miller    public boolean onPreferenceChange(Preference preference, Object value) {
70886624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (preference == mLockAfter) {
70991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            int timeout = Integer.parseInt((String) value);
71086624a21540e2cd336573a55adb5d3997e4a717dJim Miller            try {
71186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Settings.Secure.putInt(getContentResolver(),
71291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                        Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout);
71386624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } catch (NumberFormatException e) {
71486624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e);
71586624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
716c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            updateLockAfterPreferenceSummary();
71786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
71886624a21540e2cd336573a55adb5d3997e4a717dJim Miller        return true;
71986624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
720487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett
721487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    public void startBiometricWeakImprove(){
722487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        Intent intent = new Intent();
723487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup");
724487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        startActivity(intent);
725487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    }
726afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
727