Merge "Add biometric component info and face type into SensorPropertiesInternal" into sc-dev

This commit is contained in:
Haining Chen
2021-03-19 03:49:10 +00:00
committed by Android (Google) Code Review
20 changed files with 449 additions and 28 deletions

View File

@@ -1053,6 +1053,7 @@ package android.hardware.biometrics {
}
public class SensorProperties {
method @NonNull public java.util.List<android.hardware.biometrics.SensorProperties.ComponentInfo> getComponentInfo();
method public int getSensorId();
method public int getSensorStrength();
field public static final int STRENGTH_CONVENIENCE = 0; // 0x0
@@ -1060,6 +1061,14 @@ package android.hardware.biometrics {
field public static final int STRENGTH_WEAK = 1; // 0x1
}
public static final class SensorProperties.ComponentInfo {
method @NonNull public String getComponentId();
method @NonNull public String getFirmwareVersion();
method @NonNull public String getHardwareVersion();
method @NonNull public String getSerialNumber();
method @NonNull public String getSoftwareVersion();
}
}
package android.hardware.camera2 {

View File

@@ -0,0 +1,18 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.biometrics;
parcelable ComponentInfoInternal;

View File

@@ -0,0 +1,100 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.biometrics;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
/**
* The internal class for storing the component info for a subsystem of the biometric sensor,
* as defined in {@link android.hardware.biometrics.common.ComponentInfo}.
* @hide
*/
public class ComponentInfoInternal implements Parcelable {
public final String componentId;
public final String hardwareVersion;
public final String firmwareVersion;
public final String serialNumber;
public final String softwareVersion;
/**
* Constructs a {@link ComponentInfoInternal} from another instance.
* @hide
*/
public static ComponentInfoInternal from(@NonNull ComponentInfoInternal comp) {
return new ComponentInfoInternal(comp.componentId, comp.hardwareVersion,
comp.firmwareVersion, comp.serialNumber, comp.softwareVersion);
}
/**
* @hide
*/
public ComponentInfoInternal(String componentId, String hardwareVersion,
String firmwareVersion, String serialNumber, String softwareVersion) {
this.componentId = componentId;
this.hardwareVersion = hardwareVersion;
this.firmwareVersion = firmwareVersion;
this.serialNumber = serialNumber;
this.softwareVersion = softwareVersion;
}
protected ComponentInfoInternal(Parcel in) {
componentId = in.readString();
hardwareVersion = in.readString();
firmwareVersion = in.readString();
serialNumber = in.readString();
softwareVersion = in.readString();
}
public static final Creator<ComponentInfoInternal> CREATOR =
new Creator<ComponentInfoInternal>() {
@Override
public ComponentInfoInternal createFromParcel(Parcel in) {
return new ComponentInfoInternal(in);
}
@Override
public ComponentInfoInternal[] newArray(int size) {
return new ComponentInfoInternal[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(componentId);
dest.writeString(hardwareVersion);
dest.writeString(firmwareVersion);
dest.writeString(serialNumber);
dest.writeString(softwareVersion);
}
@Override
public String toString() {
return "ComponentId: " + componentId
+ ", HardwareVersion: " + hardwareVersion
+ ", FirmwareVersion: " + firmwareVersion
+ ", SerialNumber " + serialNumber
+ ", SoftwareVersion: " + softwareVersion;
}
}

View File

@@ -17,10 +17,13 @@
package android.hardware.biometrics;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
/**
* The base class containing all modality-agnostic information.
@@ -56,15 +59,93 @@ public class SensorProperties {
@Retention(RetentionPolicy.SOURCE)
public @interface Strength {}
/**
* A class storing the component info for a subsystem of the sensor.
*/
public static final class ComponentInfo {
@NonNull private final String mComponentId;
@NonNull private final String mHardwareVersion;
@NonNull private final String mFirmwareVersion;
@NonNull private final String mSerialNumber;
@NonNull private final String mSoftwareVersion;
/**
* @hide
*/
public ComponentInfo(@NonNull String componentId, @NonNull String hardwareVersion,
@NonNull String firmwareVersion, @NonNull String serialNumber,
@NonNull String softwareVersion) {
mComponentId = componentId;
mHardwareVersion = hardwareVersion;
mFirmwareVersion = firmwareVersion;
mSerialNumber = serialNumber;
mSoftwareVersion = softwareVersion;
}
/**
* @return The unique identifier for the subsystem.
*/
@NonNull
public String getComponentId() {
return mComponentId;
}
/**
* @return The hardware version for the subsystem. For example, <vendor>/<model>/<revision>.
*/
@NonNull
public String getHardwareVersion() {
return mHardwareVersion;
}
/**
* @return The firmware version for the subsystem.
*/
@NonNull
public String getFirmwareVersion() {
return mFirmwareVersion;
}
/**
* @return The serial number for the subsystem.
*/
@NonNull
public String getSerialNumber() {
return mSerialNumber;
}
/**
* @return The software version for the subsystem.
* For example, <vendor>/<version>/<revision>.
*/
@NonNull
public String getSoftwareVersion() {
return mSoftwareVersion;
}
/**
* Constructs a {@link ComponentInfo} from the internal parcelable representation.
* @hide
*/
public static ComponentInfo from(ComponentInfoInternal internalComp) {
return new ComponentInfo(internalComp.componentId, internalComp.hardwareVersion,
internalComp.firmwareVersion, internalComp.serialNumber,
internalComp.softwareVersion);
}
}
private final int mSensorId;
@Strength private final int mSensorStrength;
private final List<ComponentInfo> mComponentInfo;
/**
* @hide
*/
public SensorProperties(int sensorId, @Strength int sensorStrength) {
public SensorProperties(int sensorId, @Strength int sensorStrength,
List<ComponentInfo> componentInfo) {
mSensorId = sensorId;
mSensorStrength = sensorStrength;
mComponentInfo = componentInfo;
}
/**
@@ -82,11 +163,24 @@ public class SensorProperties {
return mSensorStrength;
}
/**
* @return The sensor's component info.
*/
@NonNull
public List<ComponentInfo> getComponentInfo() {
return mComponentInfo;
}
/**
* Constructs a {@link SensorProperties} from the internal parcelable representation.
* @hide
*/
public static SensorProperties from(SensorPropertiesInternal internalProp) {
return new SensorProperties(internalProp.sensorId, internalProp.sensorStrength);
final List<ComponentInfo> componentInfo = new ArrayList<>();
for (ComponentInfoInternal internalComp : internalProp.componentInfo) {
componentInfo.add(ComponentInfo.from(internalComp));
}
return new SensorProperties(internalProp.sensorId, internalProp.sensorStrength,
componentInfo);
}
}

View File

@@ -20,6 +20,9 @@ import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.List;
/**
* The base class containing all modality-agnostic information. This is a superset of the
* {@link android.hardware.biometrics.common.CommonProps}, and provides backwards-compatible
@@ -31,21 +34,23 @@ public class SensorPropertiesInternal implements Parcelable {
public final int sensorId;
@SensorProperties.Strength public final int sensorStrength;
public final int maxEnrollmentsPerUser;
public final List<ComponentInfoInternal> componentInfo;
public final boolean resetLockoutRequiresHardwareAuthToken;
public final boolean resetLockoutRequiresChallenge;
public static SensorPropertiesInternal from(@NonNull SensorPropertiesInternal prop) {
return new SensorPropertiesInternal(prop.sensorId, prop.sensorStrength,
prop.maxEnrollmentsPerUser, prop.resetLockoutRequiresHardwareAuthToken,
prop.resetLockoutRequiresChallenge);
prop.maxEnrollmentsPerUser, prop.componentInfo,
prop.resetLockoutRequiresHardwareAuthToken, prop.resetLockoutRequiresChallenge);
}
protected SensorPropertiesInternal(int sensorId, @SensorProperties.Strength int sensorStrength,
int maxEnrollmentsPerUser, boolean resetLockoutRequiresHardwareAuthToken,
boolean resetLockoutRequiresChallenge) {
int maxEnrollmentsPerUser, @NonNull List<ComponentInfoInternal> componentInfo,
boolean resetLockoutRequiresHardwareAuthToken, boolean resetLockoutRequiresChallenge) {
this.sensorId = sensorId;
this.sensorStrength = sensorStrength;
this.maxEnrollmentsPerUser = maxEnrollmentsPerUser;
this.componentInfo = componentInfo;
this.resetLockoutRequiresHardwareAuthToken = resetLockoutRequiresHardwareAuthToken;
this.resetLockoutRequiresChallenge = resetLockoutRequiresChallenge;
}
@@ -54,6 +59,8 @@ public class SensorPropertiesInternal implements Parcelable {
sensorId = in.readInt();
sensorStrength = in.readInt();
maxEnrollmentsPerUser = in.readInt();
componentInfo = new ArrayList<>();
in.readList(componentInfo, ComponentInfoInternal.class.getClassLoader());
resetLockoutRequiresHardwareAuthToken = in.readBoolean();
resetLockoutRequiresChallenge = in.readBoolean();
}
@@ -81,13 +88,23 @@ public class SensorPropertiesInternal implements Parcelable {
dest.writeInt(sensorId);
dest.writeInt(sensorStrength);
dest.writeInt(maxEnrollmentsPerUser);
dest.writeList(componentInfo);
dest.writeBoolean(resetLockoutRequiresHardwareAuthToken);
dest.writeBoolean(resetLockoutRequiresChallenge);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("[ ");
for (ComponentInfoInternal info : componentInfo) {
sb.append("[").append(info.toString());
sb.append("] ");
}
sb.append("]");
return "ID: " + sensorId + ", Strength: " + sensorStrength
+ ", MaxEnrollmentsPerUser: " + maxEnrollmentsPerUser;
+ ", MaxEnrollmentsPerUser: " + maxEnrollmentsPerUser
+ ", ComponentInfo: " + sb.toString();
}
}

View File

@@ -16,25 +16,75 @@
package android.hardware.face;
import android.annotation.IntDef;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
/**
* Container for face sensor properties.
* @hide
*/
public class FaceSensorProperties extends SensorProperties {
/**
* @hide
*/
public static final int TYPE_UNKNOWN = 0;
/**
* @hide
*/
public static final int TYPE_RGB = 1;
/**
* @hide
*/
public static final int TYPE_IR = 2;
/**
* @hide
*/
@IntDef({TYPE_UNKNOWN,
TYPE_RGB,
TYPE_IR})
@Retention(RetentionPolicy.SOURCE)
public @interface SensorType {}
@FaceSensorProperties.SensorType
final int mSensorType;
/**
* @hide
*/
public static FaceSensorProperties from(FaceSensorPropertiesInternal internalProp) {
return new FaceSensorProperties(internalProp.sensorId, internalProp.sensorStrength);
final List<ComponentInfo> componentInfo = new ArrayList<>();
for (ComponentInfoInternal internalComp : internalProp.componentInfo) {
componentInfo.add(ComponentInfo.from(internalComp));
}
return new FaceSensorProperties(internalProp.sensorId,
internalProp.sensorStrength,
componentInfo,
internalProp.sensorType);
}
/**
* @hide
*/
public FaceSensorProperties(int sensorId, int sensorStrength) {
super(sensorId, sensorStrength);
public FaceSensorProperties(int sensorId, int sensorStrength,
List<ComponentInfo> componentInfo, @FaceSensorProperties.SensorType int sensorType) {
super(sensorId, sensorStrength, componentInfo);
mSensorType = sensorType;
}
/**
* @hide
* @return The sensor's type.
*/
@FaceSensorProperties.SensorType
public int getSensorType() {
return mSensorType;
}
}

View File

@@ -16,15 +16,23 @@
package android.hardware.face;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.os.Parcel;
import java.util.List;
/**
* Container for face sensor properties.
* @hide
*/
public class FaceSensorPropertiesInternal extends SensorPropertiesInternal {
/**
* See {@link FaceSensorProperties.SensorType}.
*/
public final @FaceSensorProperties.SensorType int sensorType;
/**
* True if the sensor is able to perform generic face detection, without running the
* matching algorithm, and without affecting the lockout counter.
@@ -40,18 +48,21 @@ public class FaceSensorPropertiesInternal extends SensorPropertiesInternal {
* Initializes SensorProperties with specified values
*/
public FaceSensorPropertiesInternal(int sensorId, @SensorProperties.Strength int strength,
int maxEnrollmentsPerUser, boolean supportsFaceDetection,
int maxEnrollmentsPerUser, List<ComponentInfoInternal> componentInfo,
@FaceSensorProperties.SensorType int sensorType, boolean supportsFaceDetection,
boolean supportsSelfIllumination, boolean resetLockoutRequiresChallenge) {
// resetLockout is managed by the HAL and requires a HardwareAuthToken for all face
// HAL interfaces (IBiometricsFace@1.0 HIDL and IFace@1.0 AIDL).
super(sensorId, strength, maxEnrollmentsPerUser,
true /* resetLockoutRequiresHardwareAuthToken */, resetLockoutRequiresChallenge);
super(sensorId, strength, maxEnrollmentsPerUser, componentInfo,
true /* resetLockoutRequiresHardwareAuthToken */, resetLockoutRequiresChallenge);
this.sensorType = sensorType;
this.supportsFaceDetection = supportsFaceDetection;
this.supportsSelfIllumination = supportsSelfIllumination;
}
protected FaceSensorPropertiesInternal(Parcel in) {
super(in);
sensorType = in.readInt();
supportsFaceDetection = in.readBoolean();
supportsSelfIllumination = in.readBoolean();
}
@@ -77,12 +88,13 @@ public class FaceSensorPropertiesInternal extends SensorPropertiesInternal {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(sensorType);
dest.writeBoolean(supportsFaceDetection);
dest.writeBoolean(supportsSelfIllumination);
}
@Override
public String toString() {
return "ID: " + sensorId + ", Strength: " + sensorStrength;
return "ID: " + sensorId + ", Strength: " + sensorStrength + ", Type: " + sensorType;
}
}

View File

@@ -17,10 +17,13 @@
package android.hardware.fingerprint;
import android.annotation.IntDef;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
/**
* Container for fingerprint sensor properties.
@@ -77,8 +80,13 @@ public class FingerprintSensorProperties extends SensorProperties {
*/
public static FingerprintSensorProperties from(
FingerprintSensorPropertiesInternal internalProp) {
final List<ComponentInfo> componentInfo = new ArrayList<>();
for (ComponentInfoInternal internalComp : internalProp.componentInfo) {
componentInfo.add(ComponentInfo.from(internalComp));
}
return new FingerprintSensorProperties(internalProp.sensorId,
internalProp.sensorStrength,
componentInfo,
internalProp.sensorType);
}
@@ -86,8 +94,8 @@ public class FingerprintSensorProperties extends SensorProperties {
* @hide
*/
public FingerprintSensorProperties(int sensorId, int sensorStrength,
@SensorType int sensorType) {
super(sensorId, sensorStrength);
List<ComponentInfo> componentInfo, @SensorType int sensorType) {
super(sensorId, sensorStrength, componentInfo);
mSensorType = sensorType;
}

View File

@@ -21,10 +21,13 @@ import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFP
import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.os.Parcel;
import java.util.List;
/**
* Container for fingerprint sensor properties.
* @hide
@@ -59,6 +62,7 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
public FingerprintSensorPropertiesInternal(int sensorId,
@SensorProperties.Strength int strength, int maxEnrollmentsPerUser,
List<ComponentInfoInternal> componentInfo,
@FingerprintSensorProperties.SensorType int sensorType,
boolean resetLockoutRequiresHardwareAuthToken, int sensorLocationX, int sensorLocationY,
int sensorRadius) {
@@ -66,8 +70,8 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
// required as it can only be generated/attested/verified by TEE components.
// IFingerprint@1.0 handles lockout below the HAL, but does not require a challenge. See
// the HAL interface for more details.
super(sensorId, strength, maxEnrollmentsPerUser, resetLockoutRequiresHardwareAuthToken,
false /* resetLockoutRequiresChallenge */);
super(sensorId, strength, maxEnrollmentsPerUser, componentInfo,
resetLockoutRequiresHardwareAuthToken, false /* resetLockoutRequiresChallenge */);
this.sensorType = sensorType;
this.sensorLocationX = sensorLocationX;
this.sensorLocationY = sensorLocationY;
@@ -79,10 +83,11 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
*/
public FingerprintSensorPropertiesInternal(int sensorId,
@SensorProperties.Strength int strength, int maxEnrollmentsPerUser,
List<ComponentInfoInternal> componentInfo,
@FingerprintSensorProperties.SensorType int sensorType,
boolean resetLockoutRequiresHardwareAuthToken) {
// TODO(b/179175438): Value should be provided from the HAL
this(sensorId, strength, maxEnrollmentsPerUser, sensorType,
this(sensorId, strength, maxEnrollmentsPerUser, componentInfo, sensorType,
resetLockoutRequiresHardwareAuthToken, 540 /* sensorLocationX */,
1636 /* sensorLocationY */, 130 /* sensorRadius */);
}
@@ -94,10 +99,11 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna
// TODO(b/179175438): Remove this constructor once all HALs move to AIDL.
public FingerprintSensorPropertiesInternal(@NonNull Context context, int sensorId,
@SensorProperties.Strength int strength, int maxEnrollmentsPerUser,
List<ComponentInfoInternal> componentInfo,
@FingerprintSensorProperties.SensorType int sensorType,
boolean resetLockoutRequiresHardwareAuthToken) {
super(sensorId, strength, maxEnrollmentsPerUser, resetLockoutRequiresHardwareAuthToken,
false /* resetLockoutRequiresChallenge */);
super(sensorId, strength, maxEnrollmentsPerUser, componentInfo,
resetLockoutRequiresHardwareAuthToken, false /* resetLockoutRequiresChallenge */);
this.sensorType = sensorType;
int[] props = context.getResources().getIntArray(

View File

@@ -50,6 +50,7 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.face.FaceManager;
import android.hardware.face.FaceSensorProperties;
@@ -192,9 +193,19 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
// IBiometricsFace@1.0 does not support detection, only authentication.
when(mFaceSensorProperties.isEmpty()).thenReturn(false);
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
when(mFaceSensorProperties.get(anyInt())).thenReturn(new FaceSensorPropertiesInternal(
0 /* id */,
FaceSensorProperties.STRENGTH_STRONG, 1 /* maxTemplatesAllowed */,
componentInfo, FaceSensorProperties.TYPE_UNKNOWN,
false /* supportsFaceDetection */, true /* supportsSelfIllumination */,
false /* resetLockoutRequiresChallenge */));

View File

@@ -26,6 +26,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorProperties;
import android.hardware.fingerprint.FingerprintSensorProperties;
@@ -49,6 +50,9 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
@@ -341,8 +345,18 @@ public class AuthBiometricViewTest extends SysuiTestCase {
final int sensorLocationX = 540;
final int sensorLocationY = 1600;
final int sensorRadius = 100;
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
final FingerprintSensorPropertiesInternal props = new FingerprintSensorPropertiesInternal(
0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 5 /* maxEnrollmentsPerUser */,
componentInfo,
FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
true /* resetLockoutRequiresHardwareAuthToken */, sensorLocationX, sensorLocationY,
sensorRadius);
@@ -379,8 +393,18 @@ public class AuthBiometricViewTest extends SysuiTestCase {
final int sensorLocationX = 540;
final int sensorLocationY = 1600;
final int sensorRadius = 100;
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
final FingerprintSensorPropertiesInternal props = new FingerprintSensorPropertiesInternal(
0 /* sensorId */, SensorProperties.STRENGTH_STRONG, 5 /* maxEnrollmentsPerUser */,
componentInfo,
FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
true /* resetLockoutRequiresHardwareAuthToken */, sensorLocationX, sensorLocationY,
sensorRadius);

View File

@@ -34,8 +34,8 @@ import static org.mockito.Mockito.when;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorProperties;
import android.hardware.face.FaceSensorPropertiesInternal;
@@ -248,9 +248,19 @@ public class AuthContainerViewTest extends SysuiTestCase {
config.mPromptInfo = promptInfo;
final List<FingerprintSensorPropertiesInternal> fpProps = new ArrayList<>();
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
fpProps.add(new FingerprintSensorPropertiesInternal(0,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
componentInfo,
FingerprintSensorProperties.TYPE_REAR,
false /* resetLockoutRequiresHardwareAuthToken */));
mAuthContainer = new TestableAuthContainer(config, fpProps, null /* faceProps */);

View File

@@ -34,7 +34,6 @@ import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -43,6 +42,7 @@ import android.content.res.Configuration;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.IBiometricSysuiReceiver;
import android.hardware.biometrics.PromptInfo;
import android.hardware.biometrics.SensorProperties;
@@ -123,10 +123,20 @@ public class AuthControllerTest extends SysuiTestCase {
when(mDialog2.isAllowDeviceCredentials()).thenReturn(false);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
FingerprintSensorPropertiesInternal prop = new FingerprintSensorPropertiesInternal(
1 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
1 /* maxEnrollmentsPerUser */,
componentInfo,
FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
true /* resetLockoutRequireHardwareAuthToken */);
List<FingerprintSensorPropertiesInternal> props = new ArrayList<>();

View File

@@ -26,6 +26,7 @@ import static org.mockito.Mockito.when;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorProperties;
@@ -120,9 +121,19 @@ public class UdfpsControllerTest extends SysuiTestCase {
setUpResources();
when(mLayoutInflater.inflate(R.layout.udfps_view, null, false)).thenReturn(mUdfpsView);
final List<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
props.add(new FingerprintSensorPropertiesInternal(TEST_UDFPS_SENSOR_ID,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
componentInfo,
FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
true /* resetLockoutRequiresHardwareAuthToken */));
when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props);

View File

@@ -23,6 +23,7 @@ import android.app.ActivityTaskManager;
import android.app.TaskStackListener;
import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.ITestSessionCallback;
@@ -134,10 +135,21 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
for (SensorProps prop : props) {
final int sensorId = prop.commonProps.sensorId;
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
if (prop.commonProps.componentInfo != null) {
for (android.hardware.biometrics.common.ComponentInfo info
: prop.commonProps.componentInfo) {
componentInfo.add(new ComponentInfoInternal(info.componentId,
info.hardwareVersion, info.firmwareVersion, info.serialNumber,
info.softwareVersion));
}
}
final FaceSensorPropertiesInternal internalProp = new FaceSensorPropertiesInternal(
prop.commonProps.sensorId, prop.commonProps.sensorStrength,
prop.commonProps.maxEnrollmentsPerUser, false /* supportsFaceDetection */,
prop.halControlsPreview, false /* resetLockoutRequiresChallenge */);
prop.commonProps.maxEnrollmentsPerUser, componentInfo, prop.sensorType,
false /* supportsFaceDetection */, prop.halControlsPreview,
false /* resetLockoutRequiresChallenge */);
final Sensor sensor = new Sensor(getTag() + "/" + sensorId, this, mContext, mHandler,
internalProp);

View File

@@ -27,11 +27,13 @@ import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback;
import android.hardware.face.Face;
import android.hardware.face.FaceSensorProperties;
import android.hardware.face.FaceSensorPropertiesInternal;
import android.hardware.face.IFaceServiceReceiver;
import android.os.Binder;
@@ -332,8 +334,9 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@NonNull BiometricScheduler scheduler) {
mSensorProperties = new FaceSensorPropertiesInternal(sensorId,
Utils.authenticatorStrengthToPropertyStrength(strength),
maxTemplatesAllowed, false /* supportsFaceDetect */, supportsSelfIllumination,
true /* resetLockoutRequiresChallenge */);
maxTemplatesAllowed, new ArrayList<ComponentInfoInternal>() /* componentInfo */,
FaceSensorProperties.TYPE_UNKNOWN, false /* supportsFaceDetect */,
supportsSelfIllumination, true /* resetLockoutRequiresChallenge */);
mContext = context;
mSensorId = sensorId;
mScheduler = scheduler;

View File

@@ -25,6 +25,7 @@ import android.app.ActivityTaskManager;
import android.app.TaskStackListener;
import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.ITestSessionCallback;
@@ -138,10 +139,21 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
for (SensorProps prop : props) {
final int sensorId = prop.commonProps.sensorId;
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
if (prop.commonProps.componentInfo != null) {
for (android.hardware.biometrics.common.ComponentInfo info
: prop.commonProps.componentInfo) {
componentInfo.add(new ComponentInfoInternal(info.componentId,
info.hardwareVersion, info.firmwareVersion, info.serialNumber,
info.softwareVersion));
}
}
final FingerprintSensorPropertiesInternal internalProp =
new FingerprintSensorPropertiesInternal(prop.commonProps.sensorId,
prop.commonProps.sensorStrength,
prop.commonProps.maxEnrollmentsPerUser,
componentInfo,
prop.sensorType,
true /* resetLockoutRequiresHardwareAuthToken */);
final Sensor sensor = new Sensor(getTag() + "/" + sensorId, this, mContext, mHandler,

View File

@@ -28,6 +28,7 @@ import android.content.pm.UserInfo;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.IInvalidationCallback;
import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.ITestSessionCallback;
@@ -355,7 +356,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mSensorProperties = new FingerprintSensorPropertiesInternal(context, sensorId,
Utils.authenticatorStrengthToPropertyStrength(strength), maxEnrollmentsPerUser,
sensorType, resetLockoutRequiresHardwareAuthToken);
new ArrayList<ComponentInfoInternal>() /* componentInfo */, sensorType,
resetLockoutRequiresHardwareAuthToken);
}
public static Fingerprint21 newInstance(@NonNull Context context, int sensorId, int strength,

View File

@@ -22,6 +22,7 @@ import android.app.trust.TrustManager;
import android.content.ContentResolver;
import android.content.Context;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
@@ -421,6 +422,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
.getInteger(R.integer.config_fingerprintMaxTemplatesPerUser);
mSensorProperties = new FingerprintSensorPropertiesInternal(sensorId,
Utils.authenticatorStrengthToPropertyStrength(strength), maxTemplatesAllowed,
new ArrayList<ComponentInfoInternal>() /* componentInfo */,
FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
resetLockoutRequiresHardwareAuthToken);
mMockHalResultController = controller;

View File

@@ -39,6 +39,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.ITrustManager;
import android.content.Context;
import android.hardware.biometrics.BiometricManager.Authenticators;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.IBiometricAuthenticator;
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricServiceReceiver;
@@ -292,9 +293,18 @@ public class AuthSessionTest {
}
});
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
"vendor/model/revision" /* hardwareVersion */, "1.01" /* firmwareVersion */,
"00000001" /* serialNumber */, "" /* softwareVersion */));
componentInfo.add(new ComponentInfoInternal("matchingAlgorithm" /* componentId */,
"" /* hardwareVersion */, "" /* firmwareVersion */, "" /* serialNumber */,
"vendor/version/revision" /* softwareVersion */));
mFingerprintSensorProps.add(new FingerprintSensorPropertiesInternal(id,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
componentInfo,
type,
false /* resetLockoutRequiresHardwareAuthToken */));
}