blob: 573c20fe041b6cc5e4f83f3dce1dbda74e8c3154 [file] [log] [blame]
/*
* 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.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.EnrollmentStage;
import android.hardware.biometrics.face.Error;
import android.hardware.biometrics.face.Feature;
import android.hardware.face.FaceAuthenticationFrame;
import android.hardware.face.FaceDataFrame;
import android.hardware.face.FaceEnrollCell;
import android.hardware.face.FaceEnrollFrame;
import android.hardware.face.FaceEnrollStages;
import android.hardware.face.FaceEnrollStages.FaceEnrollStage;
import android.util.Slog;
/**
* Utilities for converting from hardware to framework-defined AIDL models.
*/
final class AidlConversionUtils {
private static final String TAG = "AidlConversionUtils";
// Prevent instantiation.
private AidlConversionUtils() {
}
@BiometricFaceConstants.FaceError
public static int toFrameworkError(byte aidlError) {
switch (aidlError) {
case Error.HW_UNAVAILABLE:
return BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE;
case Error.UNABLE_TO_PROCESS:
return BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS;
case Error.TIMEOUT:
return BiometricFaceConstants.FACE_ERROR_TIMEOUT;
case Error.NO_SPACE:
return BiometricFaceConstants.FACE_ERROR_NO_SPACE;
case Error.CANCELED:
return BiometricFaceConstants.FACE_ERROR_CANCELED;
case Error.UNABLE_TO_REMOVE:
return BiometricFaceConstants.FACE_ERROR_UNABLE_TO_REMOVE;
case Error.VENDOR:
return BiometricFaceConstants.FACE_ERROR_VENDOR;
case Error.REENROLL_REQUIRED:
return BiometricFaceConstants.BIOMETRIC_ERROR_RE_ENROLL;
case Error.UNKNOWN:
default:
return BiometricFaceConstants.FACE_ERROR_UNKNOWN;
}
}
@BiometricFaceConstants.FaceAcquired
public static int toFrameworkAcquiredInfo(byte aidlAcquiredInfo) {
switch (aidlAcquiredInfo) {
case AcquiredInfo.GOOD:
return BiometricFaceConstants.FACE_ACQUIRED_GOOD;
case AcquiredInfo.INSUFFICIENT:
return BiometricFaceConstants.FACE_ACQUIRED_INSUFFICIENT;
case AcquiredInfo.TOO_BRIGHT:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_BRIGHT;
case AcquiredInfo.TOO_DARK:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_DARK;
case AcquiredInfo.TOO_CLOSE:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_CLOSE;
case AcquiredInfo.TOO_FAR:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_FAR;
case AcquiredInfo.FACE_TOO_HIGH:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_HIGH;
case AcquiredInfo.FACE_TOO_LOW:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_LOW;
case AcquiredInfo.FACE_TOO_RIGHT:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_RIGHT;
case AcquiredInfo.FACE_TOO_LEFT:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_LEFT;
case AcquiredInfo.POOR_GAZE:
return BiometricFaceConstants.FACE_ACQUIRED_POOR_GAZE;
case AcquiredInfo.NOT_DETECTED:
return BiometricFaceConstants.FACE_ACQUIRED_NOT_DETECTED;
case AcquiredInfo.TOO_MUCH_MOTION:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_MUCH_MOTION;
case AcquiredInfo.RECALIBRATE:
return BiometricFaceConstants.FACE_ACQUIRED_RECALIBRATE;
case AcquiredInfo.TOO_DIFFERENT:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_DIFFERENT;
case AcquiredInfo.TOO_SIMILAR:
return BiometricFaceConstants.FACE_ACQUIRED_TOO_SIMILAR;
case AcquiredInfo.PAN_TOO_EXTREME:
return BiometricFaceConstants.FACE_ACQUIRED_PAN_TOO_EXTREME;
case AcquiredInfo.TILT_TOO_EXTREME:
return BiometricFaceConstants.FACE_ACQUIRED_TILT_TOO_EXTREME;
case AcquiredInfo.ROLL_TOO_EXTREME:
return BiometricFaceConstants.FACE_ACQUIRED_ROLL_TOO_EXTREME;
case AcquiredInfo.FACE_OBSCURED:
return BiometricFaceConstants.FACE_ACQUIRED_FACE_OBSCURED;
case AcquiredInfo.START:
return BiometricFaceConstants.FACE_ACQUIRED_START;
case AcquiredInfo.SENSOR_DIRTY:
return BiometricFaceConstants.FACE_ACQUIRED_SENSOR_DIRTY;
case AcquiredInfo.VENDOR:
return BiometricFaceConstants.FACE_ACQUIRED_VENDOR;
case AcquiredInfo.FIRST_FRAME_RECEIVED:
return BiometricFaceConstants.FACE_ACQUIRED_FIRST_FRAME_RECEIVED;
case AcquiredInfo.DARK_GLASSES_DETECTED:
return BiometricFaceConstants.FACE_ACQUIRED_DARK_GLASSES_DETECTED;
case AcquiredInfo.MOUTH_COVERING_DETECTED:
return BiometricFaceConstants.FACE_ACQUIRED_MOUTH_COVERING_DETECTED;
case AcquiredInfo.UNKNOWN:
default:
return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN;
}
}
@FaceEnrollStage
public static int toFrameworkEnrollmentStage(int aidlEnrollmentStage) {
switch (aidlEnrollmentStage) {
case EnrollmentStage.FIRST_FRAME_RECEIVED:
return FaceEnrollStages.FIRST_FRAME_RECEIVED;
case EnrollmentStage.WAITING_FOR_CENTERING:
return FaceEnrollStages.WAITING_FOR_CENTERING;
case EnrollmentStage.HOLD_STILL_IN_CENTER:
return FaceEnrollStages.HOLD_STILL_IN_CENTER;
case EnrollmentStage.ENROLLING_MOVEMENT_1:
return FaceEnrollStages.ENROLLING_MOVEMENT_1;
case EnrollmentStage.ENROLLING_MOVEMENT_2:
return FaceEnrollStages.ENROLLING_MOVEMENT_2;
case EnrollmentStage.ENROLLMENT_FINISHED:
return FaceEnrollStages.ENROLLMENT_FINISHED;
case EnrollmentStage.UNKNOWN:
default:
return FaceEnrollStages.UNKNOWN;
}
}
@NonNull
public static FaceAuthenticationFrame toFrameworkAuthenticationFrame(
@NonNull AuthenticationFrame frame) {
return new FaceAuthenticationFrame(toFrameworkBaseFrame(frame.data));
}
@NonNull
public static FaceEnrollFrame toFrameworkEnrollmentFrame(@NonNull EnrollmentFrame frame) {
return new FaceEnrollFrame(
toFrameworkCell(frame.cell),
toFrameworkEnrollmentStage(frame.stage),
toFrameworkBaseFrame(frame.data));
}
@NonNull
public static FaceDataFrame toFrameworkBaseFrame(@NonNull BaseFrame frame) {
return new FaceDataFrame(
toFrameworkAcquiredInfo(frame.acquiredInfo),
frame.vendorCode,
frame.pan,
frame.tilt,
frame.distance,
frame.isCancellable);
}
@Nullable
public static FaceEnrollCell toFrameworkCell(@Nullable Cell cell) {
return cell == null ? null : new FaceEnrollCell(cell.x, cell.y, cell.z);
}
public static byte convertFrameworkToAidlFeature(int feature) throws IllegalArgumentException {
switch (feature) {
case BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION:
return Feature.REQUIRE_ATTENTION;
case BiometricFaceConstants.FEATURE_REQUIRE_REQUIRE_DIVERSITY:
return Feature.REQUIRE_DIVERSE_POSES;
default:
Slog.e(TAG, "Unsupported feature : " + feature);
throw new IllegalArgumentException();
}
}
public static int convertAidlToFrameworkFeature(byte feature) throws IllegalArgumentException {
switch (feature) {
case Feature.REQUIRE_ATTENTION:
return BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION;
case Feature.REQUIRE_DIVERSE_POSES:
return BiometricFaceConstants.FEATURE_REQUIRE_REQUIRE_DIVERSITY;
default:
Slog.e(TAG, "Unsupported feature : " + feature);
throw new IllegalArgumentException();
}
}
}