diff --git a/res/values/strings.xml b/res/values/strings.xml index 3b7083047fd..1da514e2467 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -777,22 +777,27 @@ Slide - + No security + + + FacePass + + Low security, experimental Pattern - + Medium security PIN - + Medium to high security Password - + High security Disabled by administrator, encryption policy, or credential storage @@ -801,6 +806,8 @@ None Slide + + FacePass Secured with pattern diff --git a/res/xml/security_settings_biometric_weak.xml b/res/xml/security_settings_biometric_weak.xml new file mode 100644 index 00000000000..42af769b040 --- /dev/null +++ b/res/xml/security_settings_biometric_weak.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + diff --git a/res/xml/security_settings_picker.xml b/res/xml/security_settings_picker.xml index 04258df4d6a..c2202149380 100644 --- a/res/xml/security_settings_picker.xml +++ b/res/xml/security_settings_picker.xml @@ -32,6 +32,12 @@ android:summary="@string/unlock_set_unlock_none_summary" android:persistent="false"/> + + = 0; --i) { Preference pref = cat.getPreference(i); if (pref instanceof PreferenceScreen) { final String key = ((PreferenceScreen) pref).getKey(); boolean enabled = true; + boolean visible = true; if (KEY_UNLOCK_SET_OFF.equals(key)) { enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; } else if (KEY_UNLOCK_SET_NONE.equals(key)) { enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; + } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) { + enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK; + visible = weakBiometricAvailable; // If not available, then don't show it. } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) { enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; } else if (KEY_UNLOCK_SET_PIN.equals(key)) { @@ -213,7 +227,9 @@ public class ChooseLockGeneric extends PreferenceActivity { } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) { enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; } - if (!enabled) { + if (!visible || (onlyShowFallback && !allowedForFallback(key))) { + cat.removePreference(pref); + } else if (!enabled) { pref.setSummary(R.string.unlock_set_unlock_disabled_summary); pref.setEnabled(false); } @@ -221,6 +237,34 @@ public class ChooseLockGeneric extends PreferenceActivity { } } + /** + * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's + * supported as a backup. + * + * @param key + * @return true if allowed + */ + private boolean allowedForFallback(String key) { + return KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key); + } + + private boolean isBiometricSensorAvailable(int quality) { + return SystemProperties.getBoolean("ro.lockscreen.facelock_enabled", false); + } + + private Intent getBiometricSensorIntent(int quality) { + Intent fallBackIntent = new Intent().setClass(getActivity(), ChooseLockGeneric.class); + fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true); + fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false); + fallBackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + Intent intent = new Intent().setClassName("com.android.facelock", + "com.android.facelock.SetupFaceLock"); + PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0); + intent.putExtra("PendingIntent", pending); + return intent; + } + /** * Invokes an activity to change the user's pattern, password or PIN based on given quality * and minimum quality specified by DevicePolicyManager. If quality is @@ -236,6 +280,9 @@ public class ChooseLockGeneric extends PreferenceActivity { throw new IllegalStateException("Tried to update password without confirming it"); } + final boolean isFallback = getActivity().getIntent() + .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); + quality = upgradeQuality(quality); if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { int minLength = mDPM.getPasswordMinimumLength(null); @@ -249,6 +296,8 @@ public class ChooseLockGeneric extends PreferenceActivity { intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength); intent.putExtra(CONFIRM_CREDENTIALS, false); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, + isFallback); startActivity(intent); } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { boolean showTutorial = !mChooseLockSettingsHelper.utils().isPatternEverChosen(); @@ -259,6 +308,11 @@ public class ChooseLockGeneric extends PreferenceActivity { intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.putExtra("key_lock_method", "pattern"); intent.putExtra(CONFIRM_CREDENTIALS, false); + intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, + isFallback); + startActivity(intent); + } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { + Intent intent = getBiometricSensorIntent(quality); startActivity(intent); } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { mChooseLockSettingsHelper.utils().clearLock(); diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java index 96255eb0f8f..c201d15bba0 100644 --- a/src/com/android/settings/ChooseLockPassword.java +++ b/src/com/android/settings/ChooseLockPassword.java @@ -368,7 +368,9 @@ public class ChooseLockPassword extends PreferenceActivity { } else if (mUiStage == Stage.NeedToConfirm) { if (mFirstPin.equals(pin)) { mLockPatternUtils.clearLock(); - mLockPatternUtils.saveLockPassword(pin, mRequestedQuality); + final boolean isFallback = getActivity().getIntent().getBooleanExtra( + LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); + mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback); getActivity().finish(); } else { updateStage(Stage.ConfirmWrong); diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java index 9a34f2f4197..180eee19154 100644 --- a/src/com/android/settings/ChooseLockPattern.java +++ b/src/com/android/settings/ChooseLockPattern.java @@ -507,7 +507,9 @@ public class ChooseLockPattern extends PreferenceActivity { LockPatternUtils utils = mChooseLockSettingsHelper.utils(); final boolean lockVirgin = !utils.isPatternEverChosen(); - utils.saveLockPattern(mChosenPattern); + final boolean isFallback = getActivity().getIntent() + .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); + utils.saveLockPattern(mChosenPattern, isFallback); utils.setLockPatternEnabled(true); if (lockVirgin) { diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 3813ecd8213..5b8035dbc98 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -106,6 +106,8 @@ public class SecuritySettings extends SettingsPreferenceFragment } else { resid = R.xml.security_settings_chooser; } + } else if (mLockPatternUtils.usingBiometricWeak()) { + resid = R.xml.security_settings_biometric_weak; } else { switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) { case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: @@ -120,6 +122,7 @@ public class SecuritySettings extends SettingsPreferenceFragment resid = R.xml.security_settings_password; break; } + // TODO: enable facepass options } addPreferencesFromResource(resid);