Camera API2: Add support for partial result quirk

- Camera3Device: Include requestId in partial 3A results
- FrameProcessorBase: Add support for partial result listeners
- CameraDeviceClient: Listen and forward partial results to client

Bug: 11115603
Change-Id: If1cc6bbc32932742ac142c058688761ebf6a8024
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index cb72e0e..3dbc1b0 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1405,7 +1405,8 @@
  * Check if all 3A fields are ready, and send off a partial 3A-only result
  * to the output frame queue
  */
-bool Camera3Device::processPartial3AQuirk(int32_t frameNumber,
+bool Camera3Device::processPartial3AQuirk(
+        int32_t frameNumber, int32_t requestId,
         const CameraMetadata& partial) {
 
     // Check if all 3A states are present
@@ -1452,10 +1453,10 @@
 
     if (!gotAllStates) return false;
 
-    ALOGVV("%s: Camera %d: Frame %d: AF mode %d, AWB mode %d, "
+    ALOGVV("%s: Camera %d: Frame %d, Request ID %d: AF mode %d, AWB mode %d, "
         "AF state %d, AE state %d, AWB state %d, "
         "AF trigger %d, AE precapture trigger %d",
-        __FUNCTION__, mId, frameNumber,
+        __FUNCTION__, mId, frameNumber, requestId,
         afMode, awbMode,
         afState, aeState, awbState,
         afTriggerId, aeTriggerId);
@@ -1463,9 +1464,10 @@
     // Got all states, so construct a minimal result to send
     // In addition to the above fields, this means adding in
     //   android.request.frameCount
+    //   android.request.requestId
     //   android.quirks.partialResult
 
-    const size_t kMinimal3AResultEntries = 7;
+    const size_t kMinimal3AResultEntries = 10;
 
     Mutex::Autolock l(mOutputLock);
 
@@ -1479,6 +1481,11 @@
         return false;
     }
 
+    if (!insert3AResult(min3AResult, ANDROID_REQUEST_ID,
+            &requestId, frameNumber)) {
+        return false;
+    }
+
     static const uint8_t partialResult = ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL;
     if (!insert3AResult(min3AResult, ANDROID_QUIRKS_PARTIAL_RESULT,
             &partialResult, frameNumber)) {
@@ -1615,7 +1622,8 @@
                 if (!request.partialResultQuirk.haveSent3A) {
                     request.partialResultQuirk.haveSent3A =
                             processPartial3AQuirk(frameNumber,
-                                request.partialResultQuirk.collectedResult);
+                                    request.requestId,
+                                    request.partialResultQuirk.collectedResult);
                 }
             }
         }