Camera2: replace partial quirks with normal partial result

Change-Id: I56550748478bf0aa1a7bf9a350b4fdc7bbd6af86
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 92046f3..8750194 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -81,6 +81,7 @@
 
     private final String mCameraId;
     private final CameraCharacteristics mCharacteristics;
+    private final int mTotalPartialCount;
 
     /**
      * A list tracking request and its expected last frame.
@@ -210,7 +211,7 @@
 
     public CameraDeviceImpl(String cameraId, StateListener listener, Handler handler,
                         CameraCharacteristics characteristics) {
-        if (cameraId == null || listener == null || handler == null) {
+        if (cameraId == null || listener == null || handler == null || characteristics == null) {
             throw new IllegalArgumentException("Null argument given");
         }
         mCameraId = cameraId;
@@ -226,6 +227,15 @@
         }
         TAG = tag;
         DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+        Integer partialCount =
+                mCharacteristics.get(CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT);
+        if (partialCount == null) {
+            // 1 means partial result is not supported.
+            mTotalPartialCount = 1;
+        } else {
+            mTotalPartialCount = partialCount;
+        }
     }
 
     public CameraDeviceCallbacks getCallbacks() {
@@ -1042,11 +1052,11 @@
                 final CaptureListenerHolder holder =
                         CameraDeviceImpl.this.mCaptureListenerMap.get(requestId);
 
-                Boolean quirkPartial = result.get(CaptureResult.QUIRKS_PARTIAL_RESULT);
-                boolean quirkIsPartialResult = (quirkPartial != null && quirkPartial);
+                boolean isPartialResult =
+                        (resultExtras.getPartialResultCount() < mTotalPartialCount);
 
                 // Update tracker (increment counter) when it's not a partial result.
-                if (!quirkIsPartialResult) {
+                if (!isPartialResult) {
                     mFrameNumberTracker.updateTracker(resultExtras.getFrameNumber(),
                             /*error*/false);
                 }
@@ -1076,7 +1086,7 @@
                 Runnable resultDispatch = null;
 
                 // Either send a partial result or the final capture completed result
-                if (quirkIsPartialResult) {
+                if (isPartialResult) {
                     final CaptureResult resultAsCapture =
                             new CaptureResult(result, request, requestId);
 
@@ -1113,7 +1123,7 @@
                 holder.getHandler().post(resultDispatch);
 
                 // Fire onCaptureSequenceCompleted
-                if (!quirkIsPartialResult) {
+                if (!isPartialResult) {
                     checkAndFireSequenceComplete();
                 }
 
diff --git a/core/java/android/hardware/camera2/impl/CaptureResultExtras.java b/core/java/android/hardware/camera2/impl/CaptureResultExtras.java
index 7544045..d859da7 100644
--- a/core/java/android/hardware/camera2/impl/CaptureResultExtras.java
+++ b/core/java/android/hardware/camera2/impl/CaptureResultExtras.java
@@ -27,6 +27,7 @@
     private int afTriggerId;
     private int precaptureTriggerId;
     private long frameNumber;
+    private int partialResultCount;
 
     public static final Parcelable.Creator<CaptureResultExtras> CREATOR =
             new Parcelable.Creator<CaptureResultExtras>() {
@@ -46,12 +47,14 @@
     }
 
     public CaptureResultExtras(int requestId, int subsequenceId, int afTriggerId,
-                               int precaptureTriggerId, long frameNumber) {
+                               int precaptureTriggerId, long frameNumber,
+                               int partialResultCount) {
         this.requestId = requestId;
         this.subsequenceId = subsequenceId;
         this.afTriggerId = afTriggerId;
         this.precaptureTriggerId = precaptureTriggerId;
         this.frameNumber = frameNumber;
+        this.partialResultCount = partialResultCount;
     }
 
     @Override
@@ -66,6 +69,7 @@
         dest.writeInt(afTriggerId);
         dest.writeInt(precaptureTriggerId);
         dest.writeLong(frameNumber);
+        dest.writeInt(partialResultCount);
     }
 
     public void readFromParcel(Parcel in) {
@@ -74,6 +78,7 @@
         afTriggerId = in.readInt();
         precaptureTriggerId = in.readInt();
         frameNumber = in.readLong();
+        partialResultCount = in.readInt();
     }
 
     public int getRequestId() {
@@ -96,4 +101,7 @@
         return frameNumber;
     }
 
+    public int getPartialResultCount() {
+        return partialResultCount;
+    }
 }
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index 5f29e5c..71d3d4b 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -73,10 +73,11 @@
     private CaptureResultExtras getExtrasFromRequest(RequestHolder holder) {
         if (holder == null) {
             return new CaptureResultExtras(ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE,
-                    ILLEGAL_VALUE, ILLEGAL_VALUE);
+                    ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE);
         }
         return new CaptureResultExtras(holder.getRequestId(), holder.getSubsequeceId(),
-                /*afTriggerId*/0, /*precaptureTriggerId*/0, holder.getFrameNumber());
+                /*afTriggerId*/0, /*precaptureTriggerId*/0, holder.getFrameNumber(),
+                /*partialResultCount*/1);
     }
 
     /**