Add blacklist for camera protection

Bug: 150540299
Test: atest SystemUITests
Change-Id: Ica395ba060cbbdbd0eef424e6f05decaff3f308c
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 62335ab..a0dd9bf 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -523,6 +523,10 @@
     <!--  ID for the camera that needs extra protection -->
     <string translatable="false" name="config_protectedCameraId"></string>
 
+    <!-- Comma-separated list of packages to exclude from camera protection e.g.
+    "com.android.systemui,com.android.xyz" -->
+    <string translatable="false" name="config_cameraProtectionExcludedPackages"></string>
+
     <!--  Flag to turn on the rendering of the above path or not  -->
     <bool name="config_enableDisplayCutoutProtection">false</bool>
 
diff --git a/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt b/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt
index 284074e..3015710 100644
--- a/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt
@@ -37,20 +37,22 @@
     private val cameraManager: CameraManager,
     private val cutoutProtectionPath: Path,
     private val targetCameraId: String,
+    excludedPackages: String,
     private val executor: Executor
 ) {
     private var cutoutBounds = Rect()
+    private val excludedPackageIds: Set<String>
     private val listeners = mutableListOf<CameraTransitionCallback>()
     private val availabilityCallback: CameraManager.AvailabilityCallback =
             object : CameraManager.AvailabilityCallback() {
-                override fun onCameraAvailable(cameraId: String) {
+                override fun onCameraClosed(cameraId: String) {
                     if (targetCameraId == cameraId) {
                         notifyCameraInactive()
                     }
                 }
 
-                override fun onCameraUnavailable(cameraId: String) {
-                    if (targetCameraId == cameraId) {
+                override fun onCameraOpened(cameraId: String, packageId: String) {
+                    if (targetCameraId == cameraId && !isExcluded(packageId)) {
                         notifyCameraActive()
                     }
                 }
@@ -64,6 +66,7 @@
                 computed.top.roundToInt(),
                 computed.right.roundToInt(),
                 computed.bottom.roundToInt())
+        excludedPackageIds = excludedPackages.split(",").toSet()
     }
 
     /**
@@ -87,6 +90,10 @@
         listeners.remove(callback)
     }
 
+    private fun isExcluded(packageId: String): Boolean {
+        return excludedPackageIds.contains(packageId)
+    }
+
     private fun registerCameraListener() {
         cameraManager.registerAvailabilityCallback(executor, availabilityCallback)
     }
@@ -118,9 +125,10 @@
             val res = context.resources
             val pathString = res.getString(R.string.config_frontBuiltInDisplayCutoutProtection)
             val cameraId = res.getString(R.string.config_protectedCameraId)
+            val excluded = res.getString(R.string.config_cameraProtectionExcludedPackages)
 
             return CameraAvailabilityListener(
-                    manager, pathFromString(pathString), cameraId, executor)
+                    manager, pathFromString(pathString), cameraId, excluded, executor)
         }
 
         private fun pathFromString(pathString: String): Path {
@@ -135,4 +143,4 @@
             return p
         }
     }
-}
\ No newline at end of file
+}