SecuritySettings.java revision 8227e303850d7c1162c62947b70d0592432b455e
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;
248227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.app.KeyguardManager;
254037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
268227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetHost;
278227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetManager;
288227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.appwidget.AppWidgetProviderInfo;
298227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.content.ActivityNotFoundException;
308227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.content.ComponentName;
31abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
322c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunneimport android.content.DialogInterface;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
34bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.PackageManager;
35bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport android.content.pm.ResolveInfo;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
37bb06a427eb471227cf42a8078a54ca0581309493Dianne Hackbornimport android.os.UserHandle;
38edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasaniimport android.os.Vibrator;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
4086624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.preference.ListPreference;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
42f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.Preference.OnPreferenceChangeListener;
43f8b25796f0ce1096a95cae2b51d07d96e148277cMathew Inwoodimport android.preference.PreferenceGroup;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
469cec698a1fbbe5e8d23a96347d4e75003f4b8cb6Chia-chi Yehimport android.security.KeyStore;
4756e1526114639dd7f19ef0aa90defd10756bf22dOscar Montemayorimport android.telephony.TelephonyManager;
4886624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport android.util.Log;
498227e303850d7c1162c62947b70d0592432b455eMichael Jurkaimport android.widget.Toast;
50f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
51a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
52a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne
5386624a21540e2cd336573a55adb5d3997e4a717dJim Millerimport java.util.ArrayList;
54bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich canningsimport java.util.List;
555ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Gesture lock pattern settings.
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
5936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Millerpublic class SecuritySettings extends SettingsPreferenceFragment
602c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        implements OnPreferenceChangeListener, DialogInterface.OnClickListener {
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";
658227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final String KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET =
668227e303850d7c1162c62947b70d0592432b455eMichael Jurka            "choose_user_selected_lockscreen_widget";
67487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING =
68487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            "biometric_weak_improve_matching";
69a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett    private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness";
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_LOCK_ENABLED = "lockenabled";
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
729e61b9fe59aca9ac521792f4f89e5a270333b030Jim Miller    private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback";
73edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani    private static final String KEY_SECURITY_CATEGORY = "security_category";
7491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
758227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final String EXTRA_NO_WIDGET = "com.android.settings.NO_WIDGET";
7691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
77790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124;
784a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett    private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125;
798227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final int REQUEST_PICK_APPWIDGET = 126;
808227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private static final int REQUEST_CREATE_APPWIDGET = 127;
817031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
8291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    // Misc Settings
8391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SIM_LOCK = "sim_lock";
8491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_SHOW_PASSWORD = "show_password";
8591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private static final String KEY_RESET_CREDENTIALS = "reset_credentials";
862c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";
87d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications";
88071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller    private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks";
89bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
9047d380f1e6c823cea444004cb799d4c791145cc6Jim Miller
91abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    DevicePolicyManager mDPM;
92122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
9300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
948227e303850d7c1162c62947b70d0592432b455eMichael Jurka    private Preference mUserSelectedWidget;
95122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    private LockPatternUtils mLockPatternUtils;
9686624a21540e2cd336573a55adb5d3997e4a717dJim Miller    private ListPreference mLockAfter;
9736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller
984a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett    private CheckBoxPreference mBiometricWeakLiveliness;
9991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mVisiblePattern;
10091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mTactileFeedback;
10191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
10291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private CheckBoxPreference mShowPassword;
10391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
10491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private Preference mResetCredentials;
1055ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
1062c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private CheckBoxPreference mToggleAppInstallation;
1072c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private DialogInterface mWarnInstallApps;
108d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private CheckBoxPreference mToggleVerifyApps;
109071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller    private CheckBoxPreference mPowerButtonInstantlyLocks;
1102c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
112d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle savedInstanceState) {
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
114122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
115d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mLockPatternUtils = new LockPatternUtils(getActivity());
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
117abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
118122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
119d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
12002cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani    }
1215ed2c4ad43f2c3c85a025da04becd2eaa75927a1Mike Lockwood
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PreferenceScreen createPreferenceHierarchy() {
12391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        PreferenceScreen root = getPreferenceScreen();
124122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (root != null) {
125122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            root.removeAll();
126122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
127122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        addPreferencesFromResource(R.xml.security_settings);
12891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        root = getPreferenceScreen();
129122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
13036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        // Add options for lock/unlock screen
13136972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        int resid = 0;
132122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (!mLockPatternUtils.isSecure()) {
13336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            if (mLockPatternUtils.isLockScreenDisabled()) {
13436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_lockscreen;
13536972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            } else {
13636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                resid = R.xml.security_settings_chooser;
13736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            }
1380fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett        } else if (mLockPatternUtils.usingBiometricWeak() &&
1390fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett                mLockPatternUtils.isBiometricWeakInstalled()) {
1405541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            resid = R.xml.security_settings_biometric_weak;
141122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else {
142af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
143af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
14436972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pattern;
145af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
146af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
14736972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_pin;
148af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
149af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
150af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
15157fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
15236972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller                    resid = R.xml.security_settings_password;
153af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller                    break;
15400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
155122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
15636972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        addPreferencesFromResource(resid);
157122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
1584112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
1594112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks        // Add options for device encryption
160f8217304073b5cd13823a0602568394be93bf310Jason parks        DevicePolicyManager dpm =
161f8217304073b5cd13823a0602568394be93bf310Jason parks                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
1624112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
163bb06a427eb471227cf42a8078a54ca0581309493Dianne Hackborn        if (UserHandle.myUserId() == 0) {
164b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            switch (dpm.getStorageEncryptionStatus()) {
165b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
166b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                // The device is currently encrypted.
167b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                addPreferencesFromResource(R.xml.security_settings_encrypted);
168b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                break;
169b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
170b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                // This device supports encryption but isn't encrypted.
171b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                addPreferencesFromResource(R.xml.security_settings_unencrypted);
172b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                break;
173b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            }
1744112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks        }
1754112199ed654f8bd1cea2c9a29a24be3c148b2edJason parks
17686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // lock after preference
17791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter = (ListPreference) root.findPreference(KEY_LOCK_AFTER_TIMEOUT);
17891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        if (mLockAfter != null) {
17991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            setupLockAfterPreference();
18091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            updateLockAfterPreferenceSummary();
18191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        }
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
183a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        // biometric weak liveliness
184a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        mBiometricWeakLiveliness =
1854a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS);
186a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // visible pattern
18891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN);
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
190071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        // lock instantly on power key press
191071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        mPowerButtonInstantlyLocks = (CheckBoxPreference) root.findPreference(
192071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller                KEY_POWER_INSTANTLY_LOCKS);
193071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller
1948123493ef905a210bd00b0c623459f4c86505298Danielle Millett        // don't display visible pattern if biometric and backup is not pattern
1958123493ef905a210bd00b0c623459f4c86505298Danielle Millett        if (resid == R.xml.security_settings_biometric_weak &&
1968123493ef905a210bd00b0c623459f4c86505298Danielle Millett                mLockPatternUtils.getKeyguardStoredPasswordQuality() !=
1978123493ef905a210bd00b0c623459f4c86505298Danielle Millett                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
1988123493ef905a210bd00b0c623459f4c86505298Danielle Millett            PreferenceGroup securityCategory = (PreferenceGroup)
1998123493ef905a210bd00b0c623459f4c86505298Danielle Millett                    root.findPreference(KEY_SECURITY_CATEGORY);
2008123493ef905a210bd00b0c623459f4c86505298Danielle Millett            if (securityCategory != null && mVisiblePattern != null) {
2018123493ef905a210bd00b0c623459f4c86505298Danielle Millett                securityCategory.removePreference(root.findPreference(KEY_VISIBLE_PATTERN));
2028123493ef905a210bd00b0c623459f4c86505298Danielle Millett            }
2038123493ef905a210bd00b0c623459f4c86505298Danielle Millett        }
2048123493ef905a210bd00b0c623459f4c86505298Danielle Millett
205122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        // tactile feedback. Should be common to all unlock preference screens.
20691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mTactileFeedback = (CheckBoxPreference) root.findPreference(KEY_TACTILE_FEEDBACK_ENABLED);
207edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
208edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            PreferenceGroup securityCategory = (PreferenceGroup)
20991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                    root.findPreference(KEY_SECURITY_CATEGORY);
210edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            if (securityCategory != null && mTactileFeedback != null) {
211edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani                securityCategory.removePreference(mTactileFeedback);
212edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani            }
213edac9af662f01026fd2b4acf263e1b5d1dfdeaa9Amith Yamasani        }
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
215bb06a427eb471227cf42a8078a54ca0581309493Dianne Hackborn        if (UserHandle.myUserId() > 0) {
216b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            return root;
217b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
218b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        // Rest are for primary user...
219b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani
22091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Append the rest of the settings
22191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        addPreferencesFromResource(R.xml.security_settings_misc);
22291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh
2235c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani        // Do not display SIM lock for devices without an Icc card
224cd05e8859599658a546b5d4ee09068dd2833b901Wink Saville        TelephonyManager tm = TelephonyManager.getDefault();
2255c68e12493d3c81324179c7c3ba6cd58279d648bAmith Yamasani        if (!tm.hasIccCard()) {
22691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            root.removePreference(root.findPreference(KEY_SIM_LOCK));
227a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo        } else {
228a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            // Disable SIM lock if sim card is missing or unknown
229a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            if ((TelephonyManager.getDefault().getSimState() ==
230a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                                 TelephonyManager.SIM_STATE_ABSENT) ||
231a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                (TelephonyManager.getDefault().getSimState() ==
232a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                                 TelephonyManager.SIM_STATE_UNKNOWN)) {
233a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo                root.findPreference(KEY_SIM_LOCK).setEnabled(false);
234a98c353f8b18607f0c2e9af26b91bf6ffbe8dc78Kazuhiro Ondo            }
235386278a338d740dce95b7fa1514662b0eb5683e4Chouting Zhang        }
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Show password
23891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mShowPassword = (CheckBoxPreference) root.findPreference(KEY_SHOW_PASSWORD);
239feff65213231ba6a0f6185f98e660042b5b14595Dianne Hackborn
2407031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan        // Credential storage
24191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS);
2428877f74901b456d45aaf7a47f6d2208fab9e283cOscar Montemayor
2432c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mToggleAppInstallation = (CheckBoxPreference) findPreference(
2442c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                KEY_TOGGLE_INSTALL_APPLICATIONS);
2452c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
2462c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
247d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        // Package verification
248bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        mToggleVerifyApps = (CheckBoxPreference) findPreference(KEY_TOGGLE_VERIFY_APPLICATIONS);
249bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        if (isVerifierInstalled()) {
250bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings            mToggleVerifyApps.setChecked(isVerifyAppsEnabled());
251bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        } else {
252bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings            mToggleVerifyApps.setChecked(false);
253bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings            mToggleVerifyApps.setEnabled(false);
254bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        }
255d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings
2568227e303850d7c1162c62947b70d0592432b455eMichael Jurka        mUserSelectedWidget = root.findPreference(KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET);
2578227e303850d7c1162c62947b70d0592432b455eMichael Jurka        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
2588227e303850d7c1162c62947b70d0592432b455eMichael Jurka        int appWidgetId = -1;
2598227e303850d7c1162c62947b70d0592432b455eMichael Jurka        String appWidgetIdString = Settings.Secure.getString(
2608227e303850d7c1162c62947b70d0592432b455eMichael Jurka                getContentResolver(), Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID);
2618227e303850d7c1162c62947b70d0592432b455eMichael Jurka        if (appWidgetIdString != null) {;
2628227e303850d7c1162c62947b70d0592432b455eMichael Jurka            appWidgetId = (int) Integer.decode(appWidgetIdString);
2638227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
2648227e303850d7c1162c62947b70d0592432b455eMichael Jurka        if (appWidgetId == -1) {
2658227e303850d7c1162c62947b70d0592432b455eMichael Jurka            mUserSelectedWidget.setSummary(getResources().getString(R.string.widget_none));
2668227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } else {
2678227e303850d7c1162c62947b70d0592432b455eMichael Jurka            AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
2688227e303850d7c1162c62947b70d0592432b455eMichael Jurka            if (appWidget != null) {
2698227e303850d7c1162c62947b70d0592432b455eMichael Jurka                mUserSelectedWidget.setSummary(appWidget.label);
2708227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
2718227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
2728227e303850d7c1162c62947b70d0592432b455eMichael Jurka
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return root;
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2762c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private boolean isNonMarketAppsAllowed() {
2775a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate        return Settings.Global.getInt(getContentResolver(),
2785a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate                                      Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;
2792c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
2802c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
2812c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private void setNonMarketAppsAllowed(boolean enabled) {
2822c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        // Change the system setting
2835a64c739bfbf644dabd11d5330f577e94d478326Christopher Tate        Settings.Global.putInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS,
2842c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                                enabled ? 1 : 0);
2852c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
2862c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
287d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    private boolean isVerifyAppsEnabled() {
288d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        return Settings.Global.getInt(getContentResolver(),
289d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings                                      Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) > 0;
290d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings    }
291d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings
292bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    private boolean isVerifierInstalled() {
293bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final PackageManager pm = getPackageManager();
294bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
295bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        verification.setType(PACKAGE_MIME_TYPE);
296bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
297bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0);
298bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings        return (receivers.size() > 0) ? true : false;
299bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings    }
300bfbdceffe60e20a8db91b54cc81cfe49ea0dd96arich cannings
3012c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    private void warnAppInstallation() {
3022c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        // TODO: DialogFragment?
3032c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        mWarnInstallApps = new AlertDialog.Builder(getActivity()).setTitle(
3042c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                getResources().getString(R.string.error_title))
3052c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
3062c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setMessage(getResources().getString(R.string.install_all_warning))
3072c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setPositiveButton(android.R.string.yes, this)
3082c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .setNegativeButton(android.R.string.no, null)
3092c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                .show();
3102c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3112c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3122c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    public void onClick(DialogInterface dialog, int which) {
3132c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON_POSITIVE) {
3142c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            setNonMarketAppsAllowed(true);
315b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            if (mToggleAppInstallation != null) {
316b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                mToggleAppInstallation.setChecked(true);
317b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            }
3182c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        }
3192c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3202c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
3212c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    @Override
3222c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    public void onDestroy() {
3232c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        super.onDestroy();
3242c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        if (mWarnInstallApps != null) {
3252c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            mWarnInstallApps.dismiss();
3262c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        }
3272c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne    }
3282c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne
32991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private void setupLockAfterPreference() {
33091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        // Compatible with pre-Froyo
33191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
33291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
33391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setValue(String.valueOf(currentTimeout));
33491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setOnPreferenceChangeListener(this);
33591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final long adminTimeout = (mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0);
33691d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final long displayTimeout = Math.max(0,
33791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                Settings.System.getInt(getContentResolver(), SCREEN_OFF_TIMEOUT, 0));
33891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        if (adminTimeout > 0) {
33991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // This setting is a slave to display timeout when a device policy is enforced.
34091d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // As such, maxLockTimeout = adminTimeout - displayTimeout.
34191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            // If there isn't enough time, shows "immediately" setting.
34291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            disableUnusableTimeouts(Math.max(0, adminTimeout - displayTimeout));
34386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
34486624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
34586624a21540e2cd336573a55adb5d3997e4a717dJim Miller
346c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    private void updateLockAfterPreferenceSummary() {
347c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        // Update summary message with current value
348c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        long currentTimeout = Settings.Secure.getLong(getContentResolver(),
34958bca8f15fbdc9e621b3c259a50ecf41c00e64c3Amith Yamasani                Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 5000);
350c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] entries = mLockAfter.getEntries();
351c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        final CharSequence[] values = mLockAfter.getEntryValues();
352c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        int best = 0;
353c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        for (int i = 0; i < values.length; i++) {
354c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            long timeout = Long.valueOf(values[i].toString());
355c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            if (currentTimeout >= timeout) {
356c9787070bab332b80676b745a44dd8ee4d72073dJim Miller                best = i;
357c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            }
358c9787070bab332b80676b745a44dd8ee4d72073dJim Miller        }
35991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setSummary(getString(R.string.lock_after_timeout_summary, entries[best]));
360c9787070bab332b80676b745a44dd8ee4d72073dJim Miller    }
361c9787070bab332b80676b745a44dd8ee4d72073dJim Miller
36291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh    private void disableUnusableTimeouts(long maxTimeout) {
36391d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final CharSequence[] entries = mLockAfter.getEntries();
36491d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        final CharSequence[] values = mLockAfter.getEntryValues();
36586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedEntries = new ArrayList<CharSequence>();
36686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
36786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        for (int i = 0; i < values.length; i++) {
36886624a21540e2cd336573a55adb5d3997e4a717dJim Miller            long timeout = Long.valueOf(values[i].toString());
36986624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (timeout <= maxTimeout) {
37086624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedEntries.add(entries[i]);
37186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                revisedValues.add(values[i]);
37286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
37386624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
37486624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) {
37591d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            mLockAfter.setEntries(
37686624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedEntries.toArray(new CharSequence[revisedEntries.size()]));
37791d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            mLockAfter.setEntryValues(
37886624a21540e2cd336573a55adb5d3997e4a717dJim Miller                    revisedValues.toArray(new CharSequence[revisedValues.size()]));
37991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            final int userPreference = Integer.valueOf(mLockAfter.getValue());
38086624a21540e2cd336573a55adb5d3997e4a717dJim Miller            if (userPreference <= maxTimeout) {
38191d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                mLockAfter.setValue(String.valueOf(userPreference));
38286624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } else {
38386624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // There will be no highlighted selection since nothing in the list matches
38486624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // maxTimeout. The user can still select anything less than maxTimeout.
38586624a21540e2cd336573a55adb5d3997e4a717dJim Miller                // TODO: maybe append maxTimeout to the list and mark selected.
38686624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
38786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
38891d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh        mLockAfter.setEnabled(revisedEntries.size() > 0);
38986624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
39086624a21540e2cd336573a55adb5d3997e4a717dJim Miller
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
392d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
39586624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // Make sure we reload the preference hierarchy since some of these settings
39686624a21540e2cd336573a55adb5d3997e4a717dJim Miller        // depend on others...
39786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        createPreferenceHierarchy();
39886624a21540e2cd336573a55adb5d3997e4a717dJim Miller
39900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
400a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        if (mBiometricWeakLiveliness != null) {
4014a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            mBiometricWeakLiveliness.setChecked(
4024a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    lockPatternUtils.isBiometricWeakLivelinessEnabled());
403a87a25bdec7b991bfa6ef3ea9dfacd0ed162044eDanielle Millett        }
404122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mVisiblePattern != null) {
405122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled());
406122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
407122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        if (mTactileFeedback != null) {
408122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller            mTactileFeedback.setChecked(lockPatternUtils.isTactileFeedbackEnabled());
409122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
410071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        if (mPowerButtonInstantlyLocks != null) {
411071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller            mPowerButtonInstantlyLocks.setChecked(lockPatternUtils.getPowerButtonInstantlyLocks());
412071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        }
4137031ab0d756327496ac3ce1e082b53c94be2f3b1Hung-ying Tyan
414b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mShowPassword != null) {
415b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mShowPassword.setChecked(Settings.System.getInt(getContentResolver(),
416b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani                    Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
417b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
418b0883cb384fc7ad46e011a72355c9fda924e5b28Hung-ying Tyan
419d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        KeyStore.State state = KeyStore.getInstance().state();
420b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        if (mResetCredentials != null) {
421b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani            mResetCredentials.setEnabled(state != KeyStore.State.UNINITIALIZED);
422b810a0ddf9dd93a08789aff38901eeab9bfaf812Amith Yamasani        }
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4258227e303850d7c1162c62947b70d0592432b455eMichael Jurka    void startActivityForResultSafely(Intent intent, int requestCode) {
4268227e303850d7c1162c62947b70d0592432b455eMichael Jurka        try {
4278227e303850d7c1162c62947b70d0592432b455eMichael Jurka            startActivityForResult(intent, requestCode);
4288227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } catch (ActivityNotFoundException e) {
4298227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
4308227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } catch (SecurityException e) {
4318227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Toast.makeText(getActivity(), R.string.activity_not_found, Toast.LENGTH_SHORT).show();
4328227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Log.e(TAG, "Settings does not have the permission to launch " + intent, e);
4338227e303850d7c1162c62947b70d0592432b455eMichael Jurka        }
4348227e303850d7c1162c62947b70d0592432b455eMichael Jurka    }
4358227e303850d7c1162c62947b70d0592432b455eMichael Jurka
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
437a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String key = preference.getKey();
439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
44000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
441bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
44217e9e1933055b207473b488595b2887bfcaea32eJim Miller            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
44317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
4448227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
4458227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // Create intent to pick widget
4468227e303850d7c1162c62947b70d0592432b455eMichael Jurka            Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
4478227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // Found in KeyguardHostView.java
4488227e303850d7c1162c62947b70d0592432b455eMichael Jurka            final int KEYGUARD_HOST_ID = 0x4B455947;
4498227e303850d7c1162c62947b70d0592432b455eMichael Jurka            int appWidgetId = AppWidgetHost.allocateAppWidgetIdForHost(
4508227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    "com.android.internal.policy.impl.keyguard", KEYGUARD_HOST_ID);
4518227e303850d7c1162c62947b70d0592432b455eMichael Jurka            if (appWidgetId != -1) {
4528227e303850d7c1162c62947b70d0592432b455eMichael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
4538227e303850d7c1162c62947b70d0592432b455eMichael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
4548227e303850d7c1162c62947b70d0592432b455eMichael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
4558227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
4568227e303850d7c1162c62947b70d0592432b455eMichael Jurka
4578227e303850d7c1162c62947b70d0592432b455eMichael Jurka                // Add an entry for "none" to let someone select no widget
4588227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetProviderInfo noneInfo = new AppWidgetProviderInfo();
4598227e303850d7c1162c62947b70d0592432b455eMichael Jurka                ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
4608227e303850d7c1162c62947b70d0592432b455eMichael Jurka                noneInfo.label = getResources().getString(R.string.widget_none);
4618227e303850d7c1162c62947b70d0592432b455eMichael Jurka                noneInfo.provider = new ComponentName("", "");
4628227e303850d7c1162c62947b70d0592432b455eMichael Jurka                extraInfos.add(noneInfo);
4638227e303850d7c1162c62947b70d0592432b455eMichael Jurka
4648227e303850d7c1162c62947b70d0592432b455eMichael Jurka                ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
4658227e303850d7c1162c62947b70d0592432b455eMichael Jurka                Bundle b = new Bundle();
4668227e303850d7c1162c62947b70d0592432b455eMichael Jurka                b.putBoolean(EXTRA_NO_WIDGET, true);
4678227e303850d7c1162c62947b70d0592432b455eMichael Jurka                extraExtras.add(b);
4688227e303850d7c1162c62947b70d0592432b455eMichael Jurka
4698227e303850d7c1162c62947b70d0592432b455eMichael Jurka                // Launch the widget picker
4708227e303850d7c1162c62947b70d0592432b455eMichael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
4718227e303850d7c1162c62947b70d0592432b455eMichael Jurka                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
4728227e303850d7c1162c62947b70d0592432b455eMichael Jurka                startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
4738227e303850d7c1162c62947b70d0592432b455eMichael Jurka            } else {
4748227e303850d7c1162c62947b70d0592432b455eMichael Jurka                Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
4758227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
476487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
477487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            ChooseLockSettingsHelper helper =
478487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                    new ChooseLockSettingsHelper(this.getActivity(), this);
479487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            if (!helper.launchConfirmationActivity(
480790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                    CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST, null, null)) {
481790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // If this returns false, it means no password confirmation is required, so
482790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // go ahead and start improve.
483790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // Note: currently a backup is required for biometric_weak so this code path
484790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                // can't be reached, but is here in case things change in the future
485790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett                startBiometricWeakImprove();
486487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            }
4874a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett        } else if (KEY_BIOMETRIC_WEAK_LIVELINESS.equals(key)) {
4884a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            if (isToggled(preference)) {
4894a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                lockPatternUtils.setBiometricWeakLivelinessEnabled(true);
4904a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            } else {
4914a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // In this case the user has just unchecked the checkbox, but this action requires
4924a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // them to confirm their password.  We need to re-check the checkbox until
4934a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                // they've confirmed their password
4944a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                mBiometricWeakLiveliness.setChecked(true);
4954a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                ChooseLockSettingsHelper helper =
4964a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                        new ChooseLockSettingsHelper(this.getActivity(), this);
4974a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                if (!helper.launchConfirmationActivity(
4984a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                                CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) {
4994a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // If this returns false, it means no password confirmation is required, so
5004a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // go ahead and uncheck it here.
5014a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // Note: currently a backup is required for biometric_weak so this code path
5024a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    // can't be reached, but is here in case things change in the future
5034a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
5044a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                    mBiometricWeakLiveliness.setChecked(false);
5054a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                }
5064a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            }
507122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        } else if (KEY_LOCK_ENABLED.equals(key)) {
50800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setLockPatternEnabled(isToggled(preference));
509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_VISIBLE_PATTERN.equals(key)) {
51000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
51200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            lockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
513071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller        } else if (KEY_POWER_INSTANTLY_LOCKS.equals(key)) {
514071742d838f9b0c312af309c87eaf2c444aeeab8Jim Miller            lockPatternUtils.setPowerButtonInstantlyLocks(isToggled(preference));
515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mShowPassword) {
516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mShowPassword.isChecked() ? 1 : 0);
5182c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne        } else if (preference == mToggleAppInstallation) {
5192c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            if (mToggleAppInstallation.isChecked()) {
5202c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                mToggleAppInstallation.setChecked(false);
5212c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                warnAppInstallation();
5222c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            } else {
5232c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne                setNonMarketAppsAllowed(false);
5242c88a877f88b142fa8fd36c1773ab484b5fd7338Gilles Debunne            }
525d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings        } else if (KEY_TOGGLE_VERIFY_APPLICATIONS.equals(key)) {
526d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings            Settings.Global.putInt(getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE,
527d5d60655a9c23ba02b5fc1264fb1680f599b3b07rich cannings                    mToggleVerifyApps.isChecked() ? 1 : 0);
52836972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        } else {
52936972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            // If we didn't handle it, let preferences handle it.
53036972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller            return super.onPreferenceTreeClick(preferenceScreen, preference);
531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
5324bfdcd3e5fb344cad88feaf4172427f0be53ac2cAmith Yamasani
53336972bb7e952ca8a7bd8e57e32246d60873d7479Jim Miller        return true;
534afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
535afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
536afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isToggled(Preference pref) {
537afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return ((CheckBoxPreference) pref).isChecked();
538afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
539afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
540afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
541a6a8a1479b970d8a84395453703348fe42d17438Gilles Debunne     * see confirmPatternThenDisableAndClear
542afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
543afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
544d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onActivityResult(int requestCode, int resultCode, Intent data) {
545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
546790e0c3ef3f11d7472ad676ce8314a73df190190Danielle Millett        if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST &&
547487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                resultCode == Activity.RESULT_OK) {
548487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            startBiometricWeakImprove();
549487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            return;
5504a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett        } else if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF &&
5514a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett                resultCode == Activity.RESULT_OK) {
5524a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
5534a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            lockPatternUtils.setBiometricWeakLivelinessEnabled(false);
5548227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // Setting the mBiometricWeakLiveliness checked value to false is handled when onResume
5558227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // is called by grabbing the value from lockPatternUtils.  We can't set it here
5568227e303850d7c1162c62947b70d0592432b455eMichael Jurka            // because mBiometricWeakLiveliness could be null
5574a3e40d68e8b01871121655456d7a1dfa3312f71Danielle Millett            return;
5588227e303850d7c1162c62947b70d0592432b455eMichael Jurka        } else if (requestCode == REQUEST_PICK_APPWIDGET ||
5598227e303850d7c1162c62947b70d0592432b455eMichael Jurka                requestCode == REQUEST_CREATE_APPWIDGET) {
5608227e303850d7c1162c62947b70d0592432b455eMichael Jurka            int appWidgetId = (data == null) ? -1 : data.getIntExtra(
5618227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
5628227e303850d7c1162c62947b70d0592432b455eMichael Jurka            if (requestCode == REQUEST_PICK_APPWIDGET && resultCode == Activity.RESULT_OK) {
5638227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getActivity());
5648227e303850d7c1162c62947b70d0592432b455eMichael Jurka                boolean noWidget = data.getBooleanExtra(EXTRA_NO_WIDGET, false);
5658227e303850d7c1162c62947b70d0592432b455eMichael Jurka
5668227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetProviderInfo appWidget = null;
5678227e303850d7c1162c62947b70d0592432b455eMichael Jurka                if (!noWidget) {
5688227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);
5698227e303850d7c1162c62947b70d0592432b455eMichael Jurka                }
5708227e303850d7c1162c62947b70d0592432b455eMichael Jurka
5718227e303850d7c1162c62947b70d0592432b455eMichael Jurka                if (!noWidget && appWidget.configure != null) {
5728227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    // Launch over to configure widget, if needed
5738227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
5748227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    intent.setComponent(appWidget.configure);
5758227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
5768227e303850d7c1162c62947b70d0592432b455eMichael Jurka
5778227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET);
5788227e303850d7c1162c62947b70d0592432b455eMichael Jurka                } else {
5798227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    // Otherwise just add it
5808227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    if (noWidget) {
5818227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
5828227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    }
5838227e303850d7c1162c62947b70d0592432b455eMichael Jurka                    onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);
5848227e303850d7c1162c62947b70d0592432b455eMichael Jurka                }
5858227e303850d7c1162c62947b70d0592432b455eMichael Jurka            } else if (requestCode == REQUEST_CREATE_APPWIDGET && resultCode == Activity.RESULT_OK) {
5868227e303850d7c1162c62947b70d0592432b455eMichael Jurka                Settings.Secure.putString(getContentResolver(),
5878227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID,
5888227e303850d7c1162c62947b70d0592432b455eMichael Jurka                        Integer.toString(appWidgetId));
5898227e303850d7c1162c62947b70d0592432b455eMichael Jurka
5908227e303850d7c1162c62947b70d0592432b455eMichael Jurka            } else {
5918227e303850d7c1162c62947b70d0592432b455eMichael Jurka                AppWidgetHost.deleteAppWidgetIdForHost(appWidgetId);
5928227e303850d7c1162c62947b70d0592432b455eMichael Jurka            }
593487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        }
594122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        createPreferenceHierarchy();
595afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
596f06d8698a4a2de1973a25df0c6563bdfcba4eb03Amith Yamasani
59786624a21540e2cd336573a55adb5d3997e4a717dJim Miller    public boolean onPreferenceChange(Preference preference, Object value) {
59886624a21540e2cd336573a55adb5d3997e4a717dJim Miller        if (preference == mLockAfter) {
59991d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh            int timeout = Integer.parseInt((String) value);
60086624a21540e2cd336573a55adb5d3997e4a717dJim Miller            try {
60186624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Settings.Secure.putInt(getContentResolver(),
60291d65a20af2d1bfb06f32d0bd821e8558afe939dChia-chi Yeh                        Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, timeout);
60386624a21540e2cd336573a55adb5d3997e4a717dJim Miller            } catch (NumberFormatException e) {
60486624a21540e2cd336573a55adb5d3997e4a717dJim Miller                Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e);
60586624a21540e2cd336573a55adb5d3997e4a717dJim Miller            }
606c9787070bab332b80676b745a44dd8ee4d72073dJim Miller            updateLockAfterPreferenceSummary();
60786624a21540e2cd336573a55adb5d3997e4a717dJim Miller        }
60886624a21540e2cd336573a55adb5d3997e4a717dJim Miller        return true;
60986624a21540e2cd336573a55adb5d3997e4a717dJim Miller    }
610487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett
611487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    public void startBiometricWeakImprove(){
612487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        Intent intent = new Intent();
613487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup");
614487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        startActivity(intent);
615487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett    }
616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
617