From 5c489be89cad070cefc04e9b59f84a0b9d1a26ec Mon Sep 17 00:00:00 2001 From: Uriel Rodriguez Date: Wed, 30 May 2012 19:55:12 -0400 Subject: [PATCH] BUG 5457035 : Anti-spoofing : DO NOT MERGE Squashed commit of the following: commit 060b9daf5fe3c45573a13a149bf98f4fa1e6a46f Author: Danielle Millett Date: Wed May 30 15:50:03 2012 -0400 Added head turn option for Face Unlock. In security settings there is an option for head turn and it shows the current status (on/off). Clicking on this goes to another screen that describes the feature and allows the user to it on/off. Since the head turn option goes to a different screen instead of using a check box, this change also rips out the rest of the code for the old liveliness checkbox. Change-Id: I197af51084f3e751081fa159dadd6c2c80840d1e Change-Id: I67c8acd49316b49771a0bb97b4a5fbd5a1c13262 --- res/layout/biometric_weak_liveliness.xml | 46 ++++++ res/values/strings.xml | 10 ++ res/xml/security_settings_biometric_weak.xml | 5 + .../settings/BiometricWeakLiveliness.java | 136 ++++++++++++++++++ .../android/settings/SecuritySettings.java | 36 +---- 5 files changed, 202 insertions(+), 31 deletions(-) create mode 100644 res/layout/biometric_weak_liveliness.xml create mode 100644 src/com/android/settings/BiometricWeakLiveliness.java diff --git a/res/layout/biometric_weak_liveliness.xml b/res/layout/biometric_weak_liveliness.xml new file mode 100644 index 00000000000..916bd9a3f3c --- /dev/null +++ b/res/layout/biometric_weak_liveliness.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 13b4e56480c..10a18db59c8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -644,6 +644,16 @@ Improve face matching + + Require head turn + + On + + Off + + When this feature is turned on, other people can\'t use a photo of you to fool Face Unlock. While unlocking your tablet, you\'ll be asked to turn your head. You can turn it slightly to the left or right. + + When this feature is turned on, other people can\'t use a photo of you to fool Face Unlock. While unlocking your phone, you\'ll be asked to turn your head. You can turn it slightly to the left or right. Automatically lock diff --git a/res/xml/security_settings_biometric_weak.xml b/res/xml/security_settings_biometric_weak.xml index 080fbc9a50b..66cca28d978 100644 --- a/res/xml/security_settings_biometric_weak.xml +++ b/res/xml/security_settings_biometric_weak.xml @@ -30,6 +30,11 @@ android:key="biometric_weak_improve_matching" android:title="@string/biometric_weak_improve_matching_title"/> + + diff --git a/src/com/android/settings/BiometricWeakLiveliness.java b/src/com/android/settings/BiometricWeakLiveliness.java new file mode 100644 index 00000000000..6bba77f788f --- /dev/null +++ b/src/com/android/settings/BiometricWeakLiveliness.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings; + +import android.app.ActionBar; +import android.app.Activity; +import android.app.Fragment; +import android.os.Bundle; +import android.os.Handler; +import android.content.Intent; +import android.preference.PreferenceActivity; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.Switch; +import com.android.settings.R; + +import com.android.internal.widget.LockPatternUtils; + +public class BiometricWeakLiveliness extends Fragment + implements CompoundButton.OnCheckedChangeListener { + private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125; + + private View mView; + private ChooseLockSettingsHelper mChooseLockSettingsHelper; + private LockPatternUtils mLockPatternUtils; + private Switch mActionBarSwitch; + private boolean mSuppressCheckChanged; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Activity activity = getActivity(); + + mActionBarSwitch = new Switch(activity); + mSuppressCheckChanged = false; + + if (activity instanceof PreferenceActivity) { + PreferenceActivity preferenceActivity = (PreferenceActivity) activity; + if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { + final int padding = activity.getResources().getDimensionPixelSize( + R.dimen.action_bar_switch_padding); + mActionBarSwitch.setPadding(0, 0, padding, 0); + activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, + ActionBar.DISPLAY_SHOW_CUSTOM); + activity.getActionBar().setCustomView(mActionBarSwitch, new ActionBar.LayoutParams( + ActionBar.LayoutParams.WRAP_CONTENT, + ActionBar.LayoutParams.WRAP_CONTENT, + Gravity.CENTER_VERTICAL | Gravity.RIGHT)); + activity.getActionBar().setTitle(R.string.biometric_weak_liveliness_title); + } + } + + mActionBarSwitch.setOnCheckedChangeListener(this); + + mLockPatternUtils = new LockPatternUtils(getActivity()); + mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); + mActionBarSwitch.setChecked(mLockPatternUtils.isBiometricWeakLivelinessEnabled()); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mView = inflater.inflate(R.layout.biometric_weak_liveliness, container, false); + initView(mView); + return mView; + } + + private void initView(View view) { + mActionBarSwitch.setOnCheckedChangeListener(this); + mActionBarSwitch.setChecked(mLockPatternUtils.isBiometricWeakLivelinessEnabled()); + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean desiredState) { + if (mSuppressCheckChanged) { + return; + } + mActionBarSwitch.setEnabled(false); + if (desiredState) { + mLockPatternUtils.setBiometricWeakLivelinessEnabled(true); + mActionBarSwitch.setChecked(true); + } else { + // In this case the user has just turned it off, but this action requires them + // to confirm their password. We need to turn the switch back on until + // they've confirmed their password + mActionBarSwitch.setChecked(true); + mActionBarSwitch.requestLayout(); + ChooseLockSettingsHelper helper = + new ChooseLockSettingsHelper(this.getActivity(), this); + if (!helper.launchConfirmationActivity( + CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) { + // If this returns false, it means no password confirmation is required, so + // go ahead and turn it off here. + // Note: currently a backup is required for biometric_weak so this code path + // can't be reached, but is here in case things change in the future + mLockPatternUtils.setBiometricWeakLivelinessEnabled(false); + mActionBarSwitch.setChecked(false); + mActionBarSwitch.requestLayout(); + } + } + mActionBarSwitch.setEnabled(true); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF && + resultCode == Activity.RESULT_OK) { + final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); + lockPatternUtils.setBiometricWeakLivelinessEnabled(false); + mSuppressCheckChanged = true; + mActionBarSwitch.setChecked(false); + mSuppressCheckChanged = false; + return; + } + } + +} diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 8196d0b079b..6b6773066dd 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -62,7 +62,6 @@ public class SecuritySettings extends SettingsPreferenceFragment private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout"; private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123; private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_IMPROVE_REQUEST = 124; - private static final int CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF = 125; // Misc Settings private static final String KEY_SIM_LOCK = "sim_lock"; @@ -77,7 +76,7 @@ public class SecuritySettings extends SettingsPreferenceFragment private LockPatternUtils mLockPatternUtils; private ListPreference mLockAfter; - private CheckBoxPreference mBiometricWeakLiveliness; + private PreferenceScreen mBiometricWeakLiveliness; private CheckBoxPreference mVisiblePattern; private CheckBoxPreference mTactileFeedback; @@ -163,7 +162,7 @@ public class SecuritySettings extends SettingsPreferenceFragment // biometric weak liveliness mBiometricWeakLiveliness = - (CheckBoxPreference) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS); + (PreferenceScreen) root.findPreference(KEY_BIOMETRIC_WEAK_LIVELINESS); // visible pattern mVisiblePattern = (CheckBoxPreference) root.findPreference(KEY_VISIBLE_PATTERN); @@ -339,8 +338,9 @@ public class SecuritySettings extends SettingsPreferenceFragment final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); if (mBiometricWeakLiveliness != null) { - mBiometricWeakLiveliness.setChecked( - lockPatternUtils.isBiometricWeakLivelinessEnabled()); + mBiometricWeakLiveliness.setSummary(lockPatternUtils.isBiometricWeakLivelinessEnabled()? + R.string.biometric_weak_liveliness_on_summary: + R.string.biometric_weak_liveliness_off_summary); } if (mVisiblePattern != null) { mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled()); @@ -382,26 +382,6 @@ public class SecuritySettings extends SettingsPreferenceFragment // can't be reached, but is here in case things change in the future startBiometricWeakImprove(); } - } else if (KEY_BIOMETRIC_WEAK_LIVELINESS.equals(key)) { - if (isToggled(preference)) { - lockPatternUtils.setBiometricWeakLivelinessEnabled(true); - } else { - // In this case the user has just unchecked the checkbox, but this action requires - // them to confirm their password. We need to re-check the checkbox until - // they've confirmed their password - mBiometricWeakLiveliness.setChecked(true); - ChooseLockSettingsHelper helper = - new ChooseLockSettingsHelper(this.getActivity(), this); - if (!helper.launchConfirmationActivity( - CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF, null, null)) { - // If this returns false, it means no password confirmation is required, so - // go ahead and uncheck it here. - // Note: currently a backup is required for biometric_weak so this code path - // can't be reached, but is here in case things change in the future - lockPatternUtils.setBiometricWeakLivelinessEnabled(false); - mBiometricWeakLiveliness.setChecked(false); - } - } } else if (KEY_LOCK_ENABLED.equals(key)) { lockPatternUtils.setLockPatternEnabled(isToggled(preference)); } else if (KEY_VISIBLE_PATTERN.equals(key)) { @@ -442,12 +422,6 @@ public class SecuritySettings extends SettingsPreferenceFragment resultCode == Activity.RESULT_OK) { startBiometricWeakImprove(); return; - } else if (requestCode == CONFIRM_EXISTING_FOR_BIOMETRIC_WEAK_LIVELINESS_OFF && - resultCode == Activity.RESULT_OK) { - final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); - lockPatternUtils.setBiometricWeakLivelinessEnabled(false); - mBiometricWeakLiveliness.setChecked(false); - return; } createPreferenceHierarchy(); }