Merge "Add DisableAbortCapturesOnStopQuirk" into androidx-main
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/Device.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/Device.kt
index 9903ea5..457881a 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/Device.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/Device.kt
@@ -45,6 +45,8 @@
public fun isSamsungDevice(): Boolean = isDeviceFrom("Samsung")
+ public fun isTecnoDevice(): Boolean = isDeviceFrom("Tecno") || isDeviceFrom("Tecno-mobile")
+
public fun isXiaomiDevice(): Boolean = isDeviceFrom("Xiaomi")
public fun isVivoDevice(): Boolean = isDeviceFrom("Vivo")
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.kt
index 7a1560f..425db10 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DeviceQuirksLoader.kt
@@ -64,6 +64,14 @@
}
if (
quirkSettings.shouldEnableQuirk(
+ DisableAbortCapturesOnStopQuirk::class.java,
+ DisableAbortCapturesOnStopQuirk.isEnabled()
+ )
+ ) {
+ quirks.add(DisableAbortCapturesOnStopQuirk())
+ }
+ if (
+ quirkSettings.shouldEnableQuirk(
DisableAbortCapturesOnStopWithSessionProcessorQuirk::class.java,
DisableAbortCapturesOnStopWithSessionProcessorQuirk.isEnabled()
)
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DisableAbortCapturesOnStopQuirk.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DisableAbortCapturesOnStopQuirk.kt
new file mode 100644
index 0000000..7579a63
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/quirk/DisableAbortCapturesOnStopQuirk.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2024 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.camera2.pipe.integration.compat.quirk
+
+import android.annotation.SuppressLint
+import androidx.camera.core.impl.Quirk
+
+/**
+ * Quirk needed on devices where faulty implementations of abortCaptures can lead to undesirable
+ * behaviors such as camera HAL crashing.
+ *
+ * QuirkSummary
+ * - Bug Id: 356792947
+ * - Description: Instructs CameraPipe to not abort captures when stopping.
+ *
+ * TODO(b/270421716): enable CameraXQuirksClassDetector lint check when kotlin is supported.
+ */
+@SuppressLint("CameraXQuirksClassDetector")
+public class DisableAbortCapturesOnStopQuirk : Quirk {
+ public companion object {
+ @JvmStatic
+ public fun isEnabled(): Boolean {
+ return Device.isTecnoDevice()
+ }
+ }
+}
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
index fa61309..c5fd744 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
@@ -52,6 +52,7 @@
import androidx.camera.camera2.pipe.integration.compat.quirk.CloseCaptureSessionOnDisconnectQuirk
import androidx.camera.camera2.pipe.integration.compat.quirk.CloseCaptureSessionOnVideoQuirk
import androidx.camera.camera2.pipe.integration.compat.quirk.DeviceQuirks
+import androidx.camera.camera2.pipe.integration.compat.quirk.DisableAbortCapturesOnStopQuirk
import androidx.camera.camera2.pipe.integration.compat.quirk.DisableAbortCapturesOnStopWithSessionProcessorQuirk
import androidx.camera.camera2.pipe.integration.compat.quirk.FinalizeSessionOnCloseQuirk
import androidx.camera.camera2.pipe.integration.compat.quirk.QuickSuccessiveImageCaptureFailsRepeatingRequestQuirk
@@ -1102,6 +1103,7 @@
DeviceQuirks[
DisableAbortCapturesOnStopWithSessionProcessorQuirk::class.java] !=
null -> false
+ DeviceQuirks[DisableAbortCapturesOnStopQuirk::class.java] != null -> false
/** @see [CameraGraph.Flags.abortCapturesOnStop] */
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> true
else -> false