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);