Profile Challenge Fingerprint Support

Change-Id: Ic83c479f645776dd0678721bfb732b399f09c992
This commit is contained in:
Clara Bayarri
2016-01-07 17:10:27 +00:00
parent 1b4e746a7f
commit 40db4bbbb5
15 changed files with 145 additions and 56 deletions

View File

@@ -150,6 +150,23 @@ public final class ChooseLockSettingsHelper {
false, false, true, challenge, Utils.getCredentialOwnerUserId(mActivity)); 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, private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
@Nullable CharSequence header, @Nullable CharSequence description, @Nullable CharSequence header, @Nullable CharSequence description,
boolean returnCredentials, boolean external, boolean hasChallenge, boolean returnCredentials, boolean external, boolean hasChallenge,

View File

@@ -22,6 +22,7 @@ import android.app.ActivityManagerNative;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.app.IActivityManager; import android.app.IActivityManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentSender; import android.content.IntentSender;
@@ -63,12 +64,16 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
private boolean mAllowFpAuthentication; private boolean mAllowFpAuthentication;
protected Button mCancelButton; protected Button mCancelButton;
protected ImageView mFingerprintIcon; protected ImageView mFingerprintIcon;
protected int mEffectiveUserId;
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mAllowFpAuthentication = getActivity().getIntent().getBooleanExtra( mAllowFpAuthentication = getActivity().getIntent().getBooleanExtra(
ALLOW_FP_AUTHENTICATION, false); 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 @Override
@@ -78,7 +83,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
mFingerprintIcon = (ImageView) view.findViewById(R.id.fingerprintIcon); mFingerprintIcon = (ImageView) view.findViewById(R.id.fingerprintIcon);
mFingerprintHelper = new FingerprintUiHelper( mFingerprintHelper = new FingerprintUiHelper(
mFingerprintIcon, mFingerprintIcon,
(TextView) view.findViewById(R.id.errorText), this); (TextView) view.findViewById(R.id.errorText), this, mEffectiveUserId);
boolean showCancelButton = getActivity().getIntent().getBooleanExtra( boolean showCancelButton = getActivity().getIntent().getBooleanExtra(
SHOW_CANCEL_BUTTON, false); SHOW_CANCEL_BUTTON, false);
mCancelButton.setVisibility(showCancelButton ? View.VISIBLE : View.GONE); mCancelButton.setVisibility(showCancelButton ? View.VISIBLE : View.GONE);
@@ -132,7 +137,12 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
public void onAuthenticated() { public void onAuthenticated() {
// Check whether we are still active. // Check whether we are still active.
if (getActivity() != null && getActivity().isResumed()) { if (getActivity() != null && getActivity().isResumed()) {
TrustManager trustManager =
(TrustManager) getActivity().getSystemService(Context.TRUST_SERVICE);
trustManager.setDeviceLockedForUser(mEffectiveUserId, false);
authenticationSucceeded(); authenticationSucceeded();
authenticationSucceeded();
checkForPendingIntent();
} }
} }

View File

@@ -99,7 +99,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
private AppearAnimationUtils mAppearAnimationUtils; private AppearAnimationUtils mAppearAnimationUtils;
private DisappearAnimationUtils mDisappearAnimationUtils; private DisappearAnimationUtils mDisappearAnimationUtils;
private boolean mBlockImm; private boolean mBlockImm;
private int mEffectiveUserId;
// required constructor for fragments // required constructor for fragments
public ConfirmLockPasswordFragment() { public ConfirmLockPasswordFragment() {
@@ -110,9 +109,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mLockPatternUtils = new LockPatternUtils(getActivity()); 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 @Override
@@ -183,14 +179,13 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
private int getDefaultDetails() { private int getDefaultDetails() {
boolean isProfile = Utils.isManagedProfile( boolean isProfile = Utils.isManagedProfile(
UserManager.get(getActivity()), mEffectiveUserId); UserManager.get(getActivity()), mEffectiveUserId);
if (mIsAlpha && !isProfile) { if (mIsAlpha) {
return R.string.lockpassword_confirm_your_password_generic; return isProfile ? R.string.lockpassword_confirm_your_password_generic_profile
} else if (mIsAlpha && isProfile) { : R.string.lockpassword_confirm_your_password_generic;
return R.string.lockpassword_confirm_your_password_generic_profile; } else {
} else if (!isProfile) { return isProfile ? R.string.lockpassword_confirm_your_pin_generic_profile
return R.string.lockpassword_confirm_your_pin_generic; : R.string.lockpassword_confirm_your_pin_generic;
} }
return R.string.lockpassword_confirm_your_pin_generic_profile;
} }
private int getErrorMessage() { private int getErrorMessage() {

View File

@@ -104,8 +104,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
private AppearAnimationUtils mAppearAnimationUtils; private AppearAnimationUtils mAppearAnimationUtils;
private DisappearAnimationUtils mDisappearAnimationUtils; private DisappearAnimationUtils mDisappearAnimationUtils;
private int mEffectiveUserId;
// required constructor for fragments // required constructor for fragments
public ConfirmLockPatternFragment() { public ConfirmLockPatternFragment() {
@@ -115,9 +113,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mLockPatternUtils = new LockPatternUtils(getActivity()); 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 @Override

View File

@@ -25,6 +25,8 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; 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;
import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.util.Log;
import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceScreen;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.internal.widget.LockPatternUtils; 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.Collections;
import java.util.HashSet; import java.util.HashSet;
@@ -218,6 +223,7 @@ public class ProfileChallengePreferenceFragment extends SettingsPreferenceFragme
PreferenceGroup securityCategory = (PreferenceGroup) PreferenceGroup securityCategory = (PreferenceGroup)
root.findPreference(KEY_SECURITY_CATEGORY); root.findPreference(KEY_SECURITY_CATEGORY);
if (securityCategory != null) { if (securityCategory != null) {
maybeAddFingerprintPreference(securityCategory);
if (mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileUserId)) { if (mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileUserId)) {
maybeAddUnificationPreference(securityCategory); maybeAddUnificationPreference(securityCategory);
} else { } 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) { private void removeNonWhitelistedItems(PreferenceGroup prefScreen) {
int numPreferences = prefScreen.getPreferenceCount(); int numPreferences = prefScreen.getPreferenceCount();
int i = 0; int i = 0;

View File

@@ -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_OWNER_INFO_SETTINGS = "owner_info_settings";
private static final String KEY_ADVANCED_SECURITY = "advanced_security"; 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_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 SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
private static final int CHANGE_TRUST_AGENT_SETTINGS = 126; private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
@@ -375,33 +374,13 @@ public class SecuritySettings extends SettingsPreferenceFragment
} }
private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) { private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) {
FingerprintManager fpm = (FingerprintManager) getActivity().getSystemService( Preference fingerprintPreference =
Context.FINGERPRINT_SERVICE); FingerprintSettings.getFingerprintPreferenceForUser(
if (!fpm.isHardwareDetected()) { securityCategory.getContext(), UserHandle.myUserId());
Log.v(TAG, "No fingerprint hardware detected!!"); if (fingerprintPreference != null) {
return;
}
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<Fingerprint> 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); securityCategory.addPreference(fingerprintPreference);
} }
}
private void addTrustAgentSettings(PreferenceGroup securityCategory) { private void addTrustAgentSettings(PreferenceGroup securityCategory) {
final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID); final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID);

View File

@@ -20,6 +20,7 @@ import android.annotation.Nullable;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
@@ -42,6 +43,7 @@ public abstract class FingerprintEnrollBase extends InstrumentedActivity
static final int RESULT_TIMEOUT = FingerprintSettings.RESULT_TIMEOUT; static final int RESULT_TIMEOUT = FingerprintSettings.RESULT_TIMEOUT;
protected byte[] mToken; protected byte[] mToken;
protected int mUserId;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -53,6 +55,7 @@ public abstract class FingerprintEnrollBase extends InstrumentedActivity
mToken = savedInstanceState.getByteArray( mToken = savedInstanceState.getByteArray(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
} }
mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId());
} }
@Override @Override
@@ -127,6 +130,9 @@ public abstract class FingerprintEnrollBase extends InstrumentedActivity
Intent intent = new Intent(); Intent intent = new Intent();
intent.setClassName("com.android.settings", FingerprintEnrollEnrolling.class.getName()); intent.setClassName("com.android.settings", FingerprintEnrollEnrolling.class.getName());
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
if (mUserId != UserHandle.USER_NULL) {
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
}
return intent; return intent;
} }
} }

