Enable stress test for pipe config
- Replace Camera2CameraInfo usages to other approaches. e.g. Using CameraInfoInternal instead.
- OpenCloseCameraStressTest uses CameraDevice.StateCallback to monitor state events. Skip pipe-integration part because it can't run passed now.
- OpenCloseCaptureSessionStressTest uses CameraCaptureSession.StateCallback to monitor state events. Skip pipe-integration part because it can't run passed now.
Bug: 254198768
Test: manual test locally and run MH test on some lab devices
Change-Id: I63cdf4fdf1b0b380f70f5d6f535d51891a996c5e
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
index ff9cca4..2a55cbd 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
@@ -22,14 +22,16 @@
import android.os.HandlerThread
import android.util.Log
import android.util.Size
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageProxy
import androidx.camera.core.Preview
import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.integration.core.util.StressTestUtil
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
@@ -38,6 +40,7 @@
import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_VIDEO_CAPTURE
import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.GLUtil
import androidx.camera.testing.LabTestRule
@@ -81,11 +84,18 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class BindUnbindUseCasesStressTest(
- private val cameraId: String
+ val implName: String,
+ val cameraConfig: CameraXConfig,
+ val cameraId: String
) {
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CameraPipeConfig::class.simpleName,
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraConfig)
)
@get:Rule
@@ -135,6 +145,8 @@
@Before
fun setUp(): Unit = runBlocking {
+ // Configures the test target config
+ ProcessCameraProvider.configureInstance(cameraConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -164,9 +176,8 @@
@JvmField val stressTest = StressTestRule()
@JvmStatic
- @get:Parameterized.Parameters(name = "cameraId = {0}")
- val parameters: Collection<String>
- get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+ @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+ fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
}
@LabTestRule.LabTestOnly
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt
index 52c6853..0fa1f88 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt
@@ -17,17 +17,22 @@
package androidx.camera.integration.core
import android.content.Context
-import androidx.camera.camera2.Camera2Config
+import android.hardware.camera2.CameraDevice
+import androidx.camera.camera2.interop.Camera2Interop
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraState
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
+import androidx.camera.integration.core.util.StressTestUtil
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.CameraUtil.PreTestCameraIdList
import androidx.camera.testing.LabTestRule
@@ -36,7 +41,6 @@
import androidx.camera.testing.fakes.FakeLifecycleOwner
import androidx.camera.video.Recorder
import androidx.camera.video.VideoCapture
-import androidx.lifecycle.Observer
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.LargeTest
import androidx.test.filters.SdkSuppress
@@ -60,11 +64,18 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class OpenCloseCameraStressTest(
- private val cameraId: String
+ val implName: String,
+ val cameraConfig: CameraXConfig,
+ val cameraId: String
) {
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CameraPipeConfig::class.simpleName,
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- PreTestCameraIdList(Camera2Config.defaultConfig())
+ PreTestCameraIdList(cameraConfig)
)
@get:Rule
@@ -81,9 +92,14 @@
private lateinit var preview: Preview
private lateinit var imageCapture: ImageCapture
private lateinit var lifecycleOwner: FakeLifecycleOwner
+ private val cameraDeviceStateMonitor = CameraDeviceStateMonitor()
@Before
fun setUp(): Unit = runBlocking {
+ // Skips CameraPipe part now and will open this when camera-pipe-integration can support
+ assumeTrue(implName != CameraPipeConfig::class.simpleName)
+ // Configures the test target config
+ ProcessCameraProvider.configureInstance(cameraConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -94,7 +110,7 @@
cameraProvider.bindToLifecycle(lifecycleOwner, cameraIdCameraSelector)
}
- preview = Preview.Builder().build()
+ preview = createPreviewWithDeviceStateMonitor(implName, cameraDeviceStateMonitor)
withContext(Dispatchers.Main) {
preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
}
@@ -116,16 +132,19 @@
@JvmField val stressTest = StressTestRule()
@JvmStatic
- @get:Parameterized.Parameters(name = "cameraId = {0}")
- val parameters: Collection<String>
- get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+ @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+ fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
}
@LabTestRule.LabTestOnly
@Test
@RepeatRule.Repeat(times = STRESS_TEST_REPEAT_COUNT)
fun openCloseCameraStressTest_withPreviewImageCapture(): Unit = runBlocking {
- bindUseCase_unbindAll_toCheckCameraState_repeatedly(preview, imageCapture)
+ bindUseCase_unbindAll_toCheckCameraState_repeatedly(
+ preview,
+ imageCapture,
+ cameraDeviceStateMonitor = cameraDeviceStateMonitor
+ )
}
@LabTestRule.LabTestOnly
@@ -137,7 +156,8 @@
bindUseCase_unbindAll_toCheckCameraState_repeatedly(
preview,
imageCapture,
- imageAnalysis = imageAnalysis
+ imageAnalysis = imageAnalysis,
+ cameraDeviceStateMonitor = cameraDeviceStateMonitor
)
}
@@ -146,7 +166,11 @@
@RepeatRule.Repeat(times = STRESS_TEST_REPEAT_COUNT)
fun openCloseCameraStressTest_withPreviewVideoCapture(): Unit = runBlocking {
val videoCapture = VideoCapture.withOutput(Recorder.Builder().build())
- bindUseCase_unbindAll_toCheckCameraState_repeatedly(preview, videoCapture = videoCapture)
+ bindUseCase_unbindAll_toCheckCameraState_repeatedly(
+ preview,
+ videoCapture = videoCapture,
+ cameraDeviceStateMonitor = cameraDeviceStateMonitor
+ )
}
@LabTestRule.LabTestOnly
@@ -158,7 +182,8 @@
bindUseCase_unbindAll_toCheckCameraState_repeatedly(
preview,
videoCapture = videoCapture,
- imageCapture = imageCapture
+ imageCapture = imageCapture,
+ cameraDeviceStateMonitor = cameraDeviceStateMonitor
)
}
@@ -172,7 +197,8 @@
bindUseCase_unbindAll_toCheckCameraState_repeatedly(
preview,
videoCapture = videoCapture,
- imageAnalysis = imageAnalysis
+ imageAnalysis = imageAnalysis,
+ cameraDeviceStateMonitor = cameraDeviceStateMonitor
)
}
@@ -188,23 +214,13 @@
imageCapture: ImageCapture? = null,
videoCapture: VideoCapture<Recorder>? = null,
imageAnalysis: ImageAnalysis? = null,
+ cameraDeviceStateMonitor: CameraDeviceStateMonitor,
repeatCount: Int = STRESS_TEST_OPERATION_REPEAT_COUNT
): Unit = runBlocking {
for (i in 1..repeatCount) {
- val openCameraLatch = CountDownLatch(1)
- val closeCameraLatch = CountDownLatch(1)
- val observer = Observer<CameraState> { state ->
- if (state.type == CameraState.Type.OPEN) {
- openCameraLatch.countDown()
- } else if (state.type == CameraState.Type.CLOSED) {
- closeCameraLatch.countDown()
- }
- }
+ cameraDeviceStateMonitor.reset()
withContext(Dispatchers.Main) {
- // Arrange: sets up CameraState observer
- camera.cameraInfo.cameraState.observe(lifecycleOwner, observer)
-
// VideoCapture needs to be recreated everytime until b/212654991 is fixed
var newVideoCapture: VideoCapture<Recorder>? = null
videoCapture?.let {
@@ -224,21 +240,68 @@
)
}
- // Assert: checks the CameraState.Type.OPEN can be received
- assertThat(openCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+ // Assert: checks the CameraDevice opened event can be received
+ cameraDeviceStateMonitor.awaitCameraOpenedAndAssert()
// Act: unbinds all use cases
withContext(Dispatchers.Main) {
cameraProvider.unbindAll()
}
- // Assert: checks the CameraState.Type.CLOSED can be received
- assertThat(closeCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+ // Assert: checks the CameraDevice closed event can be received
+ cameraDeviceStateMonitor.awaitCameraClosedAndAssert()
+ }
+ }
- // Clean it up.
- withContext(Dispatchers.Main) {
- camera.cameraInfo.cameraState.removeObserver(observer)
+ @OptIn(ExperimentalCamera2Interop::class)
+ private fun createPreviewWithDeviceStateMonitor(
+ implementationName: String,
+ cameraDeviceStateMonitor: CameraDeviceStateMonitor
+ ): Preview {
+ val builder = Preview.Builder()
+
+ when (implementationName) {
+ CameraPipeConfig::class.simpleName -> {
+ androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender(builder)
+ .setDeviceStateCallback(cameraDeviceStateMonitor)
}
+ else -> Camera2Interop.Extender(builder)
+ .setDeviceStateCallback(cameraDeviceStateMonitor)
+ }
+
+ return builder.build()
+ }
+
+ private class CameraDeviceStateMonitor : CameraDevice.StateCallback() {
+ private var openCameraLatch = CountDownLatch(1)
+ private var closeCameraLatch = CountDownLatch(1)
+ override fun onOpened(p0: CameraDevice) {
+ openCameraLatch.countDown()
+ }
+
+ override fun onClosed(camera: CameraDevice) {
+ closeCameraLatch.countDown()
+ }
+
+ override fun onDisconnected(p0: CameraDevice) {
+ // No op.
+ }
+
+ override fun onError(p0: CameraDevice, p1: Int) {
+ // No op.
+ }
+
+ fun reset() {
+ openCameraLatch = CountDownLatch(1)
+ closeCameraLatch = CountDownLatch(1)
+ }
+
+ fun awaitCameraOpenedAndAssert() {
+ assertThat(openCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+ }
+
+ fun awaitCameraClosedAndAssert() {
+ assertThat(closeCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
}
}
}
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt
index a6dfbca..4a33164 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt
@@ -17,20 +17,23 @@
package androidx.camera.integration.core
import android.content.Context
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.impl.Camera2ImplConfig
-import androidx.camera.camera2.impl.CameraEventCallback
-import androidx.camera.camera2.impl.CameraEventCallbacks
+import android.hardware.camera2.CameraCaptureSession
+import android.hardware.camera2.CameraCaptureSession.StateCallback
+import androidx.camera.camera2.interop.Camera2Interop
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
-import androidx.camera.core.impl.CaptureConfig
+import androidx.camera.integration.core.util.StressTestUtil
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.LabTestRule
import androidx.camera.testing.StressTestRule
@@ -61,11 +64,18 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class OpenCloseCaptureSessionStressTest(
- private val cameraId: String
+ val implName: String,
+ val cameraConfig: CameraXConfig,
+ val cameraId: String
) {
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CameraPipeConfig::class.simpleName,
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraConfig)
)
@get:Rule
@@ -82,10 +92,14 @@
private lateinit var preview: Preview
private lateinit var imageCapture: ImageCapture
private lateinit var lifecycleOwner: FakeLifecycleOwner
- private val cameraEventMonitor = CameraEventMonitor()
+ private val sessionStateMonitor = CameraCaptureSessionStateMonitor()
@Before
fun setUp(): Unit = runBlocking {
+ // Skips CameraPipe part now and will open this when camera-pipe-integration can support
+ assumeTrue(implName != CameraPipeConfig::class.simpleName)
+ // Configures the test target config
+ ProcessCameraProvider.configureInstance(cameraConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -96,9 +110,10 @@
cameraProvider.bindToLifecycle(lifecycleOwner, cameraIdCameraSelector)
}
- // Creates the Preview with the CameraEventMonitor to monitor whether the event callbacks
- // are called.
- preview = createPreviewWithCameraEventMonitor(cameraEventMonitor)
+ // Creates the Preview with the CameraCaptureSessionStateMonitor to monitor whether the
+ // event callbacks are called.
+ preview = createPreviewWithSessionStateMonitor(implName, sessionStateMonitor)
+
withContext(Dispatchers.Main) {
preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
}
@@ -193,7 +208,7 @@
): Unit = runBlocking {
for (i in 1..repeatCount) {
// Arrange: resets the camera event monitor
- cameraEventMonitor.reset()
+ sessionStateMonitor.reset()
withContext(Dispatchers.Main) {
// VideoCapture needs to be recreated everytime until b/212654991 is fixed
@@ -215,16 +230,13 @@
)
}
- // Assert: checks the CameraEvent#onEnableSession callback function is called
- cameraEventMonitor.awaitSessionEnabledAndAssert()
+ // Assert: checks the capture session opened callback function is called
+ sessionStateMonitor.awaitSessionConfiguredAndAssert()
// Act: unbinds all use cases
withContext(Dispatchers.Main) {
cameraProvider.unbindAll()
}
-
- // Assert: checks the CameraEvent#onSessionDisabled callback function is called
- cameraEventMonitor.awaitSessionDisabledAndAssert()
}
}
@@ -233,51 +245,49 @@
@JvmField val stressTest = StressTestRule()
@JvmStatic
- @get:Parameterized.Parameters(name = "cameraId = {0}")
- val parameters: Collection<String>
- get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+ @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+ fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
}
- private fun createPreviewWithCameraEventMonitor(
- cameraEventMonitor: CameraEventMonitor
+ @OptIn(ExperimentalCamera2Interop::class)
+ private fun createPreviewWithSessionStateMonitor(
+ implementationName: String,
+ sessionStateMonitor: CameraCaptureSessionStateMonitor
): Preview {
val builder = Preview.Builder()
- Camera2ImplConfig.Extender(builder)
- .setCameraEventCallback(CameraEventCallbacks(cameraEventMonitor))
+ when (implementationName) {
+ CameraPipeConfig::class.simpleName -> {
+ androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender(
+ builder
+ ).setSessionStateCallback(sessionStateMonitor)
+ }
+ else -> Camera2Interop.Extender(builder).setSessionStateCallback(sessionStateMonitor)
+ }
return builder.build()
}
/**
- * An implementation of CameraEventCallback to monitor whether the camera event callbacks are
- * called properly or not.
+ * An implementation of CameraCaptureSession.StateCallback to monitor whether the event
+ * callbacks are called properly or not.
*/
- private class CameraEventMonitor : CameraEventCallback() {
- private var sessionEnabledLatch = CountDownLatch(1)
- private var sessionDisabledLatch = CountDownLatch(1)
-
- override fun onEnableSession(): CaptureConfig? {
- sessionEnabledLatch.countDown()
- return null
+ private class CameraCaptureSessionStateMonitor : StateCallback() {
+ private var sessionConfiguredLatch = CountDownLatch(1)
+ override fun onConfigured(session: CameraCaptureSession) {
+ sessionConfiguredLatch.countDown()
}
- override fun onDisableSession(): CaptureConfig? {
- sessionDisabledLatch.countDown()
- return null
+ override fun onConfigureFailed(session: CameraCaptureSession) {
+ throw RuntimeException("Capture session configures failed!")
}
fun reset() {
- sessionEnabledLatch = CountDownLatch(1)
- sessionDisabledLatch = CountDownLatch(1)
+ sessionConfiguredLatch = CountDownLatch(1)
}
- fun awaitSessionEnabledAndAssert() {
- assertThat(sessionEnabledLatch.await(15000, TimeUnit.MILLISECONDS)).isTrue()
- }
-
- fun awaitSessionDisabledAndAssert() {
- assertThat(sessionDisabledLatch.await(15000, TimeUnit.MILLISECONDS)).isTrue()
+ fun awaitSessionConfiguredAndAssert() {
+ assertThat(sessionConfiguredLatch.await(15000, TimeUnit.MILLISECONDS)).isTrue()
}
}
}
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
index e37c5f1..c03d388 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class ImageAnalysisLifecycleStatusChangeStressTest constructor(cameraId: String) :
- LifecycleStatusChangeStressTestBase(cameraId) {
+class ImageAnalysisLifecycleStatusChangeStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
index f0996e9..6d2ab58 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class ImageAnalysisSwitchCameraStressTest constructor(cameraId: String) :
- SwitchCameraStressTestBase(cameraId) {
+class ImageAnalysisSwitchCameraStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
index 8e35e34..2682fa5 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class ImageCaptureLifecycleStatusChangeStressTest constructor(cameraId: String) :
- LifecycleStatusChangeStressTestBase(cameraId) {
+class ImageCaptureLifecycleStatusChangeStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
index befb664..a447c7f 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
@@ -18,7 +18,8 @@
import android.Manifest
import android.content.Context
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
import androidx.camera.integration.core.takePictureAndWaitForImageSavedIdle
@@ -28,6 +29,7 @@
import androidx.camera.integration.core.util.StressTestUtil.launchCameraXActivityAndWaitForPreviewReady
import androidx.camera.integration.core.waitForViewfinderIdle
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.CoreAppTestUtil
import androidx.camera.testing.LabTestRule
@@ -58,12 +60,21 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class ImageCaptureStressTest(val cameraId: String) {
+class ImageCaptureStressTest(
+ val implName: String,
+ val cameraConfig: CameraXConfig,
+ val cameraId: String
+) {
private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CameraPipeConfig::class.simpleName,
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraConfig)
)
@get:Rule
@@ -78,15 +89,17 @@
@get:Rule
val repeatRule = RepeatRule()
+ private val context = ApplicationProvider.getApplicationContext<Context>()
+ private lateinit var cameraProvider: ProcessCameraProvider
+
companion object {
@ClassRule
@JvmField
val stressTest = StressTestRule()
@JvmStatic
- @get:Parameterized.Parameters(name = "cameraId = {0}")
- val parameters: Collection<String>
- get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+ @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+ fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
}
@Before
@@ -94,6 +107,17 @@
Assume.assumeTrue(CameraUtil.deviceHasCamera())
CoreAppTestUtil.assumeCompatibleDevice()
CoreAppTestUtil.assumeNotUntestableFrontCamera(cameraId)
+
+ // For running the ImageCaptureStressTest, we need to get the target test camera to check
+ // whether the testing use case combination can be supported to skip unsupported cases. For
+ // the purpose, we force configure the target testing config first
+ // (Camera2Config/CameraPipeConfig) and gets the CameraProvider instance in the setup()
+ // function. Then, the activity launched afterward will also run on the same config
+ // environment. The setup config environment will be cleared after
+ // CameraProvider#shutdown() is called in the tearDown() function.
+ ProcessCameraProvider.configureInstance(cameraConfig)
+ cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
// Clear the device UI and check if there is no dialog or lock screen on the top of the
// window before start the test.
CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
@@ -106,17 +130,17 @@
@After
fun tearDown(): Unit = runBlocking {
+ if (::cameraProvider.isInitialized) {
+ withContext(Dispatchers.Main) {
+ cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+ }
+ }
+
// Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
// to other tests :)
device.unfreezeRotation()
device.pressHome()
device.waitForIdle(StressTestUtil.HOME_TIMEOUT_MS)
-
- withContext(Dispatchers.Main) {
- val context = ApplicationProvider.getApplicationContext<Context>()
- val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
- cameraProvider.shutdown()[10, TimeUnit.SECONDS]
- }
}
@LabTestRule.LabTestOnly
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
index c446e77..0837894 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,9 +35,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class ImageCaptureSwitchCameraStressTest constructor(cameraId: String) :
- SwitchCameraStressTestBase(cameraId) {
-
+class ImageCaptureSwitchCameraStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
@RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
index cfc9c26..3c59a34 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
@@ -18,9 +18,10 @@
import android.Manifest
import android.content.Context
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.recordVideoAndWaitForVideoSavedIdle
import androidx.camera.integration.core.takePictureAndWaitForImageSavedIdle
import androidx.camera.integration.core.util.StressTestUtil.HOME_TIMEOUT_MS
@@ -30,10 +31,12 @@
import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_PREVIEW
import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_VIDEO_CAPTURE
import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
+import androidx.camera.integration.core.util.StressTestUtil.getAllCameraXConfigCameraIdCombinations
import androidx.camera.integration.core.util.StressTestUtil.launchCameraXActivityAndWaitForPreviewReady
import androidx.camera.integration.core.waitForImageAnalysisIdle
import androidx.camera.integration.core.waitForViewfinderIdle
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.CoreAppTestUtil
import androidx.camera.testing.LabTestRule
@@ -57,13 +60,20 @@
import org.junit.runners.Parameterized
abstract class LifecycleStatusChangeStressTestBase(
+ val implName: String,
+ val cameraConfig: CameraXConfig,
val cameraId: String
) {
private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CameraPipeConfig::class.simpleName,
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraConfig)
)
@get:Rule
@@ -90,9 +100,8 @@
@JvmField val stressTest = StressTestRule()
@JvmStatic
- @get:Parameterized.Parameters(name = "cameraId = {0}")
- val parameters: Collection<String>
- get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+ @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+ fun data() = getAllCameraXConfigCameraIdCombinations()
}
@Before
@@ -109,6 +118,15 @@
// explicitly initiated from within the test.
device.setOrientationNatural()
+ // For running the LifecycleStatusChangeStressTest, we need to get the target test camera
+ // to check whether the testing use case combination can be supported to skip unsupported
+ // cases. For the purpose, we force configure the target testing config first
+ // (Camera2Config/CameraPipeConfig) and gets the CameraProvider instance in the setup()
+ // function. Then, the activity launched afterward will also run on the same config
+ // environment. The setup config environment will be cleared after
+ // CameraProvider#shutdown() is called in the tearDown() function.
+ ProcessCameraProvider.configureInstance(cameraConfig)
+
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
cameraIdCameraSelector = createCameraSelectorById(cameraId)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
index 04e4fe4..464e84d 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class PreviewLifecycleStatusChangeStressTest constructor(cameraId: String) :
- LifecycleStatusChangeStressTestBase(cameraId) {
+class PreviewLifecycleStatusChangeStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
index ee61902..30fc762 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -33,8 +34,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class PreviewSwitchCameraStressTest constructor(cameraId: String) :
- SwitchCameraStressTestBase(cameraId) {
+class PreviewSwitchCameraStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
index bbb9455..f710cab8 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
@@ -19,13 +19,15 @@
import android.Manifest
import android.content.Context
import android.hardware.camera2.CameraCharacteristics
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.interop.Camera2CameraInfo
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.impl.CameraInfoInternal
import androidx.camera.integration.core.recordVideoAndWaitForVideoSavedIdle
import androidx.camera.integration.core.switchCameraAndWaitForViewfinderIdle
import androidx.camera.integration.core.takePictureAndWaitForImageSavedIdle
+import androidx.camera.integration.core.util.StressTestUtil
import androidx.camera.integration.core.util.StressTestUtil.HOME_TIMEOUT_MS
import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
@@ -38,6 +40,7 @@
import androidx.camera.integration.core.waitForImageAnalysisIdle
import androidx.camera.integration.core.waitForViewfinderIdle
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.CoreAppTestUtil
import androidx.camera.testing.LabTestRule
@@ -60,13 +63,20 @@
import org.junit.runners.Parameterized
abstract class SwitchCameraStressTestBase(
+ val implName: String,
+ val cameraConfig: CameraXConfig,
val cameraId: String
) {
private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CameraPipeConfig::class.simpleName,
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraConfig)
)
@get:Rule
@@ -93,9 +103,8 @@
@JvmField val stressTest = StressTestRule()
@JvmStatic
- @get:Parameterized.Parameters(name = "cameraId = {0}")
- val parameters: Collection<String>
- get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+ @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+ fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
}
@Before
@@ -112,6 +121,15 @@
// explicitly initiated from within the test.
device.setOrientationNatural()
+ // For running the LifecycleStatusChangeStressTest, we need to get the target test camera
+ // to check whether the testing use case combination can be supported to skip unsupported
+ // cases. For the purpose, we force configure the target testing config first
+ // (Camera2Config/CameraPipeConfig) and gets the CameraProvider instance in the setup()
+ // function. Then, the activity launched afterward will also run on the same config
+ // environment. The setup config environment will be cleared after
+ // CameraProvider#shutdown() is called in the tearDown() function.
+ ProcessCameraProvider.configureInstance(cameraConfig)
+
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -233,9 +251,7 @@
// Checks whether the input camera can support the use case combination
assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
- val camera2CameraInfo = Camera2CameraInfo.from(camera.cameraInfo)
- val lensFacing =
- camera2CameraInfo.getCameraCharacteristic(CameraCharacteristics.LENS_FACING)
+ val lensFacing = (camera.cameraInfo as CameraInfoInternal).lensFacing
val otherLensFacingCameraSelector =
if (lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt
index cd215e3..13defec 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class VideoCaptureLifecycleStatusChangeStressTest constructor(cameraId: String) :
- LifecycleStatusChangeStressTestBase(cameraId) {
+class VideoCaptureLifecycleStatusChangeStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt
index 39e7011..7d8630d 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
package androidx.camera.integration.core.stresstest
+import androidx.camera.core.CameraXConfig
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -33,8 +34,11 @@
@LargeTest
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
-class VideoCaptureSwitchCameraStressTest constructor(cameraId: String) :
- SwitchCameraStressTestBase(cameraId) {
+class VideoCaptureSwitchCameraStressTest constructor(
+ implName: String,
+ cameraConfig: CameraXConfig,
+ cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
@LabTestRule.LabTestOnly
@Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt
index da6f867..857db58 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt
@@ -18,9 +18,8 @@
import android.content.Context
import android.content.Intent
-import androidx.annotation.OptIn
-import androidx.camera.camera2.interop.Camera2CameraInfo
-import androidx.camera.camera2.interop.ExperimentalCamera2Interop
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
import androidx.camera.core.Camera
import androidx.camera.core.CameraFilter
import androidx.camera.core.CameraInfo
@@ -28,6 +27,7 @@
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
+import androidx.camera.core.impl.CameraInfoInternal
import androidx.camera.integration.core.CameraXActivity
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
@@ -36,6 +36,7 @@
import androidx.camera.integration.core.CameraXActivity.INTENT_EXTRA_CAMERA_ID
import androidx.camera.integration.core.CameraXActivity.INTENT_EXTRA_USE_CASE_COMBINATION
import androidx.camera.integration.core.waitForViewfinderIdle
+import androidx.camera.testing.CameraUtil
import androidx.camera.video.Recorder
import androidx.camera.video.VideoCapture
import androidx.test.core.app.ActivityScenario
@@ -80,9 +81,7 @@
activityScenario.onActivity {
// Checks that the camera id is correct
- val camera2CameraInfo = Camera2CameraInfo.from(it.camera!!.cameraInfo)
-
- if (camera2CameraInfo.cameraId != cameraId) {
+ if ((it.camera!!.cameraInfo as CameraInfoInternal).cameraId != cameraId) {
it.finish()
throw IllegalArgumentException("The activity is not launched with the correct" +
" camera of expected id.")
@@ -131,11 +130,10 @@
}
@JvmStatic
- @OptIn(ExperimentalCamera2Interop::class)
fun createCameraSelectorById(cameraId: String) =
CameraSelector.Builder().addCameraFilter(CameraFilter { cameraInfos ->
cameraInfos.forEach {
- if (Camera2CameraInfo.from(it).cameraId.equals(cameraId)) {
+ if ((it as CameraInfoInternal).cameraId == cameraId) {
return@CameraFilter listOf<CameraInfo>(it)
}
}
@@ -143,6 +141,30 @@
throw IllegalArgumentException("No camera can be find for id: $cameraId")
}).build()
+ @JvmStatic
+ fun getAllCameraXConfigCameraIdCombinations() = mutableListOf<Array<Any?>>().apply {
+ val cameraxConfigs =
+ listOf(Camera2Config::class.simpleName, CameraPipeConfig::class.simpleName)
+
+ cameraxConfigs.forEach { configImplName ->
+ CameraUtil.getBackwardCompatibleCameraIdListOrThrow().forEach { cameraId ->
+ add(
+ arrayOf(
+ configImplName,
+ when (configImplName) {
+ CameraPipeConfig::class.simpleName ->
+ CameraPipeConfig.defaultConfig()
+ Camera2Config::class.simpleName ->
+ Camera2Config.defaultConfig()
+ else -> Camera2Config.defaultConfig()
+ },
+ cameraId
+ )
+ )
+ }
+ }
+ }
+
/**
* Large stress test repeat count to run the test
*/
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 24257c5..0d374a3 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -1276,7 +1276,6 @@
*
* @param calledBySelf flag indicates if this is a recursive call.
*/
- @OptIn(markerClass = ExperimentalCamera2Interop.class)
void tryBindUseCases(boolean calledBySelf) {
boolean isViewFinderReady = mViewFinder.getWidth() != 0 && mViewFinder.getHeight() != 0;
boolean isCameraReady = mCameraProvider != null;
@@ -1312,10 +1311,7 @@
// camera id.
if (mCurrentCameraSelector == mLaunchingCameraIdSelector
&& mLaunchingCameraLensFacing == UNKNOWN_LENS_FACING) {
- Camera2CameraInfo camera2CameraInfo =
- Camera2CameraInfo.from(mCamera.getCameraInfo());
- mLaunchingCameraLensFacing = camera2CameraInfo.getCameraCharacteristic(
- CameraCharacteristics.LENS_FACING);
+ mLaunchingCameraLensFacing = getLensFacing(mCamera.getCameraInfo());
}
List<UseCase> useCases = buildUseCases();
mCamera = bindToLifecycleSafely(useCases);
@@ -1989,10 +1985,9 @@
return new CameraSelector.Builder().addCameraFilter(new CameraFilter() {
@NonNull
@Override
- @OptIn(markerClass = ExperimentalCamera2Interop.class)
public List<CameraInfo> filter(@NonNull List<CameraInfo> cameraInfos) {
for (CameraInfo cameraInfo : cameraInfos) {
- if (cameraId.equals(Camera2CameraInfo.from(cameraInfo).getCameraId())) {
+ if (Objects.equals(cameraId, getCameraId(cameraInfo))) {
return Collections.singletonList(cameraInfo);
}
}
@@ -2001,4 +1996,53 @@
}
}).build();
}
+
+ private static int getLensFacing(@NonNull CameraInfo cameraInfo) {
+ try {
+ return getCamera2LensFacing(cameraInfo);
+ } catch (IllegalArgumentException e) {
+ return getCamera2PipeLensFacing(cameraInfo);
+ }
+ }
+
+ @OptIn(markerClass = ExperimentalCamera2Interop.class)
+ private static int getCamera2LensFacing(@NonNull CameraInfo cameraInfo) {
+ Integer lensFacing = Camera2CameraInfo.from(cameraInfo).getCameraCharacteristic(
+ CameraCharacteristics.LENS_FACING);
+
+ return lensFacing == null ? CameraCharacteristics.LENS_FACING_BACK : lensFacing;
+ }
+
+ @OptIn(markerClass =
+ androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop.class)
+ private static int getCamera2PipeLensFacing(@NonNull CameraInfo cameraInfo) {
+ Integer lensFacing =
+ androidx.camera.camera2.pipe.integration.interop.Camera2CameraInfo.from(
+ cameraInfo).getCameraCharacteristic(CameraCharacteristics.LENS_FACING);
+
+ return lensFacing == null ? CameraCharacteristics.LENS_FACING_BACK : lensFacing;
+ }
+
+ @NonNull
+ private static String getCameraId(@NonNull CameraInfo cameraInfo) {
+ try {
+ return getCamera2CameraId(cameraInfo);
+ } catch (IllegalArgumentException e) {
+ return getCameraPipeCameraId(cameraInfo);
+ }
+ }
+
+ @OptIn(markerClass = ExperimentalCamera2Interop.class)
+ @NonNull
+ private static String getCamera2CameraId(@NonNull CameraInfo cameraInfo) {
+ return Camera2CameraInfo.from(cameraInfo).getCameraId();
+ }
+
+ @OptIn(markerClass =
+ androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop.class)
+ @NonNull
+ private static String getCameraPipeCameraId(@NonNull CameraInfo cameraInfo) {
+ return androidx.camera.camera2.pipe.integration.interop.Camera2CameraInfo.from(
+ cameraInfo).getCameraId();
+ }
}