diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/UdfpsHelper.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/UdfpsHelper.java index 879c8a0317d7..ff139e73cf2a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/UdfpsHelper.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/UdfpsHelper.java @@ -82,6 +82,13 @@ public static int getReasonFromEnrollReason(@FingerprintManager.EnrollReason int public static void showUdfpsOverlay(int sensorId, int reason, @Nullable IUdfpsOverlayController udfpsOverlayController, @NonNull AcquisitionClient client) { + showUdfpsOverlay(null, sensorId, reason, udfpsOverlayController, client); + } + + public static void showUdfpsOverlay(IBiometricsFingerprint daemon, + int sensorId, int reason, + @Nullable IUdfpsOverlayController udfpsOverlayController, + @NonNull AcquisitionClient client) { if (udfpsOverlayController == null) { return; } @@ -94,6 +101,23 @@ public void onUserCanceled() { } }; + if (daemon != null) { + android.hardware.biometrics.fingerprint.V2_3.IBiometricsFingerprint extension = + android.hardware.biometrics.fingerprint.V2_3.IBiometricsFingerprint.castFrom( + daemon); + if (extension != null) { + try { + extension.onShowUdfpsOverlay(); + } catch (RemoteException e) { + Slog.v(TAG, "showUdfpsOverlay | RemoteException: ", e); + } + } else { + Slog.v(TAG, "onShowUdfpsOverlay | failed to cast the HIDL to V2_3"); + } + } else { + Slog.v(TAG, "onShowUdfpsOverlay | daemon null"); + } + try { udfpsOverlayController.showUdfpsOverlay(sensorId, reason, callback); } catch (RemoteException e) { @@ -103,9 +127,32 @@ public void onUserCanceled() { public static void hideUdfpsOverlay(int sensorId, @Nullable IUdfpsOverlayController udfpsOverlayController) { + hideUdfpsOverlay(null, sensorId, udfpsOverlayController); + } + + public static void hideUdfpsOverlay(IBiometricsFingerprint daemon, int sensorId, + @Nullable IUdfpsOverlayController udfpsOverlayController) { if (udfpsOverlayController == null) { return; } + + if (daemon != null) { + android.hardware.biometrics.fingerprint.V2_3.IBiometricsFingerprint extension = + android.hardware.biometrics.fingerprint.V2_3.IBiometricsFingerprint.castFrom( + daemon); + if (extension != null) { + try { + extension.onHideUdfpsOverlay(); + } catch (RemoteException e) { + Slog.v(TAG, "hideUdfpsOverlay | RemoteException: ", e); + } + } else { + Slog.v(TAG, "onHideUdfpsOverlay | failed to cast the HIDL to V2_3"); + } + } else { + Slog.v(TAG, "onHideUdfpsOverlay | daemon null"); + } + try { udfpsOverlayController.hideUdfpsOverlay(sensorId); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index ba8a1d65f56b..adc174258bc9 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -119,7 +119,7 @@ public void onAuthenticated(BiometricAuthenticator.Identifier identifier, if (authenticated) { mState = STATE_STOPPED; resetFailedAttempts(getTargetUserId()); - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); } else { mState = STATE_STARTED_PAUSED_ATTEMPTED; final @LockoutTracker.LockoutMode int lockoutMode = @@ -132,7 +132,7 @@ public void onAuthenticated(BiometricAuthenticator.Identifier identifier, // Send the error, but do not invoke the FinishCallback yet. Since lockout is not // controlled by the HAL, the framework must stop the sensor before finishing the // client. - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); onErrorInternal(errorCode, 0 /* vendorCode */, false /* finish */); cancel(); } @@ -147,7 +147,7 @@ public void onError(int errorCode, int vendorCode) { BiometricNotificationUtils.showBadCalibrationNotification(getContext()); } - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); } private void resetFailedAttempts(int userId) { @@ -175,7 +175,7 @@ public boolean wasUserDetected() { @Override protected void startHalOperation() { - UdfpsHelper.showUdfpsOverlay(getSensorId(), Utils.getUdfpsAuthReason(this), + UdfpsHelper.showUdfpsOverlay(getFreshDaemon(), getSensorId(), Utils.getUdfpsAuthReason(this), mUdfpsOverlayController, this); try { // GroupId was never used. In fact, groupId is always the same as userId. @@ -184,14 +184,14 @@ protected void startHalOperation() { Slog.e(TAG, "Remote exception when requesting auth", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); mCallback.onClientFinished(this, false /* success */); } } @Override protected void stopHalOperation() { - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); try { getFreshDaemon().cancel(); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java index 8e73ee6b3e9f..995c2228bbab 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java @@ -65,7 +65,7 @@ public FingerprintDetectClient(@NonNull Context context, @Override protected void stopHalOperation() { - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); try { getFreshDaemon().cancel(); } catch (RemoteException e) { @@ -84,7 +84,7 @@ public void start(@NonNull Callback callback) { @Override protected void startHalOperation() { - UdfpsHelper.showUdfpsOverlay(getSensorId(), + UdfpsHelper.showUdfpsOverlay(getFreshDaemon(), getSensorId(), IUdfpsOverlayController.REASON_AUTH_FPM_KEYGUARD, mUdfpsOverlayController, this); try { @@ -93,7 +93,7 @@ protected void startHalOperation() { Slog.e(TAG, "Remote exception when requesting auth", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); mCallback.onClientFinished(this, false /* success */); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java index dc705346f534..6d423bfe25ae 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java @@ -95,7 +95,7 @@ protected boolean hasReachedEnrollmentLimit() { @Override protected void startHalOperation() { - UdfpsHelper.showUdfpsOverlay(getSensorId(), + UdfpsHelper.showUdfpsOverlay(getFreshDaemon(), getSensorId(), UdfpsHelper.getReasonFromEnrollReason(mEnrollReason), mUdfpsOverlayController, this); SidefpsHelper.showOverlay(mSidefpsController); @@ -107,7 +107,7 @@ protected void startHalOperation() { Slog.e(TAG, "Remote exception when requesting enroll", e); onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */); - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); SidefpsHelper.hideOverlay(mSidefpsController); mCallback.onClientFinished(this, false /* success */); } @@ -115,7 +115,7 @@ protected void startHalOperation() { @Override protected void stopHalOperation() { - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); SidefpsHelper.hideOverlay(mSidefpsController); try { getFreshDaemon().cancel(); @@ -134,7 +134,7 @@ public void onEnrollResult(BiometricAuthenticator.Identifier identifier, int rem UdfpsHelper.onEnrollmentProgress(getSensorId(), remaining, mUdfpsOverlayController); if (remaining == 0) { - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); SidefpsHelper.hideOverlay(mSidefpsController); } } @@ -152,7 +152,7 @@ public void onAcquired(int acquiredInfo, int vendorCode) { public void onError(int errorCode, int vendorCode) { super.onError(errorCode, vendorCode); - UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); + UdfpsHelper.hideUdfpsOverlay(getFreshDaemon(), getSensorId(), mUdfpsOverlayController); SidefpsHelper.hideOverlay(mSidefpsController); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/TestHal.java index 986e92e244f0..713e2b726c04 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/TestHal.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/TestHal.java @@ -63,6 +63,12 @@ public void onFingerUp() { } + @Override + public void onShowUdfpsOverlay() {} + + @Override + public void onHideUdfpsOverlay() {} + @Override public long setNotify(IBiometricsFingerprintClientCallback clientCallback) { mCallback = clientCallback; @@ -138,4 +144,4 @@ public int authenticate(long operationId, int gid) { Slog.w(TAG, "Authenticate"); return 0; } -} \ No newline at end of file +}