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