Merge "Add authenticator-aware string methods to BiometricManager" into sc-dev

This commit is contained in:
Curtis Belmonte
2021-03-04 05:42:09 +00:00
committed by Android (Google) Code Review
10 changed files with 437 additions and 17 deletions

View File

@@ -62,10 +62,13 @@ public interface BiometricAuthenticator {
* @hide
*/
int TYPE_FACE = 1 << 3;
@IntDef({TYPE_NONE,
@IntDef(flag = true, value = {
TYPE_NONE,
TYPE_CREDENTIAL,
TYPE_FINGERPRINT,
TYPE_IRIS})
TYPE_IRIS
})
@Retention(RetentionPolicy.SOURCE)
@interface Modality {}

View File

@@ -23,6 +23,7 @@ import static android.Manifest.permission.WRITE_DEVICE_CONFIG;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -193,15 +194,15 @@ public class BiometricManager {
int DEVICE_CREDENTIAL = 1 << 15;
}
private final Context mContext;
private final IAuthService mService;
@NonNull private final Context mContext;
@NonNull private final IAuthService mService;
/**
* @hide
* @param context
* @param service
*/
public BiometricManager(Context context, IAuthService service) {
public BiometricManager(@NonNull Context context, @NonNull IAuthService service) {
mContext = context;
mService = service;
}
@@ -274,7 +275,8 @@ public class BiometricManager {
*/
@Deprecated
@RequiresPermission(USE_BIOMETRIC)
public @BiometricError int canAuthenticate() {
@BiometricError
public int canAuthenticate() {
return canAuthenticate(Authenticators.BIOMETRIC_WEAK);
}
@@ -304,7 +306,8 @@ public class BiometricManager {
* authenticators can currently be used (enrolled and available).
*/
@RequiresPermission(USE_BIOMETRIC)
public @BiometricError int canAuthenticate(@Authenticators.Types int authenticators) {
@BiometricError
public int canAuthenticate(@Authenticators.Types int authenticators) {
return canAuthenticate(mContext.getUserId(), authenticators);
}
@@ -312,8 +315,10 @@ public class BiometricManager {
* @hide
*/
@RequiresPermission(USE_BIOMETRIC_INTERNAL)
public @BiometricError int canAuthenticate(int userId,
@Authenticators.Types int authenticators) {
@BiometricError
public int canAuthenticate(
int userId, @Authenticators.Types int authenticators) {
if (mService != null) {
try {
final String opPackageName = mContext.getOpPackageName();
@@ -322,7 +327,7 @@ public class BiometricManager {
throw e.rethrowFromSystemServer();
}
} else {
Slog.w(TAG, "hasEnrolledBiometrics(): Service not connected");
Slog.w(TAG, "canAuthenticate(): Service not connected");
return BIOMETRIC_ERROR_HW_UNAVAILABLE;
}
}
@@ -404,5 +409,115 @@ public class BiometricManager {
}
}
/**
* Provides a localized string that may be used as the label for a button that invokes
* {@link BiometricPrompt}.
*
* <p>When possible, this method should use the given authenticator requirements to more
* precisely specify the authentication type that will be used. For example, if
* <strong>Class 3</strong> biometric authentication is requested on a device with a
* <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor, the
* returned string should indicate that fingerprint authentication will be used.
*
* <p>This method should also try to specify which authentication method(s) will be used in
* practice when multiple authenticators meet the given requirements. For example, if biometric
* authentication is requested on a device with both face and fingerprint sensors but the user
* has selected face as their preferred method, the returned string should indicate that face
* authentication will be used.
*
* @param authenticators A bit field representing the types of {@link Authenticators} that may
* be used for authentication.
* @return The label for a button that invokes {@link BiometricPrompt} for authentication.
*/
@RequiresPermission(USE_BIOMETRIC)
@Nullable
public CharSequence getButtonLabel(@Authenticators.Types int authenticators) {
if (mService != null) {
final int userId = mContext.getUserId();
final String opPackageName = mContext.getOpPackageName();
try {
return mService.getButtonLabel(userId, opPackageName, authenticators);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} else {
Slog.w(TAG, "getButtonLabel(): Service not connected");
return null;
}
}
/**
* Provides a localized string that may be shown while the user is authenticating with
* {@link BiometricPrompt}.
*
* <p>When possible, this method should use the given authenticator requirements to more
* precisely specify the authentication type that will be used. For example, if
* <strong>Class 3</strong> biometric authentication is requested on a device with a
* <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor, the
* returned string should indicate that fingerprint authentication will be used.
*
* <p>This method should also try to specify which authentication method(s) will be used in
* practice when multiple authenticators meet the given requirements. For example, if biometric
* authentication is requested on a device with both face and fingerprint sensors but the user
* has selected face as their preferred method, the returned string should indicate that face
* authentication will be used.
*
* @param authenticators A bit field representing the types of {@link Authenticators} that may
* be used for authentication.
* @return The label for a button that invokes {@link BiometricPrompt} for authentication.
*/
@RequiresPermission(USE_BIOMETRIC)
@Nullable
public CharSequence getPromptMessage(@Authenticators.Types int authenticators) {
if (mService != null) {
final int userId = mContext.getUserId();
final String opPackageName = mContext.getOpPackageName();
try {
return mService.getPromptMessage(userId, opPackageName, authenticators);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} else {
Slog.w(TAG, "getPromptMessage(): Service not connected");
return null;
}
}
/**
* Provides a localized string that may be shown as the title for an app setting that enables
* biometric authentication.
*
* <p>When possible, this method should use the given authenticator requirements to more
* precisely specify the authentication type that will be used. For example, if
* <strong>Class 3</strong> biometric authentication is requested on a device with a
* <strong>Class 3</strong> fingerprint sensor and a <strong>Class 2</strong> face sensor, the
* returned string should indicate that fingerprint authentication will be used.
*
* <p>This method should <em>not</em> try to specify which authentication method(s) will be used
* in practice when multiple authenticators meet the given requirements. For example, if
* biometric authentication is requested on a device with both face and fingerprint sensors, the
* returned string should indicate that either face or fingerprint authentication may be used,
* regardless of whether the user has enrolled or selected either as their preferred method.
*
* @param authenticators A bit field representing the types of {@link Authenticators} that may
* be used for authentication.
* @return The label for a button that invokes {@link BiometricPrompt} for authentication.
*/
@RequiresPermission(USE_BIOMETRIC)
@Nullable
public CharSequence getSettingName(@Authenticators.Types int authenticators) {
if (mService != null) {
final int userId = mContext.getUserId();
final String opPackageName = mContext.getOpPackageName();
try {
return mService.getSettingName(userId, opPackageName, authenticators);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
} else {
Slog.w(TAG, "getSettingName(): Service not connected");
return null;
}
}
}

View File

@@ -68,4 +68,16 @@ interface IAuthService {
// the requirements for integrating with Keystore. The AuthenticatorID are known in Keystore
// land as SIDs, and are used during key generation.
long[] getAuthenticatorIds();
// Provides a localized string that may be used as the label for a button that invokes
// BiometricPrompt.
CharSequence getButtonLabel(int userId, String opPackageName, int authenticators);
// Provides a localized string that may be shown while the user is authenticating with
// BiometricPrompt.
CharSequence getPromptMessage(int userId, String opPackageName, int authenticators);
// Provides a localized string that may be shown as the title for an app setting that enables
// biometric authentication.
CharSequence getSettingName(int userId, String opPackageName, int authenticators);
}

View File

@@ -75,4 +75,10 @@ interface IBiometricService {
long[] getAuthenticatorIds(int callingUserId);
int getCurrentStrength(int sensorId);
// Returns a bit field of the modality (or modalities) that are will be used for authentication.
int getCurrentModality(String opPackageName, int userId, int callingUserId, int authenticators);
// Returns a bit field of the authentication modalities that are supported by this device.
int getSupportedModalities(int authenticators);
}