Merge changes from topic "IFace-anapic-review" into sc-dev

* changes:
  Add HAL-to-framework constant conversion
  Update framework with IFace getSensorConfig
This commit is contained in:
Ilya Matyukhin
2021-04-22 22:58:59 +00:00
committed by Android (Google) Code Review
7 changed files with 285 additions and 49 deletions

View File

@@ -16,10 +16,14 @@
package android.hardware.biometrics;
import android.annotation.IntDef;
import android.app.KeyguardManager;
import android.hardware.biometrics.BiometricManager.Authenticators;
import android.hardware.face.FaceManager;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Interface containing all of the face-specific constants.
*
@@ -48,6 +52,31 @@ public interface BiometricFaceConstants {
// Error messages from face authentication hardware during initialization, enrollment,
// authentication or removal. Must agree with the list in HAL h file
//
/**
* @hide
*/
@IntDef({FACE_ERROR_HW_UNAVAILABLE,
FACE_ERROR_UNABLE_TO_PROCESS,
FACE_ERROR_TIMEOUT,
FACE_ERROR_NO_SPACE,
FACE_ERROR_CANCELED,
FACE_ERROR_UNABLE_TO_REMOVE,
FACE_ERROR_LOCKOUT,
FACE_ERROR_VENDOR,
FACE_ERROR_LOCKOUT_PERMANENT,
FACE_ERROR_USER_CANCELED,
FACE_ERROR_NOT_ENROLLED,
FACE_ERROR_HW_NOT_PRESENT,
FACE_ERROR_NEGATIVE_BUTTON,
BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL,
BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,
BIOMETRIC_ERROR_RE_ENROLL,
FACE_ERROR_UNKNOWN
})
@Retention(RetentionPolicy.SOURCE)
@interface FaceError {}
/**
* The hardware is unavailable. Try again later.
*/
@@ -158,6 +187,12 @@ public interface BiometricFaceConstants {
*/
int BIOMETRIC_ERROR_RE_ENROLL = 16;
/**
* Unknown error received from the HAL.
* @hide
*/
int FACE_ERROR_UNKNOWN = 17;
/**
* @hide
*/
@@ -168,6 +203,36 @@ public interface BiometricFaceConstants {
// existing constants. These must agree with face@1.0/types.hal.
//
/**
* @hide
*/
@IntDef({FACE_ACQUIRED_GOOD,
FACE_ACQUIRED_INSUFFICIENT,
FACE_ACQUIRED_TOO_BRIGHT,
FACE_ACQUIRED_TOO_DARK,
FACE_ACQUIRED_TOO_CLOSE,
FACE_ACQUIRED_TOO_FAR,
FACE_ACQUIRED_TOO_HIGH,
FACE_ACQUIRED_TOO_LOW,
FACE_ACQUIRED_TOO_RIGHT,
FACE_ACQUIRED_TOO_LEFT,
FACE_ACQUIRED_POOR_GAZE,
FACE_ACQUIRED_NOT_DETECTED,
FACE_ACQUIRED_TOO_MUCH_MOTION,
FACE_ACQUIRED_RECALIBRATE,
FACE_ACQUIRED_TOO_DIFFERENT,
FACE_ACQUIRED_TOO_SIMILAR,
FACE_ACQUIRED_PAN_TOO_EXTREME,
FACE_ACQUIRED_TILT_TOO_EXTREME,
FACE_ACQUIRED_ROLL_TOO_EXTREME,
FACE_ACQUIRED_FACE_OBSCURED,
FACE_ACQUIRED_START,
FACE_ACQUIRED_SENSOR_DIRTY,
FACE_ACQUIRED_VENDOR,
FACE_ACQUIRED_UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
@interface FaceAcquired {}
/**
* The image acquired was good.
*/
@@ -342,6 +407,12 @@ public interface BiometricFaceConstants {
*/
int FACE_ACQUIRED_VENDOR = 22;
/**
* Unknown acquired code received from the HAL.
* @hide
*/
int FACE_ACQUIRED_UNKNOWN = 23;
/**
* @hide
*/

View File

@@ -57,7 +57,10 @@ public interface BiometricFingerprintConstants {
FINGERPRINT_ERROR_HW_NOT_PRESENT,
FINGERPRINT_ERROR_NEGATIVE_BUTTON,
BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL,
BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED})
BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,
BIOMETRIC_ERROR_RE_ENROLL,
BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED,
FINGERPRINT_ERROR_UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
@interface FingerprintError {}
@@ -163,7 +166,7 @@ public interface BiometricFingerprintConstants {
* sensor's strength can currently only meet {@link Authenticators#BIOMETRIC_WEAK}.
* @hide
*/
public static final int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 15;
int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 15;
/**
* Authentication cannot proceed because re-enrollment is required.
@@ -171,6 +174,12 @@ public interface BiometricFingerprintConstants {
*/
int BIOMETRIC_ERROR_RE_ENROLL = 16;
/**
* Unknown error received from the HAL.
* @hide
*/
int FINGERPRINT_ERROR_UNKNOWN = 17;
/**
* @hide
*/
@@ -191,7 +200,8 @@ public interface BiometricFingerprintConstants {
FINGERPRINT_ACQUIRED_TOO_SLOW,
FINGERPRINT_ACQUIRED_TOO_FAST,
FINGERPRINT_ACQUIRED_VENDOR,
FINGERPRINT_ACQUIRED_START})
FINGERPRINT_ACQUIRED_START,
FINGERPRINT_ACQUIRED_UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
@interface FingerprintAcquired {}
@@ -254,6 +264,12 @@ public interface BiometricFingerprintConstants {
*/
int FINGERPRINT_ACQUIRED_START = 7;
/**
* Unknown acquired code received from the HAL.
* @hide
*/
int FINGERPRINT_ACQUIRED_UNKNOWN = 8;
/**
* @hide
*/

View File

@@ -18,10 +18,13 @@ package com.android.server.biometrics.sensors.face.aidl;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.face.AcquiredInfo;
import android.hardware.biometrics.face.AuthenticationFrame;
import android.hardware.biometrics.face.BaseFrame;
import android.hardware.biometrics.face.Cell;
import android.hardware.biometrics.face.EnrollmentFrame;
import android.hardware.biometrics.face.Error;
import android.hardware.face.FaceAuthenticationFrame;
import android.hardware.face.FaceDataFrame;
import android.hardware.face.FaceEnrollCell;
@@ -32,38 +35,112 @@ import android.hardware.face.FaceEnrollFrame;
*/
final class AidlConversionUtils {
// Prevent instantiation.
private AidlConversionUtils() {}
private AidlConversionUtils() {
}
public static @BiometricFaceConstants.FaceError int toFrameworkError(byte aidlError) {
if (aidlError == Error.UNKNOWN) {
// No framework constant available
return BiometricFaceConstants.FACE_ERROR_UNKNOWN;
} else if (aidlError == Error.HW_UNAVAILABLE) {
return BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE;
} else if (aidlError == Error.UNABLE_TO_PROCESS) {
return BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS;
} else if (aidlError == Error.TIMEOUT) {
return BiometricFaceConstants.FACE_ERROR_TIMEOUT;
} else if (aidlError == Error.NO_SPACE) {
return BiometricFaceConstants.FACE_ERROR_NO_SPACE;
} else if (aidlError == Error.CANCELED) {
return BiometricFaceConstants.FACE_ERROR_CANCELED;
} else if (aidlError == Error.UNABLE_TO_REMOVE) {
return BiometricFaceConstants.FACE_ERROR_UNABLE_TO_REMOVE;
} else if (aidlError == Error.VENDOR) {
return BiometricFaceConstants.FACE_ERROR_VENDOR;
} else if (aidlError == Error.REENROLL_REQUIRED) {
return BiometricFaceConstants.BIOMETRIC_ERROR_RE_ENROLL;
} else {
return BiometricFaceConstants.FACE_ERROR_UNKNOWN;
}
}
public static @BiometricFaceConstants.FaceAcquired int toFrameworkAcquiredInfo(
byte aidlAcquired) {
if (aidlAcquired == AcquiredInfo.UNKNOWN) {
return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
} else if (aidlAcquired == AcquiredInfo.GOOD) {
return BiometricFaceConstants.FACE_ACQUIRED_GOOD;
} else if (aidlAcquired == AcquiredInfo.INSUFFICIENT) {
return BiometricFaceConstants.FACE_ACQUIRED_INSUFFICIENT;
} else if (aidlAcquired == AcquiredInfo.TOO_BRIGHT) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_BRIGHT;
} else if (aidlAcquired == AcquiredInfo.TOO_DARK) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_DARK;
} else if (aidlAcquired == AcquiredInfo.TOO_CLOSE) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_CLOSE;
} else if (aidlAcquired == AcquiredInfo.TOO_FAR) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_FAR;
} else if (aidlAcquired == AcquiredInfo.FACE_TOO_HIGH) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_HIGH;
} else if (aidlAcquired == AcquiredInfo.FACE_TOO_LOW) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_LOW;
} else if (aidlAcquired == AcquiredInfo.FACE_TOO_RIGHT) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_RIGHT;
} else if (aidlAcquired == AcquiredInfo.FACE_TOO_LEFT) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_LEFT;
} else if (aidlAcquired == AcquiredInfo.POOR_GAZE) {
return BiometricFaceConstants.FACE_ACQUIRED_POOR_GAZE;
} else if (aidlAcquired == AcquiredInfo.NOT_DETECTED) {
return BiometricFaceConstants.FACE_ACQUIRED_NOT_DETECTED;
} else if (aidlAcquired == AcquiredInfo.TOO_MUCH_MOTION) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_MUCH_MOTION;
} else if (aidlAcquired == AcquiredInfo.RECALIBRATE) {
return BiometricFaceConstants.FACE_ACQUIRED_RECALIBRATE;
} else if (aidlAcquired == AcquiredInfo.TOO_DIFFERENT) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_DIFFERENT;
} else if (aidlAcquired == AcquiredInfo.TOO_SIMILAR) {
return BiometricFaceConstants.FACE_ACQUIRED_TOO_SIMILAR;
} else if (aidlAcquired == AcquiredInfo.PAN_TOO_EXTREME) {
return BiometricFaceConstants.FACE_ACQUIRED_PAN_TOO_EXTREME;
} else if (aidlAcquired == AcquiredInfo.TILT_TOO_EXTREME) {
return BiometricFaceConstants.FACE_ACQUIRED_TILT_TOO_EXTREME;
} else if (aidlAcquired == AcquiredInfo.ROLL_TOO_EXTREME) {
return BiometricFaceConstants.FACE_ACQUIRED_ROLL_TOO_EXTREME;
} else if (aidlAcquired == AcquiredInfo.FACE_OBSCURED) {
return BiometricFaceConstants.FACE_ACQUIRED_FACE_OBSCURED;
} else if (aidlAcquired == AcquiredInfo.START) {
return BiometricFaceConstants.FACE_ACQUIRED_START;
} else if (aidlAcquired == AcquiredInfo.SENSOR_DIRTY) {
return BiometricFaceConstants.FACE_ACQUIRED_SENSOR_DIRTY;
} else if (aidlAcquired == AcquiredInfo.VENDOR) {
return BiometricFaceConstants.FACE_ACQUIRED_VENDOR;
} else if (aidlAcquired == AcquiredInfo.FIRST_FRAME_RECEIVED) {
// No framework constant available
return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
} else if (aidlAcquired == AcquiredInfo.DARK_GLASSES_DETECTED) {
// No framework constant available
return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
} else if (aidlAcquired == AcquiredInfo.MOUTH_COVERING_DETECTED) {
// No framework constant available
return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
} else {
return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
}
}
@NonNull
public static FaceAuthenticationFrame convert(@NonNull AuthenticationFrame frame) {
return new FaceAuthenticationFrame(convert(frame.data));
}
@NonNull
public static AuthenticationFrame convert(@NonNull FaceAuthenticationFrame frame) {
final AuthenticationFrame convertedFrame = new AuthenticationFrame();
convertedFrame.data = convert(frame.getData());
return convertedFrame;
}
@NonNull
public static FaceEnrollFrame convert(@NonNull EnrollmentFrame frame) {
return new FaceEnrollFrame(convert(frame.cell), frame.stage, convert(frame.data));
}
@NonNull
public static EnrollmentFrame convert(@NonNull FaceEnrollFrame frame) {
final EnrollmentFrame convertedFrame = new EnrollmentFrame();
convertedFrame.cell = convert(frame.getCell());
convertedFrame.stage = (byte) frame.getStage();
convertedFrame.data = convert(frame.getData());
return convertedFrame;
}
@NonNull
public static FaceDataFrame convert(@NonNull BaseFrame frame) {
return new FaceDataFrame(
frame.acquiredInfo,
toFrameworkAcquiredInfo(frame.acquiredInfo),
frame.vendorCode,
frame.pan,
frame.tilt,
@@ -71,33 +148,8 @@ final class AidlConversionUtils {
frame.isCancellable);
}
@NonNull
public static BaseFrame convert(@NonNull FaceDataFrame frame) {
final BaseFrame convertedFrame = new BaseFrame();
convertedFrame.acquiredInfo = (byte) frame.getAcquiredInfo();
convertedFrame.vendorCode = frame.getVendorCode();
convertedFrame.pan = frame.getPan();
convertedFrame.tilt = frame.getTilt();
convertedFrame.distance = frame.getDistance();
convertedFrame.isCancellable = frame.isCancellable();
return convertedFrame;
}
@Nullable
public static FaceEnrollCell convert(@Nullable Cell cell) {
return cell == null ? null : new FaceEnrollCell(cell.x, cell.y, cell.z);
}
@Nullable
public static Cell convert(@Nullable FaceEnrollCell cell) {
if (cell == null) {
return null;
}
final Cell convertedCell = new Cell();
convertedCell.x = cell.getX();
convertedCell.y = cell.getY();
convertedCell.z = cell.getZ();
return convertedCell;
}
}

