diff --git a/res/drawable-nodpi/fingerprint_anim00.png b/res/drawable-nodpi/fingerprint_anim00.png
deleted file mode 100644
index 97d264495f7..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim00.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim01.png b/res/drawable-nodpi/fingerprint_anim01.png
deleted file mode 100644
index d6c86b82b00..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim01.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim02.png b/res/drawable-nodpi/fingerprint_anim02.png
deleted file mode 100644
index ddc8ac3f80a..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim02.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim03.png b/res/drawable-nodpi/fingerprint_anim03.png
deleted file mode 100644
index 3435c461c14..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim03.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim04.png b/res/drawable-nodpi/fingerprint_anim04.png
deleted file mode 100644
index 2f8f9494a36..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim04.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim05.png b/res/drawable-nodpi/fingerprint_anim05.png
deleted file mode 100644
index 47178b71c00..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim05.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim06.png b/res/drawable-nodpi/fingerprint_anim06.png
deleted file mode 100644
index e0a29d129f5..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim06.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim07.png b/res/drawable-nodpi/fingerprint_anim07.png
deleted file mode 100644
index d92d75ba334..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim07.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim08.png b/res/drawable-nodpi/fingerprint_anim08.png
deleted file mode 100644
index 9c77868f644..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim08.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim09.png b/res/drawable-nodpi/fingerprint_anim09.png
deleted file mode 100644
index 5ebaa0c10de..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim09.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim10.png b/res/drawable-nodpi/fingerprint_anim10.png
deleted file mode 100644
index b1f9ca9080b..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim10.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim11.png b/res/drawable-nodpi/fingerprint_anim11.png
deleted file mode 100644
index b8fb5d77579..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim11.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_anim12.png b/res/drawable-nodpi/fingerprint_anim12.png
deleted file mode 100644
index 97d264495f7..00000000000
Binary files a/res/drawable-nodpi/fingerprint_anim12.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_in_app_indicator.png b/res/drawable-nodpi/fingerprint_in_app_indicator.png
deleted file mode 100644
index 4af83e62c96..00000000000
Binary files a/res/drawable-nodpi/fingerprint_in_app_indicator.png and /dev/null differ
diff --git a/res/drawable-nodpi/fingerprint_sensor_location.png b/res/drawable-nodpi/fingerprint_sensor_location.png
deleted file mode 100644
index 0486dba2e5a..00000000000
Binary files a/res/drawable-nodpi/fingerprint_sensor_location.png and /dev/null differ
diff --git a/res/drawable-xxhdpi/fingerprint_in_app_indicator.png b/res/drawable-xxhdpi/fingerprint_in_app_indicator.png
new file mode 100644
index 00000000000..fc56a9a3d8c
Binary files /dev/null and b/res/drawable-xxhdpi/fingerprint_in_app_indicator.png differ
diff --git a/res/drawable-xxhdpi/fingerprint_indicator.png b/res/drawable-xxhdpi/fingerprint_indicator.png
new file mode 100644
index 00000000000..fc5ef0ffcb0
Binary files /dev/null and b/res/drawable-xxhdpi/fingerprint_indicator.png differ
diff --git a/res/drawable-xxhdpi/fingerprint_sensor_location.png b/res/drawable-xxhdpi/fingerprint_sensor_location.png
new file mode 100644
index 00000000000..b95816fb393
Binary files /dev/null and b/res/drawable-xxhdpi/fingerprint_sensor_location.png differ
diff --git a/res/drawable/fingerprint_animation.xml b/res/drawable/fingerprint_animation.xml
deleted file mode 100644
index a2c1030a992..00000000000
--- a/res/drawable/fingerprint_animation.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/drawable/fingerprint_progress_ring.xml b/res/drawable/fingerprint_progress_ring.xml
index a2d9cbaff33..04578cdfc62 100644
--- a/res/drawable/fingerprint_progress_ring.xml
+++ b/res/drawable/fingerprint_progress_ring.xml
@@ -15,15 +15,24 @@
-->
- -
+
-
+ android:thickness="@dimen/fingerprint_ring_thickness"
+ android:useLevel="false">
+
+
+
+ -
+
diff --git a/res/drawable/fingerprint_progress_ring_bg.xml b/res/drawable/fingerprint_progress_ring_bg.xml
deleted file mode 100644
index 52d439bdabb..00000000000
--- a/res/drawable/fingerprint_progress_ring_bg.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
diff --git a/res/layout-land/fingerprint_enroll.xml b/res/layout-land/fingerprint_enroll.xml
index 8954d740e35..7bd41d1a765 100644
--- a/res/layout-land/fingerprint_enroll.xml
+++ b/res/layout-land/fingerprint_enroll.xml
@@ -62,62 +62,59 @@
-
+ android:layout_gravity="center"
+ android:gravity="center">
-
+
+ android:layout_centerInParent="true">
+
+
-
-
+
-
+
-
-
-
-
+
+
-
+ android:layout_gravity="center"
+ android:gravity="center">
-
+
+ android:layout_centerInParent="true">
+
+
-
-
+
-
+
-
-
+
-
+
@@ -117,12 +119,15 @@
+ android:text="@string/fingerprint_enroll_button_add"
+ android:layout_margin="10dip" />
+ android:text="@string/fingerprint_enroll_button_next"
+ android:layout_margin="10dip" />
+
diff --git a/res/layout/fingerprint_rename_dialog.xml b/res/layout/fingerprint_rename_dialog.xml
new file mode 100644
index 00000000000..38b6ff2ed5e
--- /dev/null
+++ b/res/layout/fingerprint_rename_dialog.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 21b5924a595..83449f94f07 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -63,7 +63,7 @@
#ff009688
#ffffffff
#de000000
- #ff009688
+ #ff009688
#20000000
#ff384248
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index a494db95772..5ed69c45c84 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -233,4 +233,8 @@
8dp
+
+ 96dip
+ 4dip
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 01fa8da494e..d99570b22e0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -759,7 +759,15 @@
Fingerprint
-
+
+ Manage fingerprints
+
+ Use fingerprint for
+
+ Add
+
+ screen lock
+
- %1$d fingerprint enrolled
- %1$d fingerprints enrolled
@@ -769,8 +777,19 @@
To use your fingerprint to unlock your screen or confirm purchases, we\'ll need to:
- \n\u2713 Set up your background screen lock method
- \n\u2713 Add your fingerprint
+ \n\n\u2713 Set up your background screen lock method
+ \n\n\u2713 Add your fingerprint
+
+ Find the sensor
+
+
+ Locate the fingerprint sensor on the back of your phone.
+
+ Name
+
+ OK
+
+ Delete
Let\'s start!
@@ -2675,7 +2694,7 @@
- Screen security
+ Device security
Change unlock pattern
diff --git a/res/xml/security_settings_fingerprint.xml b/res/xml/security_settings_fingerprint.xml
new file mode 100644
index 00000000000..7cc3a562b34
--- /dev/null
+++ b/res/xml/security_settings_fingerprint.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index bfb328d328f..216b1cab0b2 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -35,6 +35,8 @@ import android.os.UserManager;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.security.KeyStore;
+import android.service.fingerprint.FingerprintManager;
+import android.service.fingerprint.FingerprintManagerReceiver;
import android.util.EventLog;
import android.util.Log;
import android.util.MutableBoolean;
@@ -102,11 +104,14 @@ public class ChooseLockGeneric extends SettingsActivity {
private boolean mEncryptionRequestDisabled;
private boolean mRequirePassword;
private LockPatternUtils mLockPatternUtils;
+ private FingerprintManager mFingerprintManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mFingerprintManager =
+ (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mKeyStore = KeyStore.getInstance();
mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
@@ -391,13 +396,36 @@ public class ChooseLockGeneric extends SettingsActivity {
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
mChooseLockSettingsHelper.utils().clearLock();
mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
+ removeAllFingerprintTemplates();
getActivity().setResult(Activity.RESULT_OK);
finish();
} else {
+ removeAllFingerprintTemplates();
finish();
}
}
+ // TODO: This is only required because we used to enforce clients have a listener,
+ // which is no longer required in the new API. Remove when that happens.
+ FingerprintManagerReceiver mReceiver = new FingerprintManagerReceiver() {
+ public void onRemoved(int fingerprintId) {
+ Log.v(TAG, "onRemoved(id=" + fingerprintId + ")");
+ }
+ };
+
+ private void removeAllFingerprintTemplates() {
+ mFingerprintManager.startListening(mReceiver);
+ if (mFingerprintManager != null) {
+ mFingerprintManager.remove(0 /* all fingerprint templates */);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ mFingerprintManager.stopListening();
+ }
+
@Override
protected int getHelpResource() {
return R.string.help_url_choose_lockscreen;
diff --git a/src/com/android/settings/FingerprintEnroll.java b/src/com/android/settings/FingerprintEnroll.java
index 24f479e6404..f7ca36b79e6 100644
--- a/src/com/android/settings/FingerprintEnroll.java
+++ b/src/com/android/settings/FingerprintEnroll.java
@@ -21,10 +21,12 @@ import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.Fragment;
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.Drawable;
import android.media.AudioAttributes;
import android.os.Bundle;
import android.os.PowerManager;
@@ -80,11 +82,13 @@ public class FingerprintEnroll extends SettingsActivity {
}
public static class FingerprintEnrollFragment extends Fragment implements View.OnClickListener {
+ private static final int PROGRESS_BAR_MAX = 10000;
private static final String TAG = "FingerprintEnroll";
private static final boolean DEBUG = true;
private static final int CONFIRM_REQUEST = 101;
private static final int CHOOSE_LOCK_GENERIC_REQUEST = 102;
private static final long ENROLL_TIMEOUT = 300*1000;
+ private static final int FINISH_DELAY = 250;
private PowerManager mPowerManager;
private FingerprintManager mFingerprintManager;
@@ -98,6 +102,15 @@ public class FingerprintEnroll extends SettingsActivity {
private ProgressBar mProgressBar;
private ImageView mFingerprintAnimator;
private ObjectAnimator mProgressAnim;
+
+ // Give the user a chance to see progress completed before jumping to the next stage.
+ Runnable mDelayedFinishRunnable = new Runnable() {
+ @Override
+ public void run() {
+ updateStage(Stage.EnrollingFinish);
+ }
+ };
+
private final AnimatorListener mProgressAnimationListener = new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) { }
@@ -107,8 +120,8 @@ public class FingerprintEnroll extends SettingsActivity {
@Override
public void onAnimationEnd(Animator animation) {
- if (mProgressBar.getProgress() >= 100) {
- updateStage(Stage.EnrollingFinish);
+ if (mProgressBar.getProgress() >= PROGRESS_BAR_MAX) {
+ mContentView.postDelayed(mDelayedFinishRunnable, FINISH_DELAY);
}
}
@@ -133,12 +146,17 @@ public class FingerprintEnroll extends SettingsActivity {
R.id.fingerprint_enroll_button_next
};
- private static final int VIEWS_ENROLL_START[] = {
+ private static final int VIEWS_ENROLL_FIND_SENSOR[] = {
R.id.fingerprint_sensor_location,
- R.id.fingerprint_progress_bar
+ R.id.fingerprint_enroll_button_area,
+ R.id.fingerprint_enroll_button_next
};
- private static final int VIEWS_ENROLL_PROGRESS[] = {
+ private static final int VIEWS_ENROLL_START[] = {
+ R.id.fingerprint_animator,
+ };
+
+ private static final int VIEWS_ENROLL_REPEAT[] = {
R.id.fingerprint_animator,
R.id.fingerprint_progress_bar
};
@@ -149,17 +167,21 @@ public class FingerprintEnroll extends SettingsActivity {
R.id.fingerprint_enroll_button_add,
R.id.fingerprint_enroll_button_next
};
+ private static final boolean ALWAYS_SHOW_FIND_SCREEN = true;
- enum Stage {
- EnrollingOnboarding(R.string.security_settings_fingerprint_enroll_onboard_title,
+ private enum Stage {
+ EnrollingOnboard(R.string.security_settings_fingerprint_enroll_onboard_title,
R.string.security_settings_fingerprint_enroll_onboard_message,
VIEWS_ENROLL_ONBOARD),
+ EnrollingFindSensor(R.string.security_settings_fingerprint_enroll_find_sensor_title,
+ R.string.security_settings_fingerprint_enroll_find_sensor_message,
+ VIEWS_ENROLL_FIND_SENSOR),
EnrollingStart(R.string.security_settings_fingerprint_enroll_start_title,
R.string.security_settings_fingerprint_enroll_start_message,
VIEWS_ENROLL_START),
EnrollingRepeat(R.string.security_settings_fingerprint_enroll_repeat_title,
R.string.security_settings_fingerprint_enroll_repeat_message,
- VIEWS_ENROLL_PROGRESS),
+ VIEWS_ENROLL_REPEAT),
EnrollingFinish(R.string.security_settings_fingerprint_enroll_finish_title,
R.string.security_settings_fingerprint_enroll_finish_message,
VIEWS_ENROLL_FINISH);
@@ -196,22 +218,29 @@ public class FingerprintEnroll extends SettingsActivity {
}
private void startFingerprintAnimator() {
- AnimationDrawable drawable = (AnimationDrawable) mFingerprintAnimator.getDrawable();
- drawable.start();
+ final Drawable d = mFingerprintAnimator.getDrawable();
+ if (d instanceof AnimationDrawable) {
+ ((AnimationDrawable) d).start();
+ }
}
private void stopFingerprintAnimator() {
- AnimationDrawable drawable = (AnimationDrawable) mFingerprintAnimator.getDrawable();
- drawable.stop();
- drawable.setLevel(0);
+ final Drawable d = mFingerprintAnimator.getDrawable();
+ if (d instanceof AnimationDrawable) {
+ final AnimationDrawable drawable = (AnimationDrawable) d;
+ drawable.stop();
+ drawable.setLevel(0);
+ }
}
private void onStageChanged(Stage stage) {
// Update state
switch (stage) {
- case EnrollingOnboarding:
+ case EnrollingOnboard: // pass through
+ case EnrollingFindSensor:
mEnrollmentSteps = -1;
mEnrolling = false;
+ mFingerprintManager.stopListening();
break;
case EnrollingStart:
@@ -288,7 +317,7 @@ public class FingerprintEnroll extends SettingsActivity {
}
if (remaining >= 0) {
int progress = Math.max(0, mEnrollmentSteps + 1 - remaining);
- updateProgress(100*progress / (mEnrollmentSteps + 1));
+ updateProgress(PROGRESS_BAR_MAX * progress / (mEnrollmentSteps + 1));
// Treat fingerprint like a touch event
mPowerManager.userActivity(SystemClock.uptimeMillis(),
PowerManager.USER_ACTIVITY_EVENT_OTHER,
@@ -371,7 +400,7 @@ public class FingerprintEnroll extends SettingsActivity {
if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
if (resultCode == RESULT_FINISHED) {
// The lock pin/pattern/password was set. Start enrolling!
- updateStage(Stage.EnrollingStart);
+ updateStage(Stage.EnrollingFindSensor);
}
}
}
@@ -401,7 +430,10 @@ public class FingerprintEnroll extends SettingsActivity {
LockPatternUtils utils = new LockPatternUtils(activity);
if (!utils.isSecure()) {
// Device doesn't have any security. Set that up first.
- updateStage(Stage.EnrollingOnboarding);
+ updateStage(Stage.EnrollingOnboard);
+ } else if (ALWAYS_SHOW_FIND_SCREEN
+ || mFingerprintManager.getEnrolledFingerprints().size() == 0) {
+ updateStage(Stage.EnrollingFindSensor);
} else {
updateStage(Stage.EnrollingStart);
}
@@ -415,8 +447,10 @@ public class FingerprintEnroll extends SettingsActivity {
updateStage(Stage.EnrollingStart);
break;
case R.id.fingerprint_enroll_button_next:
- if (mStage == Stage.EnrollingOnboarding) {
+ if (mStage == Stage.EnrollingOnboard) {
launchChooseLock();
+ } else if (mStage == Stage.EnrollingFindSensor) {
+ updateStage(Stage.EnrollingStart);
} else if (mStage == Stage.EnrollingFinish) {
getActivity().finish();
} else {
@@ -429,6 +463,8 @@ public class FingerprintEnroll extends SettingsActivity {
private void launchChooseLock() {
Intent intent = new Intent();
intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName());
+ intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
+ DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
}
}
diff --git a/src/com/android/settings/FingerprintSettings.java b/src/com/android/settings/FingerprintSettings.java
new file mode 100644
index 00000000000..f91fcfa51b2
--- /dev/null
+++ b/src/com/android/settings/FingerprintSettings.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2015 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.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.service.fingerprint.FingerprintManager;
+import android.service.fingerprint.FingerprintManagerReceiver;
+import android.service.fingerprint.FingerprintManager.FingerprintItem;
+import android.util.Log;
+import android.widget.EditText;
+
+import com.android.settings.search.Indexable;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Settings screen for fingerprints
+ */
+public class FingerprintSettings extends SettingsActivity {
+
+ @Override
+ public Intent getIntent() {
+ Intent modIntent = new Intent(super.getIntent());
+ modIntent.putExtra(EXTRA_SHOW_FRAGMENT, FingerprintSettingsFragment.class.getName());
+ return modIntent;
+ }
+
+ @Override
+ protected boolean isValidFragment(String fragmentName) {
+ if (FingerprintSettingsFragment.class.getName().equals(fragmentName)) return true;
+ return false;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ CharSequence msg = getText(R.string.security_settings_fingerprint_preference_title);
+ setTitle(msg);
+ }
+
+ public static class FingerprintSettingsFragment extends SettingsPreferenceFragment
+ implements OnPreferenceChangeListener, Indexable {
+ private static final String TAG = "FingerprintSettings";
+ private static final String KEY_FINGERPRINT_ITEM = "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 int ADD_FINGERPRINT_REQUEST = 10;
+
+ private static final boolean ENABLE_USAGE_CATEGORY = false;
+
+ private FingerprintManager mFingerprintManager;
+ private HashMap mFingerprintMap
+ = new HashMap();
+ private EditText mDialogTextField;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mFingerprintManager = (FingerprintManager) getActivity().getSystemService(
+ Context.FINGERPRINT_SERVICE);
+ mFingerprintManager.startListening(new FingerprintManagerReceiver() {
+ @Override
+ public void onRemoved(int fingerprintId) {
+ Log.v(TAG, "Fingerprint template " + fingerprintId + " removed");
+ // TODO: this is a bit wasteful; just remove the fingerprint id item
+ createPreferenceHierarchy();
+ }
+ @Override
+ public void onProcessed(int fingerprintId) {
+ Log.v(TAG, "Fingerprint " + fingerprintId + " detected");
+ }
+ });
+ }
+
+ /**
+ * Important!
+ *
+ * Don't forget to update the SecuritySearchIndexProvider if you are doing any change in the
+ * logic or adding/removing preferences here.
+ */
+ private PreferenceScreen createPreferenceHierarchy() {
+ PreferenceScreen root = getPreferenceScreen();
+ if (root != null) {
+ root.removeAll();
+ }
+ addPreferencesFromResource(R.xml.security_settings_fingerprint);
+ root = getPreferenceScreen();
+
+ // Fingerprint items
+ PreferenceGroup manageCategory = (PreferenceGroup) root.findPreference(
+ KEY_MANAGE_CATEGORY);
+ if (manageCategory != null) {
+ addFingerprintItemPreferences(manageCategory);
+ }
+
+ // 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);
+ }
+ }
+
+ return root;
+ }
+
+ private void addFingerprintItemPreferences(PreferenceGroup manageFingerprintCategory) {
+ manageFingerprintCategory.removeAll();
+ List items = mFingerprintManager.getEnrolledFingerprints();
+ final int fingerprintCount = items.size();
+ mFingerprintMap.clear();
+ for (int i = 0; i < fingerprintCount; i++) {
+ Preference pref = new Preference(manageFingerprintCategory.getContext());
+ pref.setKey(KEY_FINGERPRINT_ITEM);
+ FingerprintItem item = items.get(i);
+ pref.setTitle(item.name);
+ manageFingerprintCategory.addPreference(pref);
+ pref.setOnPreferenceChangeListener(this);
+ mFingerprintMap.put(pref, item);
+ }
+ Preference addPreference = new Preference(manageFingerprintCategory.getContext());
+ addPreference.setKey(KEY_FINGERPRINT_ADD);
+ addPreference.setTitle(R.string.fingerprint_add_title);
+ manageFingerprintCategory.addPreference(addPreference);
+ addPreference.setOnPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Make sure we reload the preference hierarchy since fingerprints may be added,
+ // deleted or renamed.
+ createPreferenceHierarchy();
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) {
+ final String key = pref.getKey();
+ if (KEY_FINGERPRINT_ADD.equals(key)) {
+ Intent intent = new Intent();
+ intent.setClassName("com.android.settings", FingerprintEnroll.class.getName());
+ startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
+ } else if (KEY_FINGERPRINT_ITEM.equals(key)) {
+ final FingerprintItem item = mFingerprintMap.get(pref);
+ showRenameDeleteDialog(item.name, pref, item.id);
+ return super.onPreferenceTreeClick(preferenceScreen, pref);
+ }
+ return true;
+ }
+
+ private void showRenameDeleteDialog(final CharSequence name, Preference pref,
+ final int fpId) {
+ final Activity activity = getActivity();
+ AlertDialog dialog = new AlertDialog.Builder(activity)
+ .setView(R.layout.fingerprint_rename_dialog)
+ .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String newName = mDialogTextField.getText().toString();
+ if (!newName.equals(name)) {
+ Log.v(TAG, "Would rename " + name + " to " + newName);
+ mFingerprintManager.rename(fpId, newName);
+ }
+ dialog.dismiss();
+ }
+ })
+ .setNegativeButton(R.string.security_settings_fingerprint_enroll_dialog_delete,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Log.v(TAG, "Removing fpId " + fpId);
+ mFingerprintManager.remove(fpId);
+ dialog.dismiss();
+ }
+ })
+ .create();
+ dialog.show();
+ mDialogTextField = (EditText) dialog.findViewById(R.id.fingerprint_rename_field);
+ mDialogTextField.setText(name);
+ mDialogTextField.selectAll();
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ boolean result = true;
+ final String key = preference.getKey();
+ if (KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE.equals(key)) {
+ // TODO
+ } else {
+ Log.v(TAG, "Unknown key:" + key);
+ }
+ return result;
+ }
+
+ @Override
+ protected int getHelpResource() {
+ return R.string.help_url_security;
+ }
+ }
+}
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 95826e4e048..053e7f0c204 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -67,8 +67,9 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
*/
public class SecuritySettings extends SettingsPreferenceFragment
implements OnPreferenceChangeListener, DialogInterface.OnClickListener, Indexable {
+
+ private static final String TAG = "SecuritySettings";
private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent";
- static final String TAG = "SecuritySettings";
private static final Intent TRUST_AGENT_INTENT =
new Intent(TrustAgentService.SERVICE_INTERFACE);
@@ -81,6 +82,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings";
private static final String KEY_ADVANCED_SECURITY = "advanced_security";
private static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
+ private static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
@@ -337,21 +339,22 @@ public class SecuritySettings extends SettingsPreferenceFragment
return;
}
Preference fingerprintPreference = new Preference(securityCategory.getContext());
- fingerprintPreference.setKey(KEY_TRUST_AGENT);
+ fingerprintPreference.setKey(KEY_FINGERPRINT_SETTINGS);
fingerprintPreference.setTitle(R.string.security_settings_fingerprint_preference_title);
Intent intent = new Intent();
List items = fpm.getEnrolledFingerprints();
int fingerprintCount = items.size();
+ final String clazz;
if (fingerprintCount > 0) {
fingerprintPreference.setSummary(getResources().getQuantityString(
R.plurals.security_settings_fingerprint_preference_summary,
fingerprintCount, fingerprintCount));
- // TODO: Launch fingerprintSettings instead...
- intent.setClassName("com.android.settings", FingerprintEnroll.class.getName());
+ clazz = FingerprintSettings.class.getName();
} else {
- // No fingerprints registered, launch directly into fingerprint enrollment wizard
- intent.setClassName("com.android.settings", FingerprintEnroll.class.getName());
+ // No fingerprints registered, launch directly into enrollment wizard
+ clazz = FingerprintEnroll.class.getName();
}
+ intent.setClassName("com.android.settings", clazz);
fingerprintPreference.setIntent(intent);
securityCategory.addPreference(fingerprintPreference);
}