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));
         }
     }
 }