View File

@@ -223,7 +223,7 @@ public class Sensor {
}
final ErrorConsumer errorConsumer = (ErrorConsumer) client;
errorConsumer.onError(error, vendorCode);
errorConsumer.onError(AidlConversionUtils.toFrameworkError(error), vendorCode);
if (error == Error.HW_UNAVAILABLE) {
mCallback.onHardwareUnavailable();

View File

@@ -17,6 +17,7 @@
package com.android.server.biometrics.sensors.face.aidl;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.face.EnrollmentStageConfig;
import android.hardware.biometrics.face.Error;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.ISession;
@@ -56,6 +57,11 @@ public class TestHal extends IFace.Stub {
cb.onChallengeRevoked(challenge);
}
@Override
public EnrollmentStageConfig[] getEnrollmentConfig(byte enrollmentType) {
return new EnrollmentStageConfig[0];
}
@Override
public ICancellationSignal enroll(HardwareAuthToken hat,
byte enrollmentType, byte[] features, NativeHandle previewSurface) {

View File

@@ -0,0 +1,90 @@
/*
* Copyright (C) 2021 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 com.android.server.biometrics.sensors.fingerprint.aidl;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.fingerprint.AcquiredInfo;
import android.hardware.biometrics.fingerprint.Error;
/**
* Utilities for converting between hardware and framework-defined AIDL models.
*/
final class AidlConversionUtils {
// Prevent instantiation.
private AidlConversionUtils() {
}
public static @BiometricFingerprintConstants.FingerprintError int toFrameworkError(
byte aidlError) {
if (aidlError == Error.UNKNOWN) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNKNOWN;
} else if (aidlError == Error.HW_UNAVAILABLE) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE;
} else if (aidlError == Error.UNABLE_TO_PROCESS) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS;
} else if (aidlError == Error.TIMEOUT) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_TIMEOUT;
} else if (aidlError == Error.NO_SPACE) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_NO_SPACE;
} else if (aidlError == Error.CANCELED) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_CANCELED;
} else if (aidlError == Error.UNABLE_TO_REMOVE) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_REMOVE;
} else if (aidlError == Error.VENDOR) {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR;
} else {
return BiometricFingerprintConstants.FINGERPRINT_ERROR_UNKNOWN;
}
}
public static @BiometricFingerprintConstants.FingerprintAcquired int toFrameworkAcquiredInfo(
byte aidlAcquiredInfo) {
if (aidlAcquiredInfo == AcquiredInfo.UNKNOWN) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
} else if (aidlAcquiredInfo == AcquiredInfo.GOOD) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD;
} else if (aidlAcquiredInfo == AcquiredInfo.PARTIAL) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_PARTIAL;
} else if (aidlAcquiredInfo == AcquiredInfo.INSUFFICIENT) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_INSUFFICIENT;
} else if (aidlAcquiredInfo == AcquiredInfo.SENSOR_DIRTY) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_IMAGER_DIRTY;
} else if (aidlAcquiredInfo == AcquiredInfo.TOO_SLOW) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_TOO_SLOW;
} else if (aidlAcquiredInfo == AcquiredInfo.TOO_FAST) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_TOO_FAST;
} else if (aidlAcquiredInfo == AcquiredInfo.VENDOR) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_VENDOR;
} else if (aidlAcquiredInfo == AcquiredInfo.START) {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START;
} else if (aidlAcquiredInfo == AcquiredInfo.TOO_DARK) {
// No framework constant available
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
} else if (aidlAcquiredInfo == AcquiredInfo.TOO_BRIGHT) {
// No framework constant available
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
} else if (aidlAcquiredInfo == AcquiredInfo.IMMOBILE) {
// No framework constant available
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
} else if (aidlAcquiredInfo == AcquiredInfo.RETRYING_CAPTURE) {
// No framework constant available
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
} else {
return BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN;
}
}
}

View File

@@ -179,7 +179,8 @@ class Sensor {
}
final AcquisitionClient<?> acquisitionClient = (AcquisitionClient<?>) client;
acquisitionClient.onAcquired(info, vendorCode);
acquisitionClient.onAcquired(AidlConversionUtils.toFrameworkAcquiredInfo(info),
vendorCode);
});
}
@@ -198,7 +199,7 @@ class Sensor {
}
final ErrorConsumer errorConsumer = (ErrorConsumer) client;
errorConsumer.onError(error, vendorCode);
errorConsumer.onError(AidlConversionUtils.toFrameworkError(error), vendorCode);
if (error == Error.HW_UNAVAILABLE) {
mCallback.onHardwareUnavailable();