Fix Preview stretch when VideoCapture is bound

 Use TEMPLATE_PREVIEW instead of TEMPLATE_RECORD can workaround this issue.

Bug: 227469801
Test: manually testing
Change-Id: I8493d62cd5f963346b9f459ff2e8cfeed578d45c
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
index ced0af2..9c57d72 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
@@ -45,6 +45,7 @@
 
 import android.graphics.ImageFormat;
 import android.graphics.Rect;
+import android.hardware.camera2.CameraDevice;
 import android.media.MediaCodec;
 import android.util.Pair;
 import android.util.Range;
@@ -98,6 +99,8 @@
 import androidx.camera.core.processing.SurfaceEffectNode;
 import androidx.camera.video.StreamInfo.StreamState;
 import androidx.camera.video.impl.VideoCaptureConfig;
+import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.video.internal.compat.quirk.PreviewStretchWhenVideoCaptureIsBoundQuirk;
 import androidx.camera.video.internal.config.MimeInfo;
 import androidx.camera.video.internal.encoder.InvalidConfigException;
 import androidx.camera.video.internal.encoder.VideoEncoderConfig;
@@ -144,6 +147,8 @@
     private static final String SURFACE_UPDATE_KEY =
             "androidx.camera.video.VideoCapture.streamUpdate";
     private static final Defaults DEFAULT_CONFIG = new Defaults();
+    private static final boolean HAS_PREVIEW_STRETCH_QUIRK =
+            DeviceQuirks.get(PreviewStretchWhenVideoCaptureIsBoundQuirk.class) != null;
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     DeferrableSurface mDeferrableSurface;
@@ -504,6 +509,9 @@
         SessionConfig.Builder sessionConfigBuilder = SessionConfig.Builder.createFrom(config);
         sessionConfigBuilder.addErrorListener(
                 (sessionConfig, error) -> resetPipeline(cameraId, config, resolution));
+        if (HAS_PREVIEW_STRETCH_QUIRK) {
+            sessionConfigBuilder.setTemplateType(CameraDevice.TEMPLATE_PREVIEW);
+        }
 
         return sessionConfigBuilder;
     }
@@ -737,6 +745,7 @@
         Logger.d(TAG, "candidatesList = " + candidatesList);
 
         // Find the smallest change in dimensions.
+        //noinspection ComparatorCombinators - Suggestion by Comparator.comparingInt is for API24+
         Collections.sort(candidatesList,
                 (s1, s2) -> (Math.abs(s1.getWidth() - cropRect.width()) + Math.abs(
                         s1.getHeight() - cropRect.height()))
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
index 33843db..151ba52 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
@@ -77,6 +77,9 @@
         if (NegativeLatLongSavesIncorrectlyQuirk.load()) {
             quirks.add(new NegativeLatLongSavesIncorrectlyQuirk());
         }
+        if (PreviewStretchWhenVideoCaptureIsBoundQuirk.load()) {
+            quirks.add(new PreviewStretchWhenVideoCaptureIsBoundQuirk());
+        }
 
         return quirks;
     }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewStretchWhenVideoCaptureIsBoundQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewStretchWhenVideoCaptureIsBoundQuirk.java
new file mode 100644
index 0000000..6e433bf
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewStretchWhenVideoCaptureIsBoundQuirk.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.compat.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+/**
+ * <p>QuirkSummary
+ *     Bug Id: b/227469801
+ *     Description: Quirk indicates Preview is stretched when VideoCapture is bound.
+ *     Device(s): Samsung J3, Samsung J7, Samsung J1 Ace neo and Oppo A37F
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class PreviewStretchWhenVideoCaptureIsBoundQuirk implements Quirk {
+
+    static boolean load() {
+        return isHuaweiP8Lite() || isSamsungJ3() || isSamsungJ7() || isSamsungJ1AceNeo()
+                || isOppoA37F();
+    }
+
+    private static boolean isHuaweiP8Lite() {
+        return "HUAWEI".equalsIgnoreCase(Build.MANUFACTURER)
+                && "HUAWEI ALE-L04".equalsIgnoreCase(Build.MODEL);
+    }
+
+    private static boolean isSamsungJ3() {
+        return "Samsung".equalsIgnoreCase(Build.MANUFACTURER)
+                && "sm-j320f".equalsIgnoreCase(Build.MODEL);
+    }
+
+    private static boolean isSamsungJ7() {
+        return "Samsung".equalsIgnoreCase(Build.MANUFACTURER)
+                && "sm-j700f".equalsIgnoreCase(Build.MODEL);
+    }
+
+    private static boolean isSamsungJ1AceNeo() {
+        return "Samsung".equalsIgnoreCase(Build.MANUFACTURER)
+                && "sm-j111f".equalsIgnoreCase(Build.MODEL);
+    }
+
+    private static boolean isOppoA37F() {
+        return "OPPO".equalsIgnoreCase(Build.MANUFACTURER) && "A37F".equalsIgnoreCase(Build.MODEL);
+    }
+}