Profile Challenge Fingerprint Support
Change-Id: Ic83c479f645776dd0678721bfb732b399f09c992
This commit is contained in:
@@ -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,
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user