Loading core/java/android/hardware/fingerprint/FingerprintCallback.java +1 −1 Original line number Diff line number Diff line Loading @@ -189,7 +189,7 @@ public class FingerprintCallback { mEnrollmentCallback.onAcquired(acquireInfo == FINGERPRINT_ACQUIRED_GOOD); } final String msg = getAcquiredString(context, acquireInfo, vendorCode); if (msg == null) { if (msg == null || msg.isEmpty()) { return; } // emulate HAL 2.1 behavior and send real acquiredInfo Loading packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +35 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.biometrics; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_UP; Loading Loading @@ -1437,4 +1438,38 @@ public class UdfpsControllerTest extends SysuiTestCase { // THEN vibrate is used verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS)); } @Test public void onAcquiredCalbacks() { runWithAllParams( this::ultrasonicCallbackOnAcquired); } public void ultrasonicCallbackOnAcquired(TestParams testParams) throws RemoteException{ if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC) { reset(mUdfpsView); UdfpsController.Callback callbackMock = mock(UdfpsController.Callback.class); mUdfpsController.addCallback(callbackMock); // GIVEN UDFPS overlay is showing mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId, BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback); mFgExecutor.runAllReady(); verify(mFingerprintManager).setUdfpsOverlayController( mUdfpsOverlayControllerCaptor.capture()); mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_START); mFgExecutor.runAllReady(); verify(callbackMock).onFingerDown(); mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_GOOD); mFgExecutor.runAllReady(); verify(callbackMock).onFingerUp(); } } } packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +29 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.biometrics; import static android.app.StatusBarManager.SESSION_BIOMETRIC_PROMPT; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START; import static android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_BP; import static android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_KEYGUARD; import static android.hardware.biometrics.BiometricRequestConstants.REASON_ENROLL_ENROLLING; Loading Loading @@ -329,6 +330,22 @@ public class UdfpsController implements DozeReceiver, Dumpable { int sensorId, @BiometricFingerprintConstants.FingerprintAcquired int acquiredInfo ) { if (isUltrasonic()) { if (acquiredInfo == FINGERPRINT_ACQUIRED_START) { mFgExecutor.execute(() -> { for (Callback cb : mCallbacks) { cb.onFingerDown(); } }); } else { mFgExecutor.execute(() -> { for (Callback cb : mCallbacks) { cb.onFingerUp(); } }); } } if (BiometricFingerprintConstants.shouldDisableUdfpsDisplayMode(acquiredInfo)) { boolean acquiredGood = acquiredInfo == FINGERPRINT_ACQUIRED_GOOD; mFgExecutor.execute(() -> { Loading Loading @@ -1024,6 +1041,10 @@ public class UdfpsController implements DozeReceiver, Dumpable { return mSensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; } private boolean isUltrasonic() { return mSensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC; } public boolean isFingerDown() { return mOnFingerDown; } Loading Loading @@ -1105,10 +1126,12 @@ public class UdfpsController implements DozeReceiver, Dumpable { } } if (isOptical()) { for (Callback cb : mCallbacks) { cb.onFingerDown(); } } } private void onFingerUp(long requestId, @NonNull View view) { onFingerUp( Loading Loading @@ -1143,10 +1166,12 @@ public class UdfpsController implements DozeReceiver, Dumpable { if (mOnFingerDown) { mFingerprintManager.onPointerUp(requestId, mSensorProps.sensorId, pointerId, x, y, minor, major, orientation, time, gestureStart, isAod); if (isOptical()) { for (Callback cb : mCallbacks) { cb.onFingerUp(); } } } mOnFingerDown = false; unconfigureDisplay(view); cancelAodSendFingerUpAction(); Loading Loading
core/java/android/hardware/fingerprint/FingerprintCallback.java +1 −1 Original line number Diff line number Diff line Loading @@ -189,7 +189,7 @@ public class FingerprintCallback { mEnrollmentCallback.onAcquired(acquireInfo == FINGERPRINT_ACQUIRED_GOOD); } final String msg = getAcquiredString(context, acquireInfo, vendorCode); if (msg == null) { if (msg == null || msg.isEmpty()) { return; } // emulate HAL 2.1 behavior and send real acquiredInfo Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +35 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.biometrics; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_UP; Loading Loading @@ -1437,4 +1438,38 @@ public class UdfpsControllerTest extends SysuiTestCase { // THEN vibrate is used verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS)); } @Test public void onAcquiredCalbacks() { runWithAllParams( this::ultrasonicCallbackOnAcquired); } public void ultrasonicCallbackOnAcquired(TestParams testParams) throws RemoteException{ if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC) { reset(mUdfpsView); UdfpsController.Callback callbackMock = mock(UdfpsController.Callback.class); mUdfpsController.addCallback(callbackMock); // GIVEN UDFPS overlay is showing mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId, BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback); mFgExecutor.runAllReady(); verify(mFingerprintManager).setUdfpsOverlayController( mUdfpsOverlayControllerCaptor.capture()); mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_START); mFgExecutor.runAllReady(); verify(callbackMock).onFingerDown(); mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_GOOD); mFgExecutor.runAllReady(); verify(callbackMock).onFingerUp(); } } }
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +29 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.biometrics; import static android.app.StatusBarManager.SESSION_BIOMETRIC_PROMPT; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START; import static android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_BP; import static android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_KEYGUARD; import static android.hardware.biometrics.BiometricRequestConstants.REASON_ENROLL_ENROLLING; Loading Loading @@ -329,6 +330,22 @@ public class UdfpsController implements DozeReceiver, Dumpable { int sensorId, @BiometricFingerprintConstants.FingerprintAcquired int acquiredInfo ) { if (isUltrasonic()) { if (acquiredInfo == FINGERPRINT_ACQUIRED_START) { mFgExecutor.execute(() -> { for (Callback cb : mCallbacks) { cb.onFingerDown(); } }); } else { mFgExecutor.execute(() -> { for (Callback cb : mCallbacks) { cb.onFingerUp(); } }); } } if (BiometricFingerprintConstants.shouldDisableUdfpsDisplayMode(acquiredInfo)) { boolean acquiredGood = acquiredInfo == FINGERPRINT_ACQUIRED_GOOD; mFgExecutor.execute(() -> { Loading Loading @@ -1024,6 +1041,10 @@ public class UdfpsController implements DozeReceiver, Dumpable { return mSensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; } private boolean isUltrasonic() { return mSensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC; } public boolean isFingerDown() { return mOnFingerDown; } Loading Loading @@ -1105,10 +1126,12 @@ public class UdfpsController implements DozeReceiver, Dumpable { } } if (isOptical()) { for (Callback cb : mCallbacks) { cb.onFingerDown(); } } } private void onFingerUp(long requestId, @NonNull View view) { onFingerUp( Loading Loading @@ -1143,10 +1166,12 @@ public class UdfpsController implements DozeReceiver, Dumpable { if (mOnFingerDown) { mFingerprintManager.onPointerUp(requestId, mSensorProps.sensorId, pointerId, x, y, minor, major, orientation, time, gestureStart, isAod); if (isOptical()) { for (Callback cb : mCallbacks) { cb.onFingerUp(); } } } mOnFingerDown = false; unconfigureDisplay(view); cancelAodSendFingerUpAction(); Loading