Expose ProcessProgressed Callback in CameraPipe

Pipe onCaptureProcessProgressed from Requests.Listener to
ExtensionSessionWrapper.

Bug: 360878524

Test: ./gradlew --info --strict \
:camera:camera-camera2-pipe:testDebugUnitTest \
 :camera:camera-camera2-pipe:compileDebugUnitTestKotlin \
 :camera:camera-camera2-pipe-testing:testDebugUnitTest \
 :camera:camera-camera2-pipe-testing:compileDebugUnitTestKotlin \
 :camera:camera-camera2-pipe-integration:testDebugUnitTest \
 :camera:camera-camera2-pipe-integration:compileDebugUnitTestKotlin \
 :camera:integration-tests:camera-testapp-camera2-pipe:testDebugUnitTest \
 :camera:integration-tests:camera-testapp-camera2-pipe:compileDebugUnitTestKotlin

Change-Id: If99a4752bbc89bfe4b2a2e3b1b43e86df02b5499
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
index d75b9f9..89467a3 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Requests.kt
@@ -18,6 +18,8 @@
 
 import android.hardware.camera2.CameraCaptureSession
 import android.hardware.camera2.CameraDevice
+import android.hardware.camera2.CameraExtensionCharacteristics
+import android.hardware.camera2.CameraExtensionSession
 import android.hardware.camera2.CaptureFailure
 import android.hardware.camera2.CaptureRequest
 import android.view.Surface
@@ -107,6 +109,25 @@
         ) {}
 
         /**
+         * This event provides clients with an estimate of the post-processing progress of a capture
+         * which could take significantly more time relative to the rest of the
+         * [CameraExtensionSession.capture] sequence. The callback will be triggered only by
+         * extensions that return true from calls
+         * [CameraExtensionCharacteristics.isCaptureProcessProgressAvailable]. If support for this
+         * callback is present, then clients will be notified at least once with progress value 100.
+         * The callback will be triggered only for still capture requests
+         * [CameraExtensionSession.capture] and is not supported for repeating requests
+         * [CameraExtensionSession.setRepeatingRequest].
+         *
+         * @param requestMetadata the data about the camera2 request that was sent to the camera.
+         * @param progress the value indicating the current post-processing progress (between 0 and
+         *   100 inclusive)
+         * @see
+         *   android.hardware.camera2.CameraExtensionSession.ExtensionCaptureCallback.onCaptureProcessProgressed
+         */
+        public fun onCaptureProgress(requestMetadata: RequestMetadata, progress: Int) {}
+
+        /**
          * This event indicates that all of the metadata associated with this frame has been
          * produced. If [onPartialCaptureResult] was invoked, the values returned in the
          * totalCaptureResult map be a superset of the values produced from the
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureCallback.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureCallback.kt
index 9d10ac0..ebc244d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureCallback.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureCallback.kt
@@ -46,6 +46,8 @@
         frameNumber: FrameNumber
     )
 
+    fun onCaptureProcessProgressed(captureRequest: CaptureRequest, progress: Int)
+
     fun onCaptureFailed(captureRequest: CaptureRequest, frameNumber: FrameNumber)
 
     fun onCaptureSequenceCompleted(captureSequenceId: Int, captureFrameNumber: Long)
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
index 34a0a1d..cc5e292 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
@@ -184,6 +184,15 @@
         Debug.traceStop() // onCaptureCompleted
     }
 
+    override fun onCaptureProcessProgressed(captureRequest: CaptureRequest, progress: Int) {
+        Debug.traceStart { "onCaptureProcessProgressed" }
+        // Load the request and throw if we are not able to find an associated request. Under
+        // normal circumstances this should never happen.
+        val request = readRequestMetadata(captureRequest)
+        invokeOnRequest(request) { it.onCaptureProgress(request, progress) }
+        Debug.traceStop()
+    }
+
     override fun onCaptureFailed(
         captureSession: CameraCaptureSession,
         captureRequest: CaptureRequest,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExtensionSessionWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExtensionSessionWrapper.kt
index 7fb4d94..608dc0f 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExtensionSessionWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ExtensionSessionWrapper.kt
@@ -278,6 +278,14 @@
             request: CaptureRequest
         ) {}
 
+        override fun onCaptureProcessProgressed(
+            session: CameraExtensionSession,
+            request: CaptureRequest,
+            progress: Int
+        ) {
+            captureCallback.onCaptureProcessProgressed(request, progress)
+        }
+
         override fun onCaptureFailed(session: CameraExtensionSession, request: CaptureRequest) {
             val frameNumber = frameQueue.remove()
             captureCallback.onCaptureFailed(request, FrameNumber(frameNumber))
@@ -342,6 +350,14 @@
             }
         }
 
+        override fun onCaptureProcessProgressed(
+            session: CameraExtensionSession,
+            request: CaptureRequest,
+            progress: Int
+        ) {
+            captureCallback.onCaptureProcessProgressed(request, progress)
+        }
+
         override fun onCaptureSequenceCompleted(session: CameraExtensionSession, sequenceId: Int) {
             val frameNumber = extensionSessionMap[session]
             captureCallback.onCaptureSequenceCompleted(sequenceId, frameNumber!!)