View File

@@ -32,6 +32,7 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
@@ -221,6 +222,9 @@ public class FingerprintEnrollEnrolling extends FingerprintEnrollBase
Intent intent = getFinishIntent(); Intent intent = getFinishIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
if (mUserId != UserHandle.USER_NULL) {
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
}
startActivity(intent); startActivity(intent);
finish(); finish();
} }

View File

@@ -19,6 +19,7 @@ package com.android.settings.fingerprint;
import android.content.Intent; import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.settings.ChooseLockSettingsHelper; import com.android.settings.ChooseLockSettingsHelper;
@@ -173,10 +174,17 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase {
private void launchConfirmLock() { private void launchConfirmLock() {
long challenge = getSystemService(FingerprintManager.class).preEnroll(); long challenge = getSystemService(FingerprintManager.class).preEnroll();
ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this); 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), 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 // This shouldn't happen, as we should only end up at this step if a lock thingy is
// already set. // already set.
finish(); finish();

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
@@ -39,7 +40,7 @@ public class FingerprintEnrollFinish extends FingerprintEnrollBase {
Button addButton = (Button) findViewById(R.id.add_another_button); Button addButton = (Button) findViewById(R.id.add_another_button);
FingerprintManager fpm = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE); FingerprintManager fpm = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
int enrolled = fpm.getEnrolledFingerprints().size(); int enrolled = fpm.getEnrolledFingerprints(mUserId).size();
int max = getResources().getInteger( int max = getResources().getInteger(
com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser); com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
if (enrolled >= max) { if (enrolled >= max) {

View File

@@ -46,14 +46,12 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title); setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title);
findViewById(R.id.cancel_button).setOnClickListener(this); findViewById(R.id.cancel_button).setOnClickListener(this);
findViewById(R.id.learn_more_button).setOnClickListener(this); findViewById(R.id.learn_more_button).setOnClickListener(this);
final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
.getActivePasswordQuality(UserHandle.myUserId());
updatePasswordQuality(); updatePasswordQuality();
} }
private void updatePasswordQuality() { private void updatePasswordQuality() {
final int passwordQuality = new ChooseLockSettingsHelper(this).utils() final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
.getActivePasswordQuality(UserHandle.myUserId()); .getActivePasswordQuality(mUserId);
mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; 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_HAS_CHALLENGE, true);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true); 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); startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
} }
@@ -93,7 +94,11 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
} }
protected Intent getFindSensorIntent() { 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 @Override

View File

@@ -20,6 +20,7 @@ import android.app.admin.DevicePolicyManager;
import android.content.Intent; import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.settings.ChooseLockGeneric; 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_HAS_CHALLENGE, true);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true); 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); startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
} }
@@ -76,6 +80,9 @@ public class FingerprintEnrollOnboard extends FingerprintEnrollBase {
private void launchFindSensor(byte[] token) { private void launchFindSensor(byte[] token) {
Intent intent = getFindSensorIntent(); Intent intent = getFindSensorIntent();
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
if (mUserId != UserHandle.USER_NULL) {
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
}
startActivity(intent); startActivity(intent);
finish(); finish();
} }

View File

@@ -18,10 +18,12 @@ package com.android.settings.fingerprint;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.CancellationSignal; import android.os.CancellationSignal;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.settings.ChooseLockSettingsHelper; import com.android.settings.ChooseLockSettingsHelper;
@@ -40,6 +42,8 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment {
private Handler mHandler = new Handler(); private Handler mHandler = new Handler();
private byte[] mToken; private byte[] mToken;
private boolean mDone; private boolean mDone;
private int mUserId;
private FingerprintManager mFingerprintManager;
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -50,8 +54,10 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment {
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
super.onAttach(activity); super.onAttach(activity);
mFingerprintManager = activity.getSystemService(FingerprintManager.class);
mToken = activity.getIntent().getByteArrayExtra( mToken = activity.getIntent().getByteArrayExtra(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
mUserId = activity.getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL);
} }
@Override @Override
@@ -74,8 +80,11 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment {
mHandler.removeCallbacks(mTimeoutRunnable); mHandler.removeCallbacks(mTimeoutRunnable);
mEnrollmentSteps = -1; mEnrollmentSteps = -1;
mEnrollmentCancel = new CancellationSignal(); mEnrollmentCancel = new CancellationSignal();
getActivity().getSystemService(FingerprintManager.class).enroll(mToken, mEnrollmentCancel, if (mUserId != UserHandle.USER_NULL) {
0 /* flags */, mEnrollmentCallback); mFingerprintManager.setActiveUser(mUserId);
}
mFingerprintManager.enroll(mToken, mEnrollmentCancel,
0 /* flags */, mEnrollmentCallback, mUserId);
mEnrolling = true; mEnrolling = true;
} }

View File

@@ -72,6 +72,8 @@ import java.util.List;
*/ */
public class FingerprintSettings extends SubSettings { public class FingerprintSettings extends SubSettings {
private static final String TAG = "FingerprintSettings";
/** /**
* Used by the choose fingerprint wizard to indicate the wizard is * Used by the choose fingerprint wizard to indicate the wizard is
* finished, and each activity in the wizard should finish. * 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 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 @Override
public Intent getIntent() { public Intent getIntent() {
Intent modIntent = new Intent(super.getIntent()); Intent modIntent = new Intent(super.getIntent());
@@ -765,4 +769,34 @@ public class FingerprintSettings extends SubSettings {
return builder; 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<Fingerprint> 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;
}
} }

View File

@@ -34,21 +34,26 @@ public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallba
private ImageView mIcon; private ImageView mIcon;
private TextView mErrorTextView; private TextView mErrorTextView;
private CancellationSignal mCancellationSignal; private CancellationSignal mCancellationSignal;
private int mUserId;
private Callback mCallback; private Callback mCallback;
private FingerprintManager mFingerprintManager; 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); mFingerprintManager = icon.getContext().getSystemService(FingerprintManager.class);
mIcon = icon; mIcon = icon;
mErrorTextView = errorTextView; mErrorTextView = errorTextView;
mCallback = callback; mCallback = callback;
mUserId = userId;
} }
public void startListening() { public void startListening() {
if (mFingerprintManager.getEnrolledFingerprints().size() > 0) { if (mFingerprintManager.getEnrolledFingerprints(mUserId).size() > 0) {
mCancellationSignal = new CancellationSignal(); 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); setFingerprintIconVisibility(true);
mIcon.setImageResource(R.drawable.ic_fingerprint); mIcon.setImageResource(R.drawable.ic_fingerprint);
} }