Merge changes I2b43bf9d,I7c020535,I2e3fe0cd into androidx-main
* changes:
Remove legacyDisableKotlinStrictApiMode from camera pipe integration
Remove legacyDisableKotlinStrictApiMode from camera pipe and camera pipe testing
Remove legacyDisableKotlinStrictApiMode from camera projects
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java
index b137a04..a297fd8 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java
@@ -333,14 +333,6 @@
assertThat(useCase.isDetached()).isTrue();
}
- @Test(expected = IllegalArgumentException.class)
- public void exception_whenCreatingWithDestroyedLifecycle() {
- mLifecycle.destroy();
-
- // Should throw IllegalArgumentException
- mRepository.createLifecycleCamera(mLifecycle, mCameraUseCaseAdapter);
- }
-
@Test
public void lifecycleCameraIsStopped_whenNewLifecycleIsStarted() {
// Starts first lifecycle and check LifecycleCamera active state is true.
@@ -617,6 +609,17 @@
assertThat(firstLifecycleCamera.isActive()).isTrue();
}
+ @Test
+ public void lifecycleCameraIsInactive_createAndBindToLifecycleCamera_AfterLifecycleDestroyed() {
+ mLifecycle.destroy();
+ LifecycleCamera lifecycleCamera = mRepository.createLifecycleCamera(mLifecycle,
+ mCameraUseCaseAdapter);
+ mRepository.bindToLifecycleCamera(lifecycleCamera, null, emptyList(),
+ Collections.singletonList(new FakeUseCase()), mCameraCoordinator);
+
+ assertThat(lifecycleCamera.isActive()).isFalse();
+ }
+
private CameraUseCaseAdapter createNewCameraUseCaseAdapter() {
String cameraId = String.valueOf(++mCameraId);
CameraInternal fakeCamera = new FakeCamera(cameraId);
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index a214cd9..0688972 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -380,22 +380,6 @@
}
@Test
- fun exception_withDestroyedLifecycle() {
- ProcessCameraProvider.configureInstance(FakeAppConfig.create())
-
- runBlocking(MainScope().coroutineContext) {
- provider = ProcessCameraProvider.getInstance(context).await()
-
- lifecycleOwner0.destroy()
-
- assertThrows<IllegalArgumentException> {
- provider.bindToLifecycle(lifecycleOwner0, CameraSelector.DEFAULT_BACK_CAMERA)
- }
- assertThat(provider.isConcurrentCameraModeOn).isFalse()
- }
- }
-
- @Test
fun bind_returnTheSameCameraForSameSelectorAndLifecycleOwner() {
ProcessCameraProvider.configureInstance(FakeAppConfig.create())
@@ -581,6 +565,23 @@
}
@Test
+ fun lifecycleCameraIsNotActive_bindAfterLifecycleDestroyed() {
+ ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+ runBlocking(MainScope().coroutineContext) {
+ provider = ProcessCameraProvider.getInstance(context).await()
+ val useCase = Preview.Builder().setSessionOptionUnpacker { _, _, _ -> }.build()
+ lifecycleOwner0.destroy()
+ val camera: LifecycleCamera =
+ provider.bindToLifecycle(
+ lifecycleOwner0,
+ CameraSelector.DEFAULT_BACK_CAMERA,
+ useCase
+ ) as LifecycleCamera
+ assertThat(camera.isActive).isFalse()
+ }
+ }
+
+ @Test
fun lifecycleCameraIsNotActive_unbindUseCase() {
ProcessCameraProvider.configureInstance(FakeAppConfig.create())
runBlocking(MainScope().coroutineContext) {
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java
index 7b6e1e2..244c443 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java
@@ -106,11 +106,6 @@
Preconditions.checkArgument(mCameraMap.get(key) == null, "LifecycleCamera already "
+ "exists for the given LifecycleOwner and set of cameras");
- if (lifecycleOwner.getLifecycle().getCurrentState() == State.DESTROYED) {
- throw new IllegalArgumentException(
- "Trying to create LifecycleCamera with destroyed lifecycle.");
- }
-
// Need to add observer before creating LifecycleCamera to make sure
// it can be stopped before the latest active one is started.'
lifecycleCamera = new LifecycleCamera(lifecycleOwner, cameraUseCaseAdaptor);
@@ -118,6 +113,12 @@
if (cameraUseCaseAdaptor.getUseCases().isEmpty()) {
lifecycleCamera.suspend();
}
+
+ // If the lifecycle is already DESTROYED, we don't need to register the camera.
+ if (lifecycleOwner.getLifecycle().getCurrentState() == State.DESTROYED) {
+ return lifecycleCamera;
+ }
+
registerCamera(lifecycleCamera);
}
return lifecycleCamera;
@@ -280,6 +281,10 @@
// LifecycleOwner.
LifecycleCameraRepositoryObserver observer =
getLifecycleCameraRepositoryObserver(lifecycleOwner);
+ if (observer == null) {
+ // LifecycleCamera is not registered due to lifecycle destroyed, simply do nothing.
+ return;
+ }
Set<Key> lifecycleCameraKeySet = mLifecycleObserverMap.get(observer);
// Bypass the use cases lifecycle owner validation when concurrent camera mode is on.
diff --git a/pdf/integration-tests/testapp/src/main/res/values-night/themes.xml b/pdf/integration-tests/testapp/src/main/res/values-night/themes.xml
deleted file mode 100644
index df40dfd..0000000
--- a/pdf/integration-tests/testapp/src/main/res/values-night/themes.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
- 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.
- -->
-
-<resources xmlns:tools="http://schemas.android.com/tools">
- <!-- Base application theme. -->
- <style name="Base.Theme.Androidx" parent="Theme.Material3.DayNight.NoActionBar">
- <!-- Customize your dark theme here. -->
- <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
- </style>
-</resources>
\ No newline at end of file
diff --git a/pdf/integration-tests/testapp/src/main/res/values/themes.xml b/pdf/integration-tests/testapp/src/main/res/values/themes.xml
index b12dd9b..c9e7c70 100644
--- a/pdf/integration-tests/testapp/src/main/res/values/themes.xml
+++ b/pdf/integration-tests/testapp/src/main/res/values/themes.xml
@@ -1,10 +1,4 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
+<resources>
<!-- Base application theme. -->
- <style name="BaseAppTheme" parent="Theme.Material3.Dark.NoActionBar">
- <item name="colorPrimary">@color/google_grey</item>
- <item name="colorPrimaryDark">@color/black</item>
- <item name="colorAccent">@color/google_white</item>
- </style>
-
- <style name="AppTheme" parent="BaseAppTheme" />
+ <style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar" />
</resources>
\ No newline at end of file
diff --git a/pdf/pdf-viewer/src/main/res/layout/pdf_viewer_container.xml b/pdf/pdf-viewer/src/main/res/layout/pdf_viewer_container.xml
index 4f91158..4ed1c38 100644
--- a/pdf/pdf-viewer/src/main/res/layout/pdf_viewer_container.xml
+++ b/pdf/pdf-viewer/src/main/res/layout/pdf_viewer_container.xml
@@ -39,7 +39,7 @@
android:layout_gravity="bottom|end"
android:visibility="gone"
android:src="@drawable/edit_fab"
- app:backgroundTint="#5D4200"
- app:tint="#FFDEA5"/>
+ app:backgroundTint="?attr/colorPrimaryContainer"
+ app:tint="?attr/colorOnPrimaryContainer" />
</FrameLayout>
\ No newline at end of file