From 4dfcb8208cdb49167ccf99aeaddf9e206eba87d1 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 29 Apr 2015 17:21:32 -0700 Subject: [PATCH] Update fingerprint settings to spec - Make it look like a sub settings activity, with back button - Add disclaimer to describe what your fingerprint can be used for - Update visuals and text for "Add fingerprint" - Update related string Bug: 20594955 Change-Id: I0adfcc743db386e0abf9cfdafff3d068ebc3b4bc --- res/drawable/ic_add_24dp.xml | 24 ++++ res/layout/fingerprint_settings_footer.xml | 27 ++++ res/values/strings.xml | 10 +- res/xml/security_settings_fingerprint.xml | 24 +--- src/com/android/settings/HelpUtils.java | 2 +- .../android/settings/SettingsActivity.java | 2 +- .../fingerprint/FingerprintSettings.java | 132 ++++++++++++------ 7 files changed, 157 insertions(+), 64 deletions(-) create mode 100644 res/drawable/ic_add_24dp.xml create mode 100644 res/layout/fingerprint_settings_footer.xml diff --git a/res/drawable/ic_add_24dp.xml b/res/drawable/ic_add_24dp.xml new file mode 100644 index 00000000000..65351077df9 --- /dev/null +++ b/res/drawable/ic_add_24dp.xml @@ -0,0 +1,24 @@ + + + + diff --git a/res/layout/fingerprint_settings_footer.xml b/res/layout/fingerprint_settings_footer.xml new file mode 100644 index 00000000000..e3e3c081cea --- /dev/null +++ b/res/layout/fingerprint_settings_footer.xml @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 9c553a4400d..3f5e9e9ef90 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -740,7 +740,7 @@ Use fingerprint for - Add + Add fingerprint screen lock @@ -752,7 +752,7 @@ Fingerprint setup - To use your fingerprint to unlock your screen or confirm purchases, we\'ll need to: + To use your fingerprint to unlock your screen or confirm purchases, you\'ll need to: Setup your backup screen lock method @@ -796,6 +796,10 @@ Add another Next + + In addition to unlocking your phone, you can also use your fingerprint to authorize purchases and app access. Learn more + + Screen lock option disabled. You can still use your fingerprint to authorize purchases and app access. Learn more Encryption @@ -5625,6 +5629,8 @@ + + Account for content diff --git a/res/xml/security_settings_fingerprint.xml b/res/xml/security_settings_fingerprint.xml index 7cc3a562b34..804ef881630 100644 --- a/res/xml/security_settings_fingerprint.xml +++ b/res/xml/security_settings_fingerprint.xml @@ -14,25 +14,7 @@ limitations under the License. --> - - - - - - - - - - - - + diff --git a/src/com/android/settings/HelpUtils.java b/src/com/android/settings/HelpUtils.java index 36fb19445ae..67e7b537fed 100644 --- a/src/com/android/settings/HelpUtils.java +++ b/src/com/android/settings/HelpUtils.java @@ -118,7 +118,7 @@ public class HelpUtils { } } - private static Intent getHelpIntent(Context context, String helpUriString) { + public static Intent getHelpIntent(Context context, String helpUriString) { // Try to handle as Intent Uri, otherwise just treat as Uri. try { return Intent.parseUri(helpUriString, diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 502f164f6cf..fcbb5129d4b 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -557,7 +557,7 @@ public class SettingsActivity extends Activity // This is a "Sub Settings" when: // - this is a real SubSettings // - or :settings:show_fragment_as_subsetting is passed to the Intent - final boolean isSubSettings = className.equals(SubSettings.class.getName()) || + final boolean isSubSettings = this instanceof SubSettings || intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false); // If this is a sub settings, then apply the SubSettings Theme for the ActionBar content insets diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java index 85d3762c2e6..5a69147236b 100644 --- a/src/com/android/settings/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/fingerprint/FingerprintSettings.java @@ -17,13 +17,22 @@ package com.android.settings.fingerprint; +import android.annotation.Nullable; import android.app.Activity; import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.hardware.fingerprint.Fingerprint; +import android.hardware.fingerprint.FingerprintManager; +import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; +import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; +import android.hardware.fingerprint.FingerprintManager.RemovalCallback; +import android.net.Uri; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; @@ -31,25 +40,29 @@ import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; -import android.hardware.fingerprint.Fingerprint; -import android.hardware.fingerprint.FingerprintManager; -import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; -import android.hardware.fingerprint.FingerprintManager.RemovalCallback; -import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; +import android.provider.Browser; +import android.text.Annotation; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.URLSpan; import android.util.AttributeSet; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.EditText; +import android.widget.TextView; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.settings.ChooseLockGeneric; import com.android.settings.ChooseLockSettingsHelper; +import com.android.settings.HelpUtils; import com.android.settings.R; -import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.fingerprint.FingerprintEnrollEnrolling; +import com.android.settings.SubSettings; import com.android.settings.search.Indexable; import java.util.List; @@ -57,7 +70,7 @@ import java.util.List; /** * Settings screen for fingerprints */ -public class FingerprintSettings extends SettingsActivity { +public class FingerprintSettings extends SubSettings { /** * Used by the FP settings wizard to indicate the wizard is * finished, and each activity in the wizard should finish. @@ -96,9 +109,7 @@ public class FingerprintSettings extends SettingsActivity { private static final String TAG = "FingerprintSettings"; private static final String KEY_FINGERPRINT_ITEM_PREFIX = "key_fingerprint_item"; - private static final String KEY_USAGE_CATEGORY = "fingerprint_usage_category"; private static final String KEY_FINGERPRINT_ADD = "key_fingerprint_add"; - private static final String KEY_MANAGE_CATEGORY = "fingerprint_manage_category"; private static final String KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE = "fingerprint_enable_keyguard_toggle"; private static final String KEY_LAUNCHED_CONFIRM = "launched_confirm"; @@ -112,7 +123,6 @@ public class FingerprintSettings extends SettingsActivity { private static final int ADD_FINGERPRINT_REQUEST = 10; - private static final boolean ENABLE_USAGE_CATEGORY = false; protected static final boolean DEBUG = true; private FingerprintManager mFingerprintManager; @@ -226,6 +236,27 @@ public class FingerprintSettings extends SettingsActivity { } } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + TextView v = (TextView) LayoutInflater.from(view.getContext()).inflate( + R.layout.fingerprint_settings_footer, null); + v.setText(LearnMoreSpan.linkify(getText(isFingerprintDisabled() + ? R.string.security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled + : R.string.security_settings_fingerprint_enroll_disclaimer), + getString(getHelpResource()))); + v.setMovementMethod(new LinkMovementMethod()); + getListView().addFooterView(v); + getListView().setFooterDividersEnabled(false); + } + + private boolean isFingerprintDisabled() { + final DevicePolicyManager dpm = + (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); + return dpm != null && (dpm.getKeyguardDisabledFeatures(null) + & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0; + } + protected void removeFingerprintPreference(int fingerprintId) { String name = genKey(fingerprintId); Preference prefToRemove = mManageCategory.findPreference(name); @@ -251,48 +282,29 @@ public class FingerprintSettings extends SettingsActivity { } addPreferencesFromResource(R.xml.security_settings_fingerprint); root = getPreferenceScreen(); - - // Fingerprint items - mManageCategory = (PreferenceGroup) root.findPreference(KEY_MANAGE_CATEGORY); - if (mManageCategory != null) { - addFingerprintItemPreferences(mManageCategory); - } - - // Fingerprint usage options - PreferenceGroup usageCategory = (PreferenceGroup) root.findPreference( - KEY_USAGE_CATEGORY); - if (usageCategory != null) { - Preference toggle = root.findPreference(KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE); - toggle.setOnPreferenceChangeListener(this); - if (!ENABLE_USAGE_CATEGORY) { - root.removePreference(usageCategory); - } else { - toggle.setOnPreferenceChangeListener(this); - } - } - + addFingerprintItemPreferences(root); return root; } - private void addFingerprintItemPreferences(PreferenceGroup manageFingerprintCategory) { - manageFingerprintCategory.removeAll(); + private void addFingerprintItemPreferences(PreferenceGroup root) { + root.removeAll(); final List items = mFingerprintManager.getEnrolledFingerprints(); final int fingerprintCount = items.size(); for (int i = 0; i < fingerprintCount; i++) { final Fingerprint item = items.get(i); - FingerprintPreference pref = new FingerprintPreference( - manageFingerprintCategory.getContext()); + FingerprintPreference pref = new FingerprintPreference(root.getContext()); pref.setKey(genKey(item.getFingerId())); pref.setTitle(item.getName()); pref.setFingerprint(item); pref.setPersistent(false); - manageFingerprintCategory.addPreference(pref); + root.addPreference(pref); pref.setOnPreferenceChangeListener(this); } - Preference addPreference = new Preference(manageFingerprintCategory.getContext()); + Preference addPreference = new Preference(root.getContext()); addPreference.setKey(KEY_FINGERPRINT_ADD); addPreference.setTitle(R.string.fingerprint_add_title); - manageFingerprintCategory.addPreference(addPreference); + addPreference.setIcon(R.drawable.ic_add_24dp); + root.addPreference(addPreference); addPreference.setOnPreferenceChangeListener(this); } @@ -403,7 +415,7 @@ public class FingerprintSettings extends SettingsActivity { @Override protected int getHelpResource() { - return R.string.help_url_security; + return R.string.help_url_fingerprint; } @Override @@ -508,4 +520,46 @@ public class FingerprintSettings extends SettingsActivity { mView = view; } }; + + private static class LearnMoreSpan extends URLSpan { + + private static final Typeface TYPEFACE_MEDIUM = + Typeface.create("sans-serif-medium", Typeface.NORMAL); + + private LearnMoreSpan(String url) { + super(url); + } + + @Override + public void onClick(View widget) { + Context ctx = widget.getContext(); + Intent intent = HelpUtils.getHelpIntent(ctx, getURL()); + try { + ctx.startActivity(intent); + } catch (ActivityNotFoundException e) { + Log.w(FingerprintSettingsFragment.TAG, + "Actvity was not found for intent, " + intent.toString()); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + ds.setTypeface(TYPEFACE_MEDIUM); + } + + public static CharSequence linkify(CharSequence rawText, String uri) { + SpannableString msg = new SpannableString(rawText); + Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class); + SpannableStringBuilder builder = new SpannableStringBuilder(msg); + for (Annotation annotation : spans) { + int start = msg.getSpanStart(annotation); + int end = msg.getSpanEnd(annotation); + LearnMoreSpan link = new LearnMoreSpan(uri); + builder.setSpan(link, start, end, msg.getSpanFlags(link)); + } + return builder; + } + } }