Do not show side fingerprint sensor overlay on keyguard. Bug: 197265282 Test: atest SidefpsControllerTest Test: manual (lock device and verify no overlay on keyguard) Change-Id: I7ff487e3d15d68ea1b182c6c7e7fd255801e4dea
diff --git a/core/java/android/hardware/fingerprint/ISidefpsController.aidl b/core/java/android/hardware/fingerprint/ISidefpsController.aidl index 00f4004..684f18f 100644 --- a/core/java/android/hardware/fingerprint/ISidefpsController.aidl +++ b/core/java/android/hardware/fingerprint/ISidefpsController.aidl
@@ -21,9 +21,9 @@ */ oneway interface ISidefpsController { - // Shows the overlay. - void show(); + // Shows the overlay for the given sensor with a reason from BiometricOverlayConstants. + void show(int sensorId, int reason); // Hides the overlay. - void hide(); + void hide(int sensorId); }
diff --git a/core/java/android/hardware/fingerprint/IUdfpsOverlayController.aidl b/core/java/android/hardware/fingerprint/IUdfpsOverlayController.aidl index 938431d..648edda 100644 --- a/core/java/android/hardware/fingerprint/IUdfpsOverlayController.aidl +++ b/core/java/android/hardware/fingerprint/IUdfpsOverlayController.aidl
@@ -22,7 +22,7 @@ * @hide */ oneway interface IUdfpsOverlayController { - // Shows the overlay. + // Shows the overlay for the given sensor with a reason from BiometricOverlayConstants. void showUdfpsOverlay(int sensorId, int reason, IUdfpsOverlayControllerCallback callback); // Hides the overlay.
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.kt index c0731b2..41c7ebe 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.kt
@@ -18,6 +18,8 @@ import android.content.Context import android.graphics.PixelFormat import android.graphics.Rect +import android.hardware.biometrics.BiometricOverlayConstants +import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD import android.hardware.display.DisplayManager import android.hardware.fingerprint.FingerprintManager import android.hardware.fingerprint.FingerprintSensorPropertiesInternal @@ -100,14 +102,20 @@ init { fingerprintManager?.setSidefpsController(object : ISidefpsController.Stub() { - override fun show() = mainExecutor.execute { + override fun show( + sensorId: Int, + @BiometricOverlayConstants.ShowReason reason: Int + ) = if (reason.isReasonToShow()) doShow() else hide(sensorId) + + private fun doShow() = mainExecutor.execute { if (overlayView == null) { overlayView = createOverlayForDisplay() } else { Log.v(TAG, "overlay already shown") } } - override fun hide() = mainExecutor.execute { overlayView = null } + + override fun hide(sensorId: Int) = mainExecutor.execute { overlayView = null } }) } @@ -165,6 +173,12 @@ } } +@BiometricOverlayConstants.ShowReason +private fun Int.isReasonToShow(): Boolean = when (this) { + REASON_AUTH_KEYGUARD -> false + else -> true +} + @RawRes private fun Display.asSideFpsAnimation(): Int = when (rotation) { Surface.ROTATION_0 -> R.raw.sfps_pulse
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt index 01e60e2..5fee7fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt
@@ -17,6 +17,8 @@ package com.android.systemui.biometrics import android.graphics.Rect +import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_KEYGUARD +import android.hardware.biometrics.BiometricOverlayConstants.REASON_UNKNOWN import android.hardware.biometrics.SensorProperties import android.hardware.display.DisplayManager import android.hardware.display.DisplayManagerGlobal @@ -128,25 +130,25 @@ @Test fun testSubscribesToOrientationChangesWhenShowingOverlay() { - overlayController.show() + overlayController.show(SENSOR_ID, REASON_UNKNOWN) executor.runAllReady() verify(displayManager).registerDisplayListener(any(), eq(handler)) - overlayController.hide() + overlayController.hide(SENSOR_ID) executor.runAllReady() verify(displayManager).unregisterDisplayListener(any()) } @Test fun testShowsAndHides() { - overlayController.show() + overlayController.show(SENSOR_ID, REASON_UNKNOWN) executor.runAllReady() verify(windowManager).addView(overlayCaptor.capture(), any()) reset(windowManager) - overlayController.hide() + overlayController.hide(SENSOR_ID) executor.runAllReady() verify(windowManager, never()).addView(any(), any()) @@ -156,7 +158,7 @@ @Test fun testShowsOnce() { repeat(5) { - overlayController.show() + overlayController.show(SENSOR_ID, REASON_UNKNOWN) executor.runAllReady() } @@ -166,15 +168,23 @@ @Test fun testHidesOnce() { - overlayController.show() + overlayController.show(SENSOR_ID, REASON_UNKNOWN) executor.runAllReady() repeat(5) { - overlayController.hide() + overlayController.hide(SENSOR_ID) executor.runAllReady() } verify(windowManager).addView(any(), any()) verify(windowManager).removeView(any()) } + + @Test + fun testIgnoredForKeyguard() { + overlayController.show(SENSOR_ID, REASON_AUTH_KEYGUARD) + executor.runAllReady() + + verify(windowManager, never()).addView(any(), any()) + } }
diff --git a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java index 6e2b9ef..0087178 100644 --- a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java +++ b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java
@@ -68,7 +68,7 @@ @NonNull AcquisitionClient<?> client) { if (mSidefpsController.isPresent()) { try { - mSidefpsController.get().show(); + mSidefpsController.get().show(sensorId, reason); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when showing the side-fps overlay", e); } @@ -99,7 +99,7 @@ public void hide(int sensorId) { if (mSidefpsController.isPresent()) { try { - mSidefpsController.get().hide(); + mSidefpsController.get().hide(sensorId); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when hiding the side-fps overlay", e); }
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java index 2f45fb9..dc39b6d 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/SensorOverlaysTest.java
@@ -95,7 +95,7 @@ verify(mUdfpsOverlayController).showUdfpsOverlay(eq(SENSOR_ID), eq(reason), any()); } if (sidefps != null) { - verify(mSidefpsController).show(); + verify(mSidefpsController).show(eq(SENSOR_ID), eq(reason)); } } @@ -123,7 +123,7 @@ verify(mUdfpsOverlayController).hideUdfpsOverlay(eq(SENSOR_ID)); } if (sidefps != null) { - verify(mSidefpsController).hide(); + verify(mSidefpsController).hide(eq(SENSOR_ID)); } } }