diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java index 70ecdfd8465..1035ef11935 100644 --- a/src/com/android/settings/ChooseLockSettingsHelper.java +++ b/src/com/android/settings/ChooseLockSettingsHelper.java @@ -150,6 +150,23 @@ public final class ChooseLockSettingsHelper { false, false, true, challenge, Utils.getCredentialOwnerUserId(mActivity)); } + /** + * If a pattern, password or PIN exists, prompt the user before allowing them to change it. + * @param message optional message to display about the action about to be done + * @param details optional detail message to display + * @param challenge a challenge to be verified against the device credential. + * This method can only be called internally. + * @param userId The userId for whom the lock should be confirmed. + * @return true if one exists and we launched an activity to confirm it + * @see #onActivityResult(int, int, android.content.Intent) + */ + public boolean launchConfirmationActivity(int request, @Nullable CharSequence title, + @Nullable CharSequence header, @Nullable CharSequence description, + long challenge, int userId) { + return launchConfirmationActivity(request, title, header, description, + false, false, true, challenge, Utils.enforceSameOwner(mActivity, userId)); + } + private boolean launchConfirmationActivity(int request, @Nullable CharSequence title, @Nullable CharSequence header, @Nullable CharSequence description, boolean returnCredentials, boolean external, boolean hasChallenge, diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java index 86c9fca221f..40e3103bf37 100644 --- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java @@ -22,6 +22,7 @@ import android.app.ActivityManagerNative; import android.app.ActivityOptions; import android.app.IActivityManager; import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; import android.content.Context; import android.content.Intent; import android.content.IntentSender; @@ -63,12 +64,16 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr private boolean mAllowFpAuthentication; protected Button mCancelButton; protected ImageView mFingerprintIcon; + protected int mEffectiveUserId; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAllowFpAuthentication = getActivity().getIntent().getBooleanExtra( ALLOW_FP_AUTHENTICATION, false); + // Only take this argument into account if it belongs to the current profile. + Intent intent = getActivity().getIntent(); + mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); } @Override @@ -78,7 +83,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr mFingerprintIcon = (ImageView) view.findViewById(R.id.fingerprintIcon); mFingerprintHelper = new FingerprintUiHelper( mFingerprintIcon, - (TextView) view.findViewById(R.id.errorText), this); + (TextView) view.findViewById(R.id.errorText), this, mEffectiveUserId); boolean showCancelButton = getActivity().getIntent().getBooleanExtra( SHOW_CANCEL_BUTTON, false); mCancelButton.setVisibility(showCancelButton ? View.VISIBLE : View.GONE); @@ -132,7 +137,12 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr public void onAuthenticated() { // Check whether we are still active. if (getActivity() != null && getActivity().isResumed()) { + TrustManager trustManager = + (TrustManager) getActivity().getSystemService(Context.TRUST_SERVICE); + trustManager.setDeviceLockedForUser(mEffectiveUserId, false); authenticationSucceeded(); + authenticationSucceeded(); + checkForPendingIntent(); } } diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java index f6347c18595..e1362ea1ce3 100644 --- a/src/com/android/settings/ConfirmLockPassword.java +++ b/src/com/android/settings/ConfirmLockPassword.java @@ -99,7 +99,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { private AppearAnimationUtils mAppearAnimationUtils; private DisappearAnimationUtils mDisappearAnimationUtils; private boolean mBlockImm; - private int mEffectiveUserId; // required constructor for fragments public ConfirmLockPasswordFragment() { @@ -110,9 +109,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLockPatternUtils = new LockPatternUtils(getActivity()); - Intent intent = getActivity().getIntent(); - // Only take this argument into account if it belongs to the current profile. - mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); } @Override @@ -183,14 +179,13 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { private int getDefaultDetails() { boolean isProfile = Utils.isManagedProfile( UserManager.get(getActivity()), mEffectiveUserId); - if (mIsAlpha && !isProfile) { - return R.string.lockpassword_confirm_your_password_generic; - } else if (mIsAlpha && isProfile) { - return R.string.lockpassword_confirm_your_password_generic_profile; - } else if (!isProfile) { - return R.string.lockpassword_confirm_your_pin_generic; + if (mIsAlpha) { + return isProfile ? R.string.lockpassword_confirm_your_password_generic_profile + : R.string.lockpassword_confirm_your_password_generic; + } else { + return isProfile ? R.string.lockpassword_confirm_your_pin_generic_profile + : R.string.lockpassword_confirm_your_pin_generic; } - return R.string.lockpassword_confirm_your_pin_generic_profile; } private int getErrorMessage() { diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java index 5c72bd1e43c..922d1c72cd2 100644 --- a/src/com/android/settings/ConfirmLockPattern.java +++ b/src/com/android/settings/ConfirmLockPattern.java @@ -104,8 +104,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { private AppearAnimationUtils mAppearAnimationUtils; private DisappearAnimationUtils mDisappearAnimationUtils; - private int mEffectiveUserId; - // required constructor for fragments public ConfirmLockPatternFragment() { @@ -115,9 +113,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLockPatternUtils = new LockPatternUtils(getActivity()); - Intent intent = getActivity().getIntent(); - // Only take this argument into account if it belongs to the current profile. - mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); } @Override diff --git a/src/com/android/settings/ProfileChallengePreferenceFragment.java b/src/com/android/settings/ProfileChallengePreferenceFragment.java index 4b575522acd..5d396410226 100644 --- a/src/com/android/settings/ProfileChallengePreferenceFragment.java +++ b/src/com/android/settings/ProfileChallengePreferenceFragment.java @@ -25,6 +25,8 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.UserInfo; +import android.hardware.fingerprint.Fingerprint; +import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -34,12 +36,15 @@ import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.support.v7.preference.Preference.OnPreferenceClickListener; +import android.util.Log; import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import com.android.internal.logging.MetricsLogger; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.fingerprint.FingerprintEnrollIntroduction; +import com.android.settings.fingerprint.FingerprintSettings; import java.util.Collections; import java.util.HashSet; @@ -218,6 +223,7 @@ public class ProfileChallengePreferenceFragment extends SettingsPreferenceFragme PreferenceGroup securityCategory = (PreferenceGroup) root.findPreference(KEY_SECURITY_CATEGORY); if (securityCategory != null) { + maybeAddFingerprintPreference(securityCategory); if (mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileUserId)) { maybeAddUnificationPreference(securityCategory); } else { @@ -241,6 +247,14 @@ public class ProfileChallengePreferenceFragment extends SettingsPreferenceFragme } } + private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) { + Preference fingerprintPreference = + FingerprintSettings.getFingerprintPreferenceForUser(getActivity(), mProfileUserId); + if (fingerprintPreference != null) { + securityCategory.addPreference(fingerprintPreference); + } + } + private void removeNonWhitelistedItems(PreferenceGroup prefScreen) { int numPreferences = prefScreen.getPreferenceCount(); int i = 0; diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index d39203d6250..a324d9c6ce5 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -90,7 +90,6 @@ 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; @@ -375,32 +374,12 @@ public class SecuritySettings extends SettingsPreferenceFragment } private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) { - FingerprintManager fpm = (FingerprintManager) getActivity().getSystemService( - Context.FINGERPRINT_SERVICE); - if (!fpm.isHardwareDetected()) { - Log.v(TAG, "No fingerprint hardware detected!!"); - return; + Preference fingerprintPreference = + FingerprintSettings.getFingerprintPreferenceForUser( + securityCategory.getContext(), UserHandle.myUserId()); + if (fingerprintPreference != null) { + securityCategory.addPreference(fingerprintPreference); } - Preference fingerprintPreference = new Preference(securityCategory.getContext()); - fingerprintPreference.setKey(KEY_FINGERPRINT_SETTINGS); - fingerprintPreference.setTitle(R.string.security_settings_fingerprint_preference_title); - Intent intent = new Intent(); - final List items = fpm.getEnrolledFingerprints(); - final int fingerprintCount = items != null ? items.size() : 0; - final String clazz; - if (fingerprintCount > 0) { - fingerprintPreference.setSummary(getResources().getQuantityString( - R.plurals.security_settings_fingerprint_preference_summary, - fingerprintCount, fingerprintCount)); - clazz = FingerprintSettings.class.getName(); - } else { - fingerprintPreference.setSummary( - R.string.security_settings_fingerprint_preference_summary_none); - clazz = FingerprintEnrollIntroduction.class.getName(); - } - intent.setClassName("com.android.settings", clazz); - fingerprintPreference.setIntent(intent); - securityCategory.addPreference(fingerprintPreference); } private void addTrustAgentSettings(PreferenceGroup securityCategory) { diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollBase.java b/src/com/android/settings/fingerprint/FingerprintEnrollBase.java index 28430407907..20bbadca93f 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollBase.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollBase.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import android.os.UserHandle; import android.text.TextUtils; import android.view.View; import android.view.WindowManager; @@ -42,6 +43,7 @@ public abstract class FingerprintEnrollBase extends InstrumentedActivity static final int RESULT_TIMEOUT = FingerprintSettings.RESULT_TIMEOUT; protected byte[] mToken; + protected int mUserId; @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,6 +55,7 @@ public abstract class FingerprintEnrollBase extends InstrumentedActivity mToken = savedInstanceState.getByteArray( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); } + mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); } @Override @@ -127,6 +130,9 @@ public abstract class FingerprintEnrollBase extends InstrumentedActivity Intent intent = new Intent(); intent.setClassName("com.android.settings", FingerprintEnrollEnrolling.class.getName()); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken); + if (mUserId != UserHandle.USER_NULL) { + intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + } return intent; } } diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java index 322a92c5d86..36dfbfe4e72 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java @@ -32,6 +32,7 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; +import android.os.UserHandle; import android.view.MotionEvent; import android.view.View; import android.view.animation.AnimationUtils; @@ -221,6 +222,9 @@ public class FingerprintEnrollEnrolling extends FingerprintEnrollBase Intent intent = getFinishIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); + if (mUserId != UserHandle.USER_NULL) { + intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + } startActivity(intent); finish(); } diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java index c17dc706112..b85895044f3 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java @@ -19,6 +19,7 @@ package com.android.settings.fingerprint; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; +import android.os.UserHandle; import com.android.internal.logging.MetricsLogger; import com.android.settings.ChooseLockSettingsHelper; @@ -173,10 +174,17 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { private void launchConfirmLock() { long challenge = getSystemService(FingerprintManager.class).preEnroll(); ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this); - if (!helper.launchConfirmationActivity(CONFIRM_REQUEST, + boolean launchedConfirmationActivity = false; + if (mUserId == UserHandle.USER_NULL) { + launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST, getString(R.string.security_settings_fingerprint_preference_title), - null, null, challenge)) { - + null, null, challenge); + } else { + launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST, + getString(R.string.security_settings_fingerprint_preference_title), + null, null, challenge, mUserId); + } + if (!launchedConfirmationActivity) { // This shouldn't happen, as we should only end up at this step if a lock thingy is // already set. finish(); diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java index 80124e0e5f8..8ec4ec01aa3 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; +import android.os.UserHandle; import android.view.View; import android.widget.Button; @@ -39,7 +40,7 @@ public class FingerprintEnrollFinish extends FingerprintEnrollBase { Button addButton = (Button) findViewById(R.id.add_another_button); FingerprintManager fpm = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE); - int enrolled = fpm.getEnrolledFingerprints().size(); + int enrolled = fpm.getEnrolledFingerprints(mUserId).size(); int max = getResources().getInteger( com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser); if (enrolled >= max) { diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java index 61cecf4e2e2..c1347f53cda 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java @@ -46,14 +46,12 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase { setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title); findViewById(R.id.cancel_button).setOnClickListener(this); findViewById(R.id.learn_more_button).setOnClickListener(this); - final int passwordQuality = new ChooseLockSettingsHelper(this).utils() - .getActivePasswordQuality(UserHandle.myUserId()); updatePasswordQuality(); } private void updatePasswordQuality() { final int passwordQuality = new ChooseLockSettingsHelper(this).utils() - .getActivePasswordQuality(UserHandle.myUserId()); + .getActivePasswordQuality(mUserId); mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; } @@ -77,6 +75,9 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase { intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true); + if (mUserId != UserHandle.USER_NULL) { + intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + } startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST); } @@ -93,7 +94,11 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase { } protected Intent getFindSensorIntent() { - return new Intent(this, FingerprintEnrollFindSensor.class); + Intent intent = new Intent(this, FingerprintEnrollFindSensor.class); + if (mUserId != UserHandle.USER_NULL) { + intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + } + return intent; } @Override diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java b/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java index 0990459c23e..1b80589c17f 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java @@ -20,6 +20,7 @@ import android.app.admin.DevicePolicyManager; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; +import android.os.UserHandle; import com.android.internal.logging.MetricsLogger; import com.android.settings.ChooseLockGeneric; @@ -66,6 +67,9 @@ public class FingerprintEnrollOnboard extends FingerprintEnrollBase { intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true); + if (mUserId != UserHandle.USER_NULL) { + intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + } startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST); } @@ -76,6 +80,9 @@ public class FingerprintEnrollOnboard extends FingerprintEnrollBase { private void launchFindSensor(byte[] token) { Intent intent = getFindSensorIntent(); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); + if (mUserId != UserHandle.USER_NULL) { + intent.putExtra(Intent.EXTRA_USER_ID, mUserId); + } startActivity(intent); finish(); } diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java index 72c06db94c3..d0fcda00319 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java @@ -18,10 +18,12 @@ package com.android.settings.fingerprint; import android.annotation.Nullable; import android.app.Activity; +import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; +import android.os.UserHandle; import com.android.internal.logging.MetricsLogger; import com.android.settings.ChooseLockSettingsHelper; @@ -40,6 +42,8 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { private Handler mHandler = new Handler(); private byte[] mToken; private boolean mDone; + private int mUserId; + private FingerprintManager mFingerprintManager; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -50,8 +54,10 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { @Override public void onAttach(Activity activity) { super.onAttach(activity); + mFingerprintManager = activity.getSystemService(FingerprintManager.class); mToken = activity.getIntent().getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); + mUserId = activity.getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL); } @Override @@ -74,8 +80,11 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { mHandler.removeCallbacks(mTimeoutRunnable); mEnrollmentSteps = -1; mEnrollmentCancel = new CancellationSignal(); - getActivity().getSystemService(FingerprintManager.class).enroll(mToken, mEnrollmentCancel, - 0 /* flags */, mEnrollmentCallback); + if (mUserId != UserHandle.USER_NULL) { + mFingerprintManager.setActiveUser(mUserId); + } + mFingerprintManager.enroll(mToken, mEnrollmentCancel, + 0 /* flags */, mEnrollmentCallback, mUserId); mEnrolling = true; } diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java index 9e90c008115..56e9b12bd35 100644 --- a/src/com/android/settings/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/fingerprint/FingerprintSettings.java @@ -72,6 +72,8 @@ import java.util.List; */ public class FingerprintSettings extends SubSettings { + private static final String TAG = "FingerprintSettings"; + /** * Used by the choose fingerprint wizard to indicate the wizard is * finished, and each activity in the wizard should finish. @@ -98,6 +100,8 @@ public class FingerprintSettings extends SubSettings { private static final long LOCKOUT_DURATION = 30000; // time we have to wait for fp to reset, ms + public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; + @Override public Intent getIntent() { Intent modIntent = new Intent(super.getIntent()); @@ -765,4 +769,34 @@ public class FingerprintSettings extends SubSettings { return builder; } } + + public static Preference getFingerprintPreferenceForUser(Context context, int userId) { + FingerprintManager fpm = (FingerprintManager) context.getSystemService( + Context.FINGERPRINT_SERVICE); + if (!fpm.isHardwareDetected()) { + Log.v(TAG, "No fingerprint hardware detected!!"); + return null; + } + Preference fingerprintPreference = new Preference(context); + fingerprintPreference.setKey(KEY_FINGERPRINT_SETTINGS); + fingerprintPreference.setTitle(R.string.security_settings_fingerprint_preference_title); + Intent intent = new Intent(); + final List items = fpm.getEnrolledFingerprints(userId); + final int fingerprintCount = items != null ? items.size() : 0; + final String clazz; + if (fingerprintCount > 0) { + fingerprintPreference.setSummary(context.getResources().getQuantityString( + R.plurals.security_settings_fingerprint_preference_summary, + fingerprintCount, fingerprintCount)); + clazz = FingerprintSettings.class.getName(); + } else { + fingerprintPreference.setSummary( + R.string.security_settings_fingerprint_preference_summary_none); + clazz = FingerprintEnrollIntroduction.class.getName(); + } + intent.setClassName("com.android.settings", clazz); + intent.putExtra(Intent.EXTRA_USER_ID, userId); + fingerprintPreference.setIntent(intent); + return fingerprintPreference; + } } diff --git a/src/com/android/settings/fingerprint/FingerprintUiHelper.java b/src/com/android/settings/fingerprint/FingerprintUiHelper.java index 245cbb44060..cf37050e219 100644 --- a/src/com/android/settings/fingerprint/FingerprintUiHelper.java +++ b/src/com/android/settings/fingerprint/FingerprintUiHelper.java @@ -34,21 +34,26 @@ public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallba private ImageView mIcon; private TextView mErrorTextView; private CancellationSignal mCancellationSignal; + private int mUserId; private Callback mCallback; private FingerprintManager mFingerprintManager; - public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback) { + public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback, + int userId) { mFingerprintManager = icon.getContext().getSystemService(FingerprintManager.class); mIcon = icon; mErrorTextView = errorTextView; mCallback = callback; + mUserId = userId; } public void startListening() { - if (mFingerprintManager.getEnrolledFingerprints().size() > 0) { + if (mFingerprintManager.getEnrolledFingerprints(mUserId).size() > 0) { mCancellationSignal = new CancellationSignal(); - mFingerprintManager.authenticate(null, mCancellationSignal, 0 /* flags */, this, null); + mFingerprintManager.setActiveUser(mUserId); + mFingerprintManager.authenticate( + null, mCancellationSignal, 0 /* flags */, this, null, mUserId); setFingerprintIconVisibility(true); mIcon.setImageResource(R.drawable.ic_fingerprint); }