diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeCustomConfigurationContextTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeCustomConfigurationContextTestCase.kt
index df6d2bc..9c05ff0 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeCustomConfigurationContextTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeCustomConfigurationContextTestCase.kt
@@ -16,19 +16,15 @@
 
 package androidx.appcompat.app
 
-import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
 import androidx.appcompat.app.NightModeCustomConfigurationActivity.CUSTOM_FONT_SCALE
 import androidx.appcompat.app.NightModeCustomConfigurationActivity.CUSTOM_LOCALE
+import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
-import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
-import androidx.test.rule.ActivityTestRule
-import org.junit.After
 import org.junit.Assert.assertEquals
-import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -40,23 +36,7 @@
 class NightModeCustomConfigurationContextTestCase(private val setMode: NightSetMode) {
 
     @get:Rule
-    val activityRule = ActivityTestRule(
-        NightModeCustomConfigurationActivity::class.java,
-        false,
-        false
-    )
-
-    @Before
-    fun setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below.
-        activityRule.runOnUiThread {
-            AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
-        }
-
-        // Launch the test activity
-        activityRule.launchActivity(null)
-    }
+    val activityRule = NightModeActivityTestRule(NightModeCustomConfigurationActivity::class.java)
 
     @Test
     @Suppress("DEPRECATION")
@@ -94,18 +74,6 @@
         assertEquals(CUSTOM_FONT_SCALE, config.fontScale)
     }
 
-    @After
-    fun cleanup() {
-        activityRule.finishActivity()
-
-        // Reset the default night mode
-        setNightModeAndWait(
-            activityRule,
-            MODE_NIGHT_NO,
-            NightSetMode.DEFAULT
-        )
-    }
-
     companion object {
         @JvmStatic
         @Parameterized.Parameters
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLateOnCreateTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLateOnCreateTestCase.kt
index b974a82..736520b 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLateOnCreateTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLateOnCreateTestCase.kt
@@ -17,15 +17,14 @@
 package androidx.appcompat.app
 
 import android.content.res.Configuration
+import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
 import androidx.lifecycle.Lifecycle
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-import androidx.testutils.LifecycleOwnerUtils
-import org.junit.Before
+import androidx.testutils.LifecycleOwnerUtils.waitUntilState
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -33,26 +32,13 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class NightModeLateOnCreateTestCase {
-
     @get:Rule
-    val activityRule = ActivityTestRule(NightModeLateOnCreateActivity::class.java, false, false)
-
-    @Before
-    @Throws(Throwable::class)
-    fun setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below.
-        activityRule.runOnUiThread {
-            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
-        }
-    }
+    val activityRule = NightModeActivityTestRule(NightModeLateOnCreateActivity::class.java)
 
     @Test
     fun testActivityRecreateLoop() {
-        activityRule.launchActivity(null)
-
         // Activity should be able to reach fully resumed state in default NIGHT_NO.
-        LifecycleOwnerUtils.waitUntilState(activityRule, Lifecycle.State.RESUMED)
+        waitUntilState(activityRule.activity, Lifecycle.State.RESUMED)
         assertConfigurationNightModeEquals(
             Configuration.UI_MODE_NIGHT_NO,
             activityRule.activity.resources.configuration
@@ -66,7 +52,7 @@
         )
 
         // Activity should be able to reach fully resumed state again.
-        LifecycleOwnerUtils.waitUntilState(activityRule, Lifecycle.State.RESUMED)
+        waitUntilState(activityRule.activity, Lifecycle.State.RESUMED)
 
         // The request night mode value should have been set during attachBaseContext().
         assertConfigurationNightModeEquals(
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLocalOnlyTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLocalOnlyTestCase.kt
new file mode 100644
index 0000000..d5b3dc4
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeLocalOnlyTestCase.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2019 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.appcompat.app
+
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.test.R
+import androidx.appcompat.testutils.NightModeActivityTestRule
+import androidx.appcompat.testutils.NightModeUtils.NightSetMode
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class NightModeLocalOnlyTestCase {
+    @get:Rule
+    val rule = NightModeActivityTestRule(NightModeActivity::class.java)
+
+    @Test
+    fun testLocalDayNightModeRecreatesActivity() {
+        // Verify first that we're in day mode
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+        // Now force the local night mode to be yes (aka night mode)
+        setNightModeAndWaitForRecreate(rule, MODE_NIGHT_YES, NightSetMode.LOCAL)
+
+        // Assert that the new local night mode is returned
+        assertEquals(MODE_NIGHT_YES, rule.activity.delegate.localNightMode)
+
+        // Now check the text has changed, signifying that night resources are being used
+        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+    }
+
+    companion object {
+        private const val STRING_DAY = "DAY"
+        private const val STRING_NIGHT = "NIGHT"
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModePreventOverrideConfigTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModePreventOverrideConfigTestCase.kt
index 5a7e146..075ff08 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModePreventOverrideConfigTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModePreventOverrideConfigTestCase.kt
@@ -16,22 +16,15 @@
 
 package androidx.appcompat.app
 
+import android.content.res.Configuration
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.testutils.NightModeActivityTestRule
+import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
-
-import android.content.res.Configuration
-import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
-
-import androidx.appcompat.testutils.NightModeUtils.NightSetMode
-import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
 import androidx.lifecycle.Lifecycle
 import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-import androidx.testutils.LifecycleOwnerUtils
-import org.junit.After
-
-import org.junit.Before
+import androidx.testutils.LifecycleOwnerUtils.waitUntilState
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -40,30 +33,13 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class NightModePreventOverrideConfigTestCase(private val setMode: NightSetMode) {
-
     @get:Rule
-    val activityRule = ActivityTestRule(
-        NightModePreventOverrideConfigActivity::class.java,
-        false,
-        false
-    )
-
-    @Before
-    fun setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below.
-        activityRule.runOnUiThread {
-            AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
-        }
-
-        // Launch the test activity
-        activityRule.launchActivity(null)
-    }
+    val activityRule = NightModeActivityTestRule(NightModePreventOverrideConfigActivity::class.java)
 
     @Test
     fun testActivityRecreate() {
         // Activity should be able to reach fully resumed state in default NIGHT_NO.
-        LifecycleOwnerUtils.waitUntilState(activityRule, Lifecycle.State.RESUMED)
+        waitUntilState(activityRule.activity, Lifecycle.State.RESUMED)
         assertConfigurationNightModeEquals(
             Configuration.UI_MODE_NIGHT_NO,
             activityRule.activity.resources.configuration
@@ -77,7 +53,7 @@
         )
 
         // Activity should be able to reach fully resumed state again.
-        LifecycleOwnerUtils.waitUntilState(activityRule, Lifecycle.State.RESUMED)
+        waitUntilState(activityRule.activity, Lifecycle.State.RESUMED)
 
         // The requested night mode value should have been set by
         // updateResourcesConfigurationForNightMode().
@@ -87,19 +63,6 @@
         )
     }
 
-    @After
-    @Throws(Throwable::class)
-    fun cleanup() {
-        activityRule.finishActivity()
-
-        // Reset the default night mode
-        setNightModeAndWait(
-            activityRule,
-            MODE_NIGHT_NO,
-            NightSetMode.DEFAULT
-        )
-    }
-
     companion object {
         @JvmStatic
         @Parameterized.Parameters
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
index bd54923..39eb12e 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
@@ -17,28 +17,20 @@
 package androidx.appcompat.app
 
 import android.content.pm.ActivityInfo
-import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
-import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
-import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
-import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
-import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
-import androidx.appcompat.testutils.TestUtilsActions.rotateScreenOrientation
-import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.matcher.ViewMatchers.isRoot
-
-import org.junit.Assert.assertNotSame
-import org.junit.Assert.assertSame
-
 import android.content.res.Configuration
 import android.os.Build
-
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
+import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
+import androidx.appcompat.testutils.TestUtilsActions.rotateScreenOrientation
 import androidx.appcompat.testutils.TestUtilsActions.setScreenOrientation
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.matcher.ViewMatchers.isRoot
 import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-
-import org.junit.After
-import org.junit.Before
+import org.junit.Assert.assertNotSame
+import org.junit.Assert.assertSame
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -47,25 +39,8 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class NightModeRotateDoesNotRecreateActivityTestCase(private val setMode: NightSetMode) {
-
     @get:Rule
-    val activityRule = ActivityTestRule(
-        NightModeRotateDoesNotRecreateActivity::class.java,
-        false,
-        false
-    )
-
-    @Before
-    fun setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below.
-        activityRule.runOnUiThread {
-            AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
-        }
-
-        // Launch the test activity
-        activityRule.launchActivity(null)
-    }
+    val activityRule = NightModeActivityTestRule(NightModeRotateDoesNotRecreateActivity::class.java)
 
     @Test
     fun testRotateDoesNotRecreateActivity() {
@@ -112,18 +87,6 @@
         activity.expectOnConfigurationChange(5000)
     }
 
-    @After
-    fun cleanup() {
-        activityRule.finishActivity()
-
-        // Reset the default night mode
-        setNightModeAndWait(
-            activityRule,
-            MODE_NIGHT_NO,
-            NightSetMode.DEFAULT
-        )
-    }
-
     companion object {
         @JvmStatic
         @Parameterized.Parameters
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
index 29ce98f..584ca00 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
@@ -16,24 +16,17 @@
 
 package androidx.appcompat.app
 
-import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
-import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
-import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
-import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
-import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
-
-import org.junit.Assert.assertNotSame
-
 import android.content.res.Configuration
 import android.os.Build
-
-import androidx.appcompat.testutils.NightModeUtils
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
+import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
+import androidx.appcompat.testutils.NightModeUtils.resetRotateAndWaitForRecreate
+import androidx.appcompat.testutils.NightModeUtils.rotateAndWaitForRecreate
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
 import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-
-import org.junit.After
-import org.junit.Before
+import org.junit.Assert.assertNotSame
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -42,26 +35,8 @@
 @LargeTest
 @RunWith(Parameterized::class)
 class NightModeRotateRecreatesActivityWithConfigTestCase(private val setMode: NightSetMode) {
-
     @get:Rule
-    val activityRule = ActivityTestRule(
-        // Use the basic DayNight-themed activity.
-        NightModeActivity::class.java,
-        false,
-        false
-    )
-
-    @Before
-    fun setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below.
-        activityRule.runOnUiThread {
-            AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
-        }
-
-        // Launch the test activity
-        activityRule.launchActivity(null)
-    }
+    val activityRule = NightModeActivityTestRule(NightModeActivity::class.java)
 
     @Test
     fun testRotateRecreatesActivityWithConfig() {
@@ -83,7 +58,7 @@
         // Assert that the current Activity is 'dark'
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, config)
 
-        NightModeUtils.rotateAndWaitForRecreate(activityRule)
+        rotateAndWaitForRecreate(activityRule.activity)
 
         // Assert that we got a new activity.
         val activity2 = activityRule.activity
@@ -95,19 +70,7 @@
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, config2)
 
         // Reset the requested orientation and wait for it to apply.
-        NightModeUtils.resetRotateAndWaitForRecreate(activityRule)
-    }
-
-    @After
-    fun cleanup() {
-        activityRule.finishActivity()
-
-        // Reset the default night mode
-        setNightModeAndWait(
-            activityRule,
-            MODE_NIGHT_NO,
-            NightSetMode.DEFAULT
-        )
+        resetRotateAndWaitForRecreate(activityRule.activity)
     }
 
     companion object {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
index 72c81da..bb958fb 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
@@ -17,42 +17,36 @@
 package androidx.appcompat.app
 
 import android.content.Context
+import android.content.res.Configuration
+import android.location.LocationManager
+import android.webkit.WebView
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.test.R
+import androidx.appcompat.testutils.NightModeActivityTestRule
+import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.isSystemNightThemeEnabled
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
 import androidx.appcompat.testutils.TestUtilsMatchers.isBackground
+import androidx.core.content.ContextCompat
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.matcher.ViewMatchers.withId
 import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.testutils.LifecycleOwnerUtils.waitForRecreation
-
+import androidx.testutils.waitForExecution
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNull
-
-import android.content.res.Configuration
-import android.location.LocationManager
-import android.webkit.WebView
-
-import androidx.appcompat.test.R
-import androidx.appcompat.testutils.NightModeUtils.NightSetMode
-import androidx.core.content.ContextCompat
-import androidx.test.filters.LargeTest
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.rule.ActivityTestRule
-
-import org.junit.After
-import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
-
 import java.util.concurrent.CountDownLatch
 
 @Suppress("DEPRECATION")
@@ -60,36 +54,7 @@
 @RunWith(Parameterized::class)
 class NightModeTestCase(private val setMode: NightSetMode) {
     @get:Rule
-    val rule = ActivityTestRule(NightModeActivity::class.java, false, false)
-
-    @Before
-    fun setup() {
-        // By default we'll set the night mode to NO, which allows us to make better
-        // assumptions in the test below
-        AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
-        // Now launch the test activity
-        rule.launchActivity(null)
-    }
-
-    @Test
-    fun testLocalDayNightModeRecreatesActivity() {
-        if (setMode != NightSetMode.LOCAL) {
-            // This test is only applicable when using setLocalNightMode
-            return
-        }
-
-        // Verify first that we're in day mode
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
-
-        // Now force the local night mode to be yes (aka night mode)
-        setNightModeAndWaitForRecreate(rule, MODE_NIGHT_YES, setMode)
-
-        // Assert that the new local night mode is returned
-        assertEquals(MODE_NIGHT_YES, rule.activity.delegate.localNightMode)
-
-        // Now check the text has changed, signifying that night resources are being used
-        onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
-    }
+    val rule = NightModeActivityTestRule(NightModeActivity::class.java)
 
     @Test
     fun testSwitchingYesDoesNotAffectApplication() {
@@ -234,9 +199,14 @@
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
 
         // Now show a AppCompatDialog
+        lateinit var dialog: AppCompatDialog
         rule.runOnUiThread {
-            AppCompatDialog(rule.activity).show()
+            dialog = AppCompatDialog(rule.activity)
+            dialog.show()
         }
+        rule.waitForExecution()
+        // Now dismiss the dialog
+        rule.runOnUiThread { dialog.dismiss() }
 
         // Assert that the uiMode is unchanged
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
@@ -244,9 +214,11 @@
 
     @Test
     fun testLoadingWebViewMaintainsConfiguration() {
+        // Assert that the context has a non-night themed configuration
+        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO, rule.activity)
+
         // Set night mode and wait for the new Activity
         setNightModeAndWaitForRecreate(rule, MODE_NIGHT_YES, setMode)
-
         // Assert that the context still has a night themed configuration
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
 
@@ -258,21 +230,19 @@
     }
 
     @Test
-    fun testDialogCleansUpAutoMode() {
-        rule.runOnUiThread {
-            val dialog = AppCompatDialog(rule.activity)
-            val delegate = dialog.delegate as AppCompatDelegateImpl
+    fun testDialogCleansUpAutoMode() = rule.runOnUiThread {
+        val dialog = AppCompatDialog(rule.activity)
+        val delegate = dialog.delegate as AppCompatDelegateImpl
 
-            // Set the local night mode of the Dialog to be an AUTO mode
-            delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_TIME
+        // Set the local night mode of the Dialog to be an AUTO mode
+        delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_TIME
 
-            // Now show and dismiss the dialog
-            dialog.show()
-            dialog.dismiss()
+        // Now show and dismiss the dialog
+        dialog.show()
+        dialog.dismiss()
 
-            // Assert that the auto manager is destroyed (not listening)
-            assertFalse(delegate.autoTimeNightModeManager.isListening)
-        }
+        // Assert that the auto manager is destroyed (not listening)
+        assertFalse(delegate.autoTimeNightModeManager.isListening)
     }
 
     @Test
@@ -290,13 +260,6 @@
         assertNull(activity.lastConfigurationChangeAndClear)
     }
 
-    @After
-    fun cleanup() {
-        rule.finishActivity()
-        // Reset the default night mode
-        setNightModeAndWait(rule, MODE_NIGHT_NO, NightSetMode.DEFAULT)
-    }
-
     private class FakeTwilightManager(context: Context) : TwilightManager(
         context,
         ContextCompat.getSystemService(context, LocationManager::class.java)!!
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeActivityTestRule.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeActivityTestRule.kt
new file mode 100644
index 0000000..4b97605
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeActivityTestRule.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019 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.appcompat.testutils
+
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.test.rule.ActivityTestRule
+
+class NightModeActivityTestRule<T : AppCompatActivity>(
+    activityClazz: Class<T>,
+    initialTouchMode: Boolean = false,
+    launchActivity: Boolean = true
+) : ActivityTestRule<T>(activityClazz, initialTouchMode, launchActivity) {
+    override fun beforeActivityLaunched() {
+        // By default we'll set the night mode to NO, which allows us to make better
+        // assumptions in the test below
+        runOnUiThread {
+            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
+        }
+    }
+
+    override fun afterActivityFinished() {
+        // Reset the default night mode
+        runOnUiThread {
+            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
+        }
+    }
+}
\ No newline at end of file
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeUtils.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeUtils.kt
index c3f7a31..c24369a 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeUtils.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/NightModeUtils.kt
@@ -16,8 +16,6 @@
 
 package androidx.appcompat.testutils
 
-import org.junit.Assert.assertEquals
-
 import android.app.UiModeManager
 import android.content.Context
 import android.content.pm.ActivityInfo
@@ -30,6 +28,7 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.ActivityTestRule
 import androidx.testutils.LifecycleOwnerUtils
+import org.junit.Assert.assertEquals
 
 object NightModeUtils {
     private const val LOG_TAG = "NightModeUtils"
@@ -95,9 +94,13 @@
         activityRule: ActivityTestRule<T>,
         @NightMode nightMode: Int,
         setMode: NightSetMode
-    ) {
-        val activity = activityRule.activity
+    ): T = setNightModeAndWaitForRecreate(activityRule.activity, nightMode, setMode)
 
+    fun <T : AppCompatActivity> setNightModeAndWaitForRecreate(
+        activity: T,
+        @NightMode nightMode: Int,
+        setMode: NightSetMode
+    ): T {
         Log.d(
             LOG_TAG, "setNightModeAndWaitForRecreate on Activity: " + activity +
                     " to mode: " + nightMode +
@@ -105,23 +108,20 @@
         )
 
         // Wait for the Activity to be resumed and visible
-        LifecycleOwnerUtils.waitUntilState(activity, activityRule, Lifecycle.State.RESUMED)
+        LifecycleOwnerUtils.waitUntilState(activity, Lifecycle.State.RESUMED)
 
         // Now perform night mode change wait for the Activity to be recreated
-        LifecycleOwnerUtils.waitForRecreation(activity, activityRule) {
+        return LifecycleOwnerUtils.waitForRecreation(activity) {
             setNightMode(nightMode, activity, setMode)
         }
     }
 
-    fun <T : AppCompatActivity> rotateAndWaitForRecreate(
-        activityRule: ActivityTestRule<T>
-    ) {
+    fun <T : AppCompatActivity> rotateAndWaitForRecreate(activity: T): T {
         Log.e(LOG_TAG, "request rotate")
-        val activity = activityRule.activity
-        LifecycleOwnerUtils.waitUntilState(activity, activityRule, Lifecycle.State.RESUMED)
+        LifecycleOwnerUtils.waitUntilState(activity, Lifecycle.State.RESUMED)
 
         // Now perform rotation and wait for the Activity to be recreated
-        LifecycleOwnerUtils.waitForRecreation(activity, activityRule) {
+        return LifecycleOwnerUtils.waitForRecreation(activity) {
             Log.e(LOG_TAG, "request rotate on ui thread")
             if (activity.resources.configuration.orientation ==
                 Configuration.ORIENTATION_LANDSCAPE) {
@@ -133,13 +133,10 @@
         }
     }
 
-    fun <T : AppCompatActivity> resetRotateAndWaitForRecreate(
-        activityRule: ActivityTestRule<T>
-    ) {
-        val activity = activityRule.activity
-        LifecycleOwnerUtils.waitUntilState(activity, activityRule, Lifecycle.State.RESUMED)
+    fun <T : AppCompatActivity> resetRotateAndWaitForRecreate(activity: T) {
+        LifecycleOwnerUtils.waitUntilState(activity, Lifecycle.State.RESUMED)
 
-        LifecycleOwnerUtils.waitForRecreation(activity, activityRule) {
+        LifecycleOwnerUtils.waitForRecreation(activity) {
             activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
         }
     }
@@ -153,11 +150,8 @@
         @NightMode nightMode: Int,
         activity: AppCompatActivity?,
         setMode: NightSetMode
-    ) {
-        if (setMode == NightSetMode.DEFAULT) {
-            AppCompatDelegate.setDefaultNightMode(nightMode)
-        } else {
-            activity!!.delegate.localNightMode = nightMode
-        }
+    ) = when (setMode) {
+        NightSetMode.DEFAULT -> AppCompatDelegate.setDefaultNightMode(nightMode)
+        NightSetMode.LOCAL -> activity!!.delegate.localNightMode = nightMode
     }
 }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 6d462f1..c869e11 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -129,8 +129,7 @@
 class AppCompatDelegateImpl extends AppCompatDelegate
         implements MenuBuilder.Callback, LayoutInflater.Factory2 {
 
-    private static final SimpleArrayMap<Class<?>, Integer> sLocalNightModes =
-            new SimpleArrayMap<>();
+    private static final SimpleArrayMap<String, Integer> sLocalNightModes = new SimpleArrayMap<>();
 
     private static final boolean DEBUG = false;
     private static final boolean IS_PRE_LOLLIPOP = Build.VERSION.SDK_INT < 21;
@@ -139,13 +138,12 @@
 
     /**
      * AppCompat selectively uses an override configuration for DayNight functionality.
-     * Unfortunately the framework has a few issues around Resources instances on SDKs 21-25,
+     * Unfortunately the framework has a few issues around Resources instances,
      * resulting in the root Resources instance (i.e. Application) being modified when it
      * shouldn't be. We can work around it by always calling using an override configuration
      * where available, to force a local resources instance being used.
      */
-    private static final boolean sAlwaysOverrideConfiguration = Build.VERSION.SDK_INT >= 21
-            && Build.VERSION.SDK_INT <= 25;
+    private static final boolean sAlwaysOverrideConfiguration = true;
 
     private static boolean sInstalledExceptionHandler;
 
@@ -312,11 +310,11 @@
         }
         if (mLocalNightMode == MODE_NIGHT_UNSPECIFIED) {
             // Try and read the current night mode from our static store
-            final Integer value = sLocalNightModes.get(mHost.getClass());
+            final Integer value = sLocalNightModes.get(mHost.getClass().getName());
             if (value != null) {
                 mLocalNightMode = value;
                 // Finally remove the value
-                sLocalNightModes.remove(mHost.getClass());
+                sLocalNightModes.remove(mHost.getClass().getName());
             }
         }
 
@@ -366,6 +364,10 @@
             final int newNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
 
             if (sAlwaysOverrideConfiguration || currentNightMode != newNightMode) {
+                if (DEBUG) {
+                    Log.d(TAG, String.format("Applying night mode using "
+                            + "createConfigurationContext(). Config: %s", config.toString()));
+                }
                 // If the target night mode is different to the new night mode, return a
                 // configuration context with the new config.
                 return super.attachBaseContext2(baseContext.createConfigurationContext(config));
@@ -563,12 +565,6 @@
         if (ab != null) {
             ab.setShowHideAnimationEnabled(false);
         }
-
-        if (mHost instanceof Dialog) {
-            // If the host is a Dialog, we should clean up the Auto managers now. This is
-            // because Dialogs do not have an onDestroy()
-            cleanupAutoManagers();
-        }
     }
 
     @Override
@@ -616,10 +612,6 @@
 
     @Override
     public void onSaveInstanceState(Bundle outState) {
-        if (mLocalNightMode != MODE_NIGHT_UNSPECIFIED) {
-            // If we have a local night mode set, save it
-            sLocalNightModes.put(mHost.getClass(), mLocalNightMode);
-        }
     }
 
     @Override
@@ -634,6 +626,15 @@
         mStarted = false;
         mIsDestroyed = true;
 
+        if (mLocalNightMode != MODE_NIGHT_UNSPECIFIED
+                && mHost instanceof Activity
+                && ((Activity) mHost).isChangingConfigurations()) {
+            // If we have a local night mode set, save it
+            sLocalNightModes.put(mHost.getClass().getName(), mLocalNightMode);
+        } else {
+            sLocalNightModes.remove(mHost.getClass().getName());
+        }
+
         if (mActionBar != null) {
             mActionBar.onDestroy();
         }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
index 865d6f5..d40a697 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
@@ -135,6 +135,13 @@
         getDelegate().onStop();
     }
 
+    @Override
+    public void dismiss() {
+        super.dismiss();
+        // There is no onDestroy in Dialog, so we simulate it from dismiss()
+        getDelegate().onDestroy();
+    }
+
     /**
      * Enable extended support library window features.
      * <p>
diff --git a/biometric/build.gradle b/biometric/build.gradle
index ff616ea..381bc39 100644
--- a/biometric/build.gradle
+++ b/biometric/build.gradle
@@ -32,10 +32,6 @@
 }
 
 android {
-    sourceSets {
-        main.res.srcDirs 'res'
-    }
-
     aaptOptions {
         noCompress 'ttf'
     }
diff --git a/biometric/res/color-v26/biometric_error_color.xml b/biometric/src/main/res/color-v26/biometric_error_color.xml
similarity index 100%
rename from biometric/res/color-v26/biometric_error_color.xml
rename to biometric/src/main/res/color-v26/biometric_error_color.xml
diff --git a/biometric/res/drawable-v23/fingerprint_dialog_error_to_fp.xml b/biometric/src/main/res/drawable-v23/fingerprint_dialog_error_to_fp.xml
similarity index 100%
rename from biometric/res/drawable-v23/fingerprint_dialog_error_to_fp.xml
rename to biometric/src/main/res/drawable-v23/fingerprint_dialog_error_to_fp.xml
diff --git a/biometric/res/drawable-v23/fingerprint_dialog_fp_to_error.xml b/biometric/src/main/res/drawable-v23/fingerprint_dialog_fp_to_error.xml
similarity index 100%
rename from biometric/res/drawable-v23/fingerprint_dialog_fp_to_error.xml
rename to biometric/src/main/res/drawable-v23/fingerprint_dialog_fp_to_error.xml
diff --git a/biometric/res/layout/device_credential_handler_activity.xml b/biometric/src/main/res/layout/device_credential_handler_activity.xml
similarity index 100%
rename from biometric/res/layout/device_credential_handler_activity.xml
rename to biometric/src/main/res/layout/device_credential_handler_activity.xml
diff --git a/biometric/res/layout/fingerprint_dialog_layout.xml b/biometric/src/main/res/layout/fingerprint_dialog_layout.xml
similarity index 100%
rename from biometric/res/layout/fingerprint_dialog_layout.xml
rename to biometric/src/main/res/layout/fingerprint_dialog_layout.xml
diff --git a/biometric/res/values-af/strings.xml b/biometric/src/main/res/values-af/strings.xml
similarity index 100%
rename from biometric/res/values-af/strings.xml
rename to biometric/src/main/res/values-af/strings.xml
diff --git a/biometric/res/values-am/strings.xml b/biometric/src/main/res/values-am/strings.xml
similarity index 100%
rename from biometric/res/values-am/strings.xml
rename to biometric/src/main/res/values-am/strings.xml
diff --git a/biometric/res/values-ar/strings.xml b/biometric/src/main/res/values-ar/strings.xml
similarity index 100%
rename from biometric/res/values-ar/strings.xml
rename to biometric/src/main/res/values-ar/strings.xml
diff --git a/biometric/res/values-as/strings.xml b/biometric/src/main/res/values-as/strings.xml
similarity index 100%
rename from biometric/res/values-as/strings.xml
rename to biometric/src/main/res/values-as/strings.xml
diff --git a/biometric/res/values-az/strings.xml b/biometric/src/main/res/values-az/strings.xml
similarity index 100%
rename from biometric/res/values-az/strings.xml
rename to biometric/src/main/res/values-az/strings.xml
diff --git a/biometric/res/values-b+sr+Latn/strings.xml b/biometric/src/main/res/values-b+sr+Latn/strings.xml
similarity index 100%
rename from biometric/res/values-b+sr+Latn/strings.xml
rename to biometric/src/main/res/values-b+sr+Latn/strings.xml
diff --git a/biometric/res/values-be/strings.xml b/biometric/src/main/res/values-be/strings.xml
similarity index 100%
rename from biometric/res/values-be/strings.xml
rename to biometric/src/main/res/values-be/strings.xml
diff --git a/biometric/res/values-bg/strings.xml b/biometric/src/main/res/values-bg/strings.xml
similarity index 100%
rename from biometric/res/values-bg/strings.xml
rename to biometric/src/main/res/values-bg/strings.xml
diff --git a/biometric/res/values-bn/strings.xml b/biometric/src/main/res/values-bn/strings.xml
similarity index 100%
rename from biometric/res/values-bn/strings.xml
rename to biometric/src/main/res/values-bn/strings.xml
diff --git a/biometric/res/values-bs/strings.xml b/biometric/src/main/res/values-bs/strings.xml
similarity index 100%
rename from biometric/res/values-bs/strings.xml
rename to biometric/src/main/res/values-bs/strings.xml
diff --git a/biometric/res/values-ca/strings.xml b/biometric/src/main/res/values-ca/strings.xml
similarity index 100%
rename from biometric/res/values-ca/strings.xml
rename to biometric/src/main/res/values-ca/strings.xml
diff --git a/biometric/res/values-cs/strings.xml b/biometric/src/main/res/values-cs/strings.xml
similarity index 100%
rename from biometric/res/values-cs/strings.xml
rename to biometric/src/main/res/values-cs/strings.xml
diff --git a/biometric/res/values-da/strings.xml b/biometric/src/main/res/values-da/strings.xml
similarity index 100%
rename from biometric/res/values-da/strings.xml
rename to biometric/src/main/res/values-da/strings.xml
diff --git a/biometric/res/values-de/strings.xml b/biometric/src/main/res/values-de/strings.xml
similarity index 100%
rename from biometric/res/values-de/strings.xml
rename to biometric/src/main/res/values-de/strings.xml
diff --git a/biometric/res/values-el/strings.xml b/biometric/src/main/res/values-el/strings.xml
similarity index 100%
rename from biometric/res/values-el/strings.xml
rename to biometric/src/main/res/values-el/strings.xml
diff --git a/biometric/res/values-en-rAU/strings.xml b/biometric/src/main/res/values-en-rAU/strings.xml
similarity index 100%
rename from biometric/res/values-en-rAU/strings.xml
rename to biometric/src/main/res/values-en-rAU/strings.xml
diff --git a/biometric/res/values-en-rCA/strings.xml b/biometric/src/main/res/values-en-rCA/strings.xml
similarity index 100%
rename from biometric/res/values-en-rCA/strings.xml
rename to biometric/src/main/res/values-en-rCA/strings.xml
diff --git a/biometric/res/values-en-rGB/strings.xml b/biometric/src/main/res/values-en-rGB/strings.xml
similarity index 100%
rename from biometric/res/values-en-rGB/strings.xml
rename to biometric/src/main/res/values-en-rGB/strings.xml
diff --git a/biometric/res/values-en-rIN/strings.xml b/biometric/src/main/res/values-en-rIN/strings.xml
similarity index 100%
rename from biometric/res/values-en-rIN/strings.xml
rename to biometric/src/main/res/values-en-rIN/strings.xml
diff --git a/biometric/res/values-en-rXC/strings.xml b/biometric/src/main/res/values-en-rXC/strings.xml
similarity index 100%
rename from biometric/res/values-en-rXC/strings.xml
rename to biometric/src/main/res/values-en-rXC/strings.xml
diff --git a/biometric/res/values-es-rUS/strings.xml b/biometric/src/main/res/values-es-rUS/strings.xml
similarity index 100%
rename from biometric/res/values-es-rUS/strings.xml
rename to biometric/src/main/res/values-es-rUS/strings.xml
diff --git a/biometric/res/values-es/strings.xml b/biometric/src/main/res/values-es/strings.xml
similarity index 100%
rename from biometric/res/values-es/strings.xml
rename to biometric/src/main/res/values-es/strings.xml
diff --git a/biometric/res/values-et/strings.xml b/biometric/src/main/res/values-et/strings.xml
similarity index 100%
rename from biometric/res/values-et/strings.xml
rename to biometric/src/main/res/values-et/strings.xml
diff --git a/biometric/res/values-eu/strings.xml b/biometric/src/main/res/values-eu/strings.xml
similarity index 100%
rename from biometric/res/values-eu/strings.xml
rename to biometric/src/main/res/values-eu/strings.xml
diff --git a/biometric/res/values-fa/strings.xml b/biometric/src/main/res/values-fa/strings.xml
similarity index 100%
rename from biometric/res/values-fa/strings.xml
rename to biometric/src/main/res/values-fa/strings.xml
diff --git a/biometric/res/values-fi/strings.xml b/biometric/src/main/res/values-fi/strings.xml
similarity index 100%
rename from biometric/res/values-fi/strings.xml
rename to biometric/src/main/res/values-fi/strings.xml
diff --git a/biometric/res/values-fr-rCA/strings.xml b/biometric/src/main/res/values-fr-rCA/strings.xml
similarity index 100%
rename from biometric/res/values-fr-rCA/strings.xml
rename to biometric/src/main/res/values-fr-rCA/strings.xml
diff --git a/biometric/res/values-fr/strings.xml b/biometric/src/main/res/values-fr/strings.xml
similarity index 100%
rename from biometric/res/values-fr/strings.xml
rename to biometric/src/main/res/values-fr/strings.xml
diff --git a/biometric/res/values-gl/strings.xml b/biometric/src/main/res/values-gl/strings.xml
similarity index 100%
rename from biometric/res/values-gl/strings.xml
rename to biometric/src/main/res/values-gl/strings.xml
diff --git a/biometric/res/values-gu/strings.xml b/biometric/src/main/res/values-gu/strings.xml
similarity index 100%
rename from biometric/res/values-gu/strings.xml
rename to biometric/src/main/res/values-gu/strings.xml
diff --git a/biometric/res/values-hi/strings.xml b/biometric/src/main/res/values-hi/strings.xml
similarity index 100%
rename from biometric/res/values-hi/strings.xml
rename to biometric/src/main/res/values-hi/strings.xml
diff --git a/biometric/res/values-hr/strings.xml b/biometric/src/main/res/values-hr/strings.xml
similarity index 100%
rename from biometric/res/values-hr/strings.xml
rename to biometric/src/main/res/values-hr/strings.xml
diff --git a/biometric/res/values-hu/strings.xml b/biometric/src/main/res/values-hu/strings.xml
similarity index 100%
rename from biometric/res/values-hu/strings.xml
rename to biometric/src/main/res/values-hu/strings.xml
diff --git a/biometric/res/values-hy/strings.xml b/biometric/src/main/res/values-hy/strings.xml
similarity index 100%
rename from biometric/res/values-hy/strings.xml
rename to biometric/src/main/res/values-hy/strings.xml
diff --git a/biometric/res/values-in/strings.xml b/biometric/src/main/res/values-in/strings.xml
similarity index 100%
rename from biometric/res/values-in/strings.xml
rename to biometric/src/main/res/values-in/strings.xml
diff --git a/biometric/res/values-is/strings.xml b/biometric/src/main/res/values-is/strings.xml
similarity index 100%
rename from biometric/res/values-is/strings.xml
rename to biometric/src/main/res/values-is/strings.xml
diff --git a/biometric/res/values-it/strings.xml b/biometric/src/main/res/values-it/strings.xml
similarity index 100%
rename from biometric/res/values-it/strings.xml
rename to biometric/src/main/res/values-it/strings.xml
diff --git a/biometric/res/values-iw/strings.xml b/biometric/src/main/res/values-iw/strings.xml
similarity index 100%
rename from biometric/res/values-iw/strings.xml
rename to biometric/src/main/res/values-iw/strings.xml
diff --git a/biometric/res/values-ja/strings.xml b/biometric/src/main/res/values-ja/strings.xml
similarity index 100%
rename from biometric/res/values-ja/strings.xml
rename to biometric/src/main/res/values-ja/strings.xml
diff --git a/biometric/res/values-ka/strings.xml b/biometric/src/main/res/values-ka/strings.xml
similarity index 100%
rename from biometric/res/values-ka/strings.xml
rename to biometric/src/main/res/values-ka/strings.xml
diff --git a/biometric/res/values-kk/strings.xml b/biometric/src/main/res/values-kk/strings.xml
similarity index 100%
rename from biometric/res/values-kk/strings.xml
rename to biometric/src/main/res/values-kk/strings.xml
diff --git a/biometric/res/values-km/strings.xml b/biometric/src/main/res/values-km/strings.xml
similarity index 100%
rename from biometric/res/values-km/strings.xml
rename to biometric/src/main/res/values-km/strings.xml
diff --git a/biometric/res/values-kn/strings.xml b/biometric/src/main/res/values-kn/strings.xml
similarity index 100%
rename from biometric/res/values-kn/strings.xml
rename to biometric/src/main/res/values-kn/strings.xml
diff --git a/biometric/res/values-ko/strings.xml b/biometric/src/main/res/values-ko/strings.xml
similarity index 100%
rename from biometric/res/values-ko/strings.xml
rename to biometric/src/main/res/values-ko/strings.xml
diff --git a/biometric/res/values-ky/strings.xml b/biometric/src/main/res/values-ky/strings.xml
similarity index 100%
rename from biometric/res/values-ky/strings.xml
rename to biometric/src/main/res/values-ky/strings.xml
diff --git a/biometric/res/values-lo/strings.xml b/biometric/src/main/res/values-lo/strings.xml
similarity index 100%
rename from biometric/res/values-lo/strings.xml
rename to biometric/src/main/res/values-lo/strings.xml
diff --git a/biometric/res/values-lt/strings.xml b/biometric/src/main/res/values-lt/strings.xml
similarity index 100%
rename from biometric/res/values-lt/strings.xml
rename to biometric/src/main/res/values-lt/strings.xml
diff --git a/biometric/res/values-lv/strings.xml b/biometric/src/main/res/values-lv/strings.xml
similarity index 100%
rename from biometric/res/values-lv/strings.xml
rename to biometric/src/main/res/values-lv/strings.xml
diff --git a/biometric/res/values-mk/strings.xml b/biometric/src/main/res/values-mk/strings.xml
similarity index 100%
rename from biometric/res/values-mk/strings.xml
rename to biometric/src/main/res/values-mk/strings.xml
diff --git a/biometric/res/values-ml/strings.xml b/biometric/src/main/res/values-ml/strings.xml
similarity index 100%
rename from biometric/res/values-ml/strings.xml
rename to biometric/src/main/res/values-ml/strings.xml
diff --git a/biometric/res/values-mn/strings.xml b/biometric/src/main/res/values-mn/strings.xml
similarity index 100%
rename from biometric/res/values-mn/strings.xml
rename to biometric/src/main/res/values-mn/strings.xml
diff --git a/biometric/res/values-mr/strings.xml b/biometric/src/main/res/values-mr/strings.xml
similarity index 100%
rename from biometric/res/values-mr/strings.xml
rename to biometric/src/main/res/values-mr/strings.xml
diff --git a/biometric/res/values-ms/strings.xml b/biometric/src/main/res/values-ms/strings.xml
similarity index 100%
rename from biometric/res/values-ms/strings.xml
rename to biometric/src/main/res/values-ms/strings.xml
diff --git a/biometric/res/values-my/strings.xml b/biometric/src/main/res/values-my/strings.xml
similarity index 100%
rename from biometric/res/values-my/strings.xml
rename to biometric/src/main/res/values-my/strings.xml
diff --git a/biometric/res/values-nb/strings.xml b/biometric/src/main/res/values-nb/strings.xml
similarity index 100%
rename from biometric/res/values-nb/strings.xml
rename to biometric/src/main/res/values-nb/strings.xml
diff --git a/biometric/res/values-ne/strings.xml b/biometric/src/main/res/values-ne/strings.xml
similarity index 100%
rename from biometric/res/values-ne/strings.xml
rename to biometric/src/main/res/values-ne/strings.xml
diff --git a/biometric/res/values-nl/strings.xml b/biometric/src/main/res/values-nl/strings.xml
similarity index 100%
rename from biometric/res/values-nl/strings.xml
rename to biometric/src/main/res/values-nl/strings.xml
diff --git a/biometric/res/values-or/strings.xml b/biometric/src/main/res/values-or/strings.xml
similarity index 100%
rename from biometric/res/values-or/strings.xml
rename to biometric/src/main/res/values-or/strings.xml
diff --git a/biometric/res/values-pa/strings.xml b/biometric/src/main/res/values-pa/strings.xml
similarity index 100%
rename from biometric/res/values-pa/strings.xml
rename to biometric/src/main/res/values-pa/strings.xml
diff --git a/biometric/res/values-pl/strings.xml b/biometric/src/main/res/values-pl/strings.xml
similarity index 100%
rename from biometric/res/values-pl/strings.xml
rename to biometric/src/main/res/values-pl/strings.xml
diff --git a/biometric/res/values-pt-rBR/strings.xml b/biometric/src/main/res/values-pt-rBR/strings.xml
similarity index 100%
rename from biometric/res/values-pt-rBR/strings.xml
rename to biometric/src/main/res/values-pt-rBR/strings.xml
diff --git a/biometric/res/values-pt-rPT/strings.xml b/biometric/src/main/res/values-pt-rPT/strings.xml
similarity index 100%
rename from biometric/res/values-pt-rPT/strings.xml
rename to biometric/src/main/res/values-pt-rPT/strings.xml
diff --git a/biometric/res/values-pt/strings.xml b/biometric/src/main/res/values-pt/strings.xml
similarity index 100%
rename from biometric/res/values-pt/strings.xml
rename to biometric/src/main/res/values-pt/strings.xml
diff --git a/biometric/res/values-ro/strings.xml b/biometric/src/main/res/values-ro/strings.xml
similarity index 100%
rename from biometric/res/values-ro/strings.xml
rename to biometric/src/main/res/values-ro/strings.xml
diff --git a/biometric/res/values-ru/strings.xml b/biometric/src/main/res/values-ru/strings.xml
similarity index 100%
rename from biometric/res/values-ru/strings.xml
rename to biometric/src/main/res/values-ru/strings.xml
diff --git a/biometric/res/values-si/strings.xml b/biometric/src/main/res/values-si/strings.xml
similarity index 100%
rename from biometric/res/values-si/strings.xml
rename to biometric/src/main/res/values-si/strings.xml
diff --git a/biometric/res/values-sk/strings.xml b/biometric/src/main/res/values-sk/strings.xml
similarity index 100%
rename from biometric/res/values-sk/strings.xml
rename to biometric/src/main/res/values-sk/strings.xml
diff --git a/biometric/res/values-sl/strings.xml b/biometric/src/main/res/values-sl/strings.xml
similarity index 100%
rename from biometric/res/values-sl/strings.xml
rename to biometric/src/main/res/values-sl/strings.xml
diff --git a/biometric/res/values-sq/strings.xml b/biometric/src/main/res/values-sq/strings.xml
similarity index 100%
rename from biometric/res/values-sq/strings.xml
rename to biometric/src/main/res/values-sq/strings.xml
diff --git a/biometric/res/values-sr/strings.xml b/biometric/src/main/res/values-sr/strings.xml
similarity index 100%
rename from biometric/res/values-sr/strings.xml
rename to biometric/src/main/res/values-sr/strings.xml
diff --git a/biometric/res/values-sv/strings.xml b/biometric/src/main/res/values-sv/strings.xml
similarity index 100%
rename from biometric/res/values-sv/strings.xml
rename to biometric/src/main/res/values-sv/strings.xml
diff --git a/biometric/res/values-sw/strings.xml b/biometric/src/main/res/values-sw/strings.xml
similarity index 100%
rename from biometric/res/values-sw/strings.xml
rename to biometric/src/main/res/values-sw/strings.xml
diff --git a/biometric/res/values-ta/strings.xml b/biometric/src/main/res/values-ta/strings.xml
similarity index 100%
rename from biometric/res/values-ta/strings.xml
rename to biometric/src/main/res/values-ta/strings.xml
diff --git a/biometric/res/values-te/strings.xml b/biometric/src/main/res/values-te/strings.xml
similarity index 100%
rename from biometric/res/values-te/strings.xml
rename to biometric/src/main/res/values-te/strings.xml
diff --git a/biometric/res/values-th/strings.xml b/biometric/src/main/res/values-th/strings.xml
similarity index 100%
rename from biometric/res/values-th/strings.xml
rename to biometric/src/main/res/values-th/strings.xml
diff --git a/biometric/res/values-tl/strings.xml b/biometric/src/main/res/values-tl/strings.xml
similarity index 100%
rename from biometric/res/values-tl/strings.xml
rename to biometric/src/main/res/values-tl/strings.xml
diff --git a/biometric/res/values-tr/strings.xml b/biometric/src/main/res/values-tr/strings.xml
similarity index 100%
rename from biometric/res/values-tr/strings.xml
rename to biometric/src/main/res/values-tr/strings.xml
diff --git a/biometric/res/values-uk/strings.xml b/biometric/src/main/res/values-uk/strings.xml
similarity index 100%
rename from biometric/res/values-uk/strings.xml
rename to biometric/src/main/res/values-uk/strings.xml
diff --git a/biometric/res/values-ur/strings.xml b/biometric/src/main/res/values-ur/strings.xml
similarity index 100%
rename from biometric/res/values-ur/strings.xml
rename to biometric/src/main/res/values-ur/strings.xml
diff --git a/biometric/res/values-uz/strings.xml b/biometric/src/main/res/values-uz/strings.xml
similarity index 100%
rename from biometric/res/values-uz/strings.xml
rename to biometric/src/main/res/values-uz/strings.xml
diff --git a/biometric/res/values-vi/strings.xml b/biometric/src/main/res/values-vi/strings.xml
similarity index 100%
rename from biometric/res/values-vi/strings.xml
rename to biometric/src/main/res/values-vi/strings.xml
diff --git a/biometric/res/values-zh-rCN/strings.xml b/biometric/src/main/res/values-zh-rCN/strings.xml
similarity index 100%
rename from biometric/res/values-zh-rCN/strings.xml
rename to biometric/src/main/res/values-zh-rCN/strings.xml
diff --git a/biometric/res/values-zh-rHK/strings.xml b/biometric/src/main/res/values-zh-rHK/strings.xml
similarity index 100%
rename from biometric/res/values-zh-rHK/strings.xml
rename to biometric/src/main/res/values-zh-rHK/strings.xml
diff --git a/biometric/res/values-zh-rTW/strings.xml b/biometric/src/main/res/values-zh-rTW/strings.xml
similarity index 100%
rename from biometric/res/values-zh-rTW/strings.xml
rename to biometric/src/main/res/values-zh-rTW/strings.xml
diff --git a/biometric/res/values-zu/strings.xml b/biometric/src/main/res/values-zu/strings.xml
similarity index 100%
rename from biometric/res/values-zu/strings.xml
rename to biometric/src/main/res/values-zu/strings.xml
diff --git a/biometric/res/values/colors.xml b/biometric/src/main/res/values/colors.xml
similarity index 100%
rename from biometric/res/values/colors.xml
rename to biometric/src/main/res/values/colors.xml
diff --git a/biometric/res/values/devices.xml b/biometric/src/main/res/values/devices.xml
similarity index 100%
rename from biometric/res/values/devices.xml
rename to biometric/src/main/res/values/devices.xml
diff --git a/biometric/res/values/dimens.xml b/biometric/src/main/res/values/dimens.xml
similarity index 100%
rename from biometric/res/values/dimens.xml
rename to biometric/src/main/res/values/dimens.xml
diff --git a/biometric/res/values/strings.xml b/biometric/src/main/res/values/strings.xml
similarity index 100%
rename from biometric/res/values/strings.xml
rename to biometric/src/main/res/values/strings.xml
diff --git a/biometric/res/values/styles.xml b/biometric/src/main/res/values/styles.xml
similarity index 100%
rename from biometric/res/values/styles.xml
rename to biometric/src/main/res/values/styles.xml
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
index ea3728d..0d377c0 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
@@ -113,7 +113,6 @@
         "BuilderSetStyle",
         "ExecutorRegistration",
         "NotCloseable",
-        "UserHandleName",
         "UseIcu",
         "NoByteOrShort",
         "CommonArgsFirst",
@@ -122,7 +121,8 @@
 
         // We should only treat these as warnings
         "IntentBuilderName",
-        "OnNameExpected"
+        "OnNameExpected",
+        "UserHandleName"
     ).joinToString(),
     "--error",
     listOf(
diff --git a/camera/camera-camera2/api/1.0.0-alpha08.txt b/camera/camera-camera2/api/1.0.0-alpha08.txt
new file mode 100644
index 0000000..e869ab7
--- /dev/null
+++ b/camera/camera-camera2/api/1.0.0-alpha08.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig(android.content.Context);
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/current.txt b/camera/camera-camera2/api/current.txt
new file mode 100644
index 0000000..e869ab7
--- /dev/null
+++ b/camera/camera-camera2/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig(android.content.Context);
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/public_plus_experimental_1.0.0-alpha08.txt b/camera/camera-camera2/api/public_plus_experimental_1.0.0-alpha08.txt
new file mode 100644
index 0000000..1ab5e18
--- /dev/null
+++ b/camera/camera-camera2/api/public_plus_experimental_1.0.0-alpha08.txt
@@ -0,0 +1,31 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig(android.content.Context);
+  }
+
+}
+
+package androidx.camera.camera2.interop {
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static String extractCameraId(androidx.camera.core.CameraInfo);
+  }
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/public_plus_experimental_current.txt b/camera/camera-camera2/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..1ab5e18
--- /dev/null
+++ b/camera/camera-camera2/api/public_plus_experimental_current.txt
@@ -0,0 +1,31 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig(android.content.Context);
+  }
+
+}
+
+package androidx.camera.camera2.interop {
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static String extractCameraId(androidx.camera.core.CameraInfo);
+  }
+
+  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/res-1.0.0-alpha08.txt b/camera/camera-camera2/api/res-1.0.0-alpha08.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/camera/camera-camera2/api/res-1.0.0-alpha08.txt
diff --git a/camera/camera-camera2/api/restricted_1.0.0-alpha08.txt b/camera/camera-camera2/api/restricted_1.0.0-alpha08.txt
new file mode 100644
index 0000000..5cec162
--- /dev/null
+++ b/camera/camera-camera2/api/restricted_1.0.0-alpha08.txt
@@ -0,0 +1,94 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig(android.content.Context);
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) androidx.camera.camera2.impl {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CamcorderProfileHelper {
+    method public boolean hasProfile(int, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2CameraCaptureResultConverter {
+    method public static android.hardware.camera2.CaptureResult! getCaptureResult(androidx.camera.core.CameraCaptureResult!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2CameraControl implements androidx.camera.core.CameraControlInternal {
+    ctor public Camera2CameraControl(android.hardware.camera2.CameraCharacteristics, java.util.concurrent.ScheduledExecutorService, java.util.concurrent.Executor, androidx.camera.core.CameraControlInternal.ControlUpdateCallback);
+    method public void cancelAfAeTrigger(boolean, boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public int getFlashMode();
+    method public androidx.camera.camera2.impl.TorchControl getTorchControl();
+    method public androidx.camera.camera2.impl.ZoomControl getZoomControl();
+    method public void setCropRegion(android.graphics.Rect?);
+    method public void setFlashMode(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(float);
+    method @WorkerThread public void setPreviewAspectRatio(android.util.Rational?);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+    method public void submitCaptureRequests(java.util.List<androidx.camera.core.CaptureConfig!>);
+    method public void triggerAePrecapture();
+    method public void triggerAf();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2CaptureCallbacks {
+    method public static android.hardware.camera2.CameraCaptureSession.CaptureCallback createComboCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback!...);
+    method public static android.hardware.camera2.CameraCaptureSession.CaptureCallback createNoOpCallback();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2ImplConfig implements androidx.camera.core.Config {
+    ctor public Camera2ImplConfig(androidx.camera.core.Config);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.camera2.impl.CameraEventCallbacks? getCameraEventCallback(androidx.camera.camera2.impl.CameraEventCallbacks?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? getCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getCaptureRequestTemplate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.hardware.camera2.CameraDevice.StateCallback? getDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.hardware.camera2.CameraCaptureSession.CaptureCallback? getSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.hardware.camera2.CameraCaptureSession.StateCallback? getSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class Camera2ImplConfig.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.impl.Camera2ImplConfig> {
+    ctor public Camera2ImplConfig.Builder();
+    method public androidx.camera.camera2.impl.Camera2ImplConfig build();
+    method public androidx.camera.core.MutableConfig getMutableConfig();
+    method public androidx.camera.camera2.impl.Camera2ImplConfig.Builder insertAllOptions(androidx.camera.core.Config);
+    method public <ValueT> androidx.camera.camera2.impl.Camera2ImplConfig.Builder setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class Camera2ImplConfig.Extender<T> {
+    ctor public Camera2ImplConfig.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.camera2.impl.Camera2ImplConfig.Extender<T!> setCameraEventCallback(androidx.camera.camera2.impl.CameraEventCallbacks);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2LensFacingCameraIdFilter extends androidx.camera.core.LensFacingCameraIdFilter {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class CameraBurstCaptureCallback extends android.hardware.camera2.CameraCaptureSession.CaptureCallback {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class CameraEventCallback {
+    ctor public CameraEventCallback();
+    method public androidx.camera.core.CaptureConfig! onDisableSession();
+    method public androidx.camera.core.CaptureConfig! onEnableSession();
+    method public androidx.camera.core.CaptureConfig! onPresetSession();
+    method public androidx.camera.core.CaptureConfig! onRepeating();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraEventCallbacks extends androidx.camera.core.MultiValueSet<androidx.camera.camera2.impl.CameraEventCallback> {
+    ctor public CameraEventCallbacks(androidx.camera.camera2.impl.CameraEventCallback!...);
+    method public androidx.camera.core.MultiValueSet<androidx.camera.camera2.impl.CameraEventCallback!> clone();
+    method public androidx.camera.camera2.impl.CameraEventCallbacks.ComboCameraEventCallback createComboCallback();
+    method public static androidx.camera.camera2.impl.CameraEventCallbacks createEmptyCallback();
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/restricted_current.txt b/camera/camera-camera2/api/restricted_current.txt
new file mode 100644
index 0000000..5cec162
--- /dev/null
+++ b/camera/camera-camera2/api/restricted_current.txt
@@ -0,0 +1,94 @@
+// Signature format: 3.0
+package androidx.camera.camera2 {
+
+  public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig(android.content.Context);
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) androidx.camera.camera2.impl {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CamcorderProfileHelper {
+    method public boolean hasProfile(int, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2CameraCaptureResultConverter {
+    method public static android.hardware.camera2.CaptureResult! getCaptureResult(androidx.camera.core.CameraCaptureResult!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2CameraControl implements androidx.camera.core.CameraControlInternal {
+    ctor public Camera2CameraControl(android.hardware.camera2.CameraCharacteristics, java.util.concurrent.ScheduledExecutorService, java.util.concurrent.Executor, androidx.camera.core.CameraControlInternal.ControlUpdateCallback);
+    method public void cancelAfAeTrigger(boolean, boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public int getFlashMode();
+    method public androidx.camera.camera2.impl.TorchControl getTorchControl();
+    method public androidx.camera.camera2.impl.ZoomControl getZoomControl();
+    method public void setCropRegion(android.graphics.Rect?);
+    method public void setFlashMode(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(float);
+    method @WorkerThread public void setPreviewAspectRatio(android.util.Rational?);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+    method public void submitCaptureRequests(java.util.List<androidx.camera.core.CaptureConfig!>);
+    method public void triggerAePrecapture();
+    method public void triggerAf();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2CaptureCallbacks {
+    method public static android.hardware.camera2.CameraCaptureSession.CaptureCallback createComboCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback!...);
+    method public static android.hardware.camera2.CameraCaptureSession.CaptureCallback createNoOpCallback();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2ImplConfig implements androidx.camera.core.Config {
+    ctor public Camera2ImplConfig(androidx.camera.core.Config);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.camera2.impl.CameraEventCallbacks? getCameraEventCallback(androidx.camera.camera2.impl.CameraEventCallbacks?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? getCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getCaptureRequestTemplate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.hardware.camera2.CameraDevice.StateCallback? getDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.hardware.camera2.CameraCaptureSession.CaptureCallback? getSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.hardware.camera2.CameraCaptureSession.StateCallback? getSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class Camera2ImplConfig.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.impl.Camera2ImplConfig> {
+    ctor public Camera2ImplConfig.Builder();
+    method public androidx.camera.camera2.impl.Camera2ImplConfig build();
+    method public androidx.camera.core.MutableConfig getMutableConfig();
+    method public androidx.camera.camera2.impl.Camera2ImplConfig.Builder insertAllOptions(androidx.camera.core.Config);
+    method public <ValueT> androidx.camera.camera2.impl.Camera2ImplConfig.Builder setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class Camera2ImplConfig.Extender<T> {
+    ctor public Camera2ImplConfig.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.camera2.impl.Camera2ImplConfig.Extender<T!> setCameraEventCallback(androidx.camera.camera2.impl.CameraEventCallbacks);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Camera2LensFacingCameraIdFilter extends androidx.camera.core.LensFacingCameraIdFilter {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class CameraBurstCaptureCallback extends android.hardware.camera2.CameraCaptureSession.CaptureCallback {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class CameraEventCallback {
+    ctor public CameraEventCallback();
+    method public androidx.camera.core.CaptureConfig! onDisableSession();
+    method public androidx.camera.core.CaptureConfig! onEnableSession();
+    method public androidx.camera.core.CaptureConfig! onPresetSession();
+    method public androidx.camera.core.CaptureConfig! onRepeating();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraEventCallbacks extends androidx.camera.core.MultiValueSet<androidx.camera.camera2.impl.CameraEventCallback> {
+    ctor public CameraEventCallbacks(androidx.camera.camera2.impl.CameraEventCallback!...);
+    method public androidx.camera.core.MultiValueSet<androidx.camera.camera2.impl.CameraEventCallback!> clone();
+    method public androidx.camera.camera2.impl.CameraEventCallbacks.ComboCameraEventCallback createComboCallback();
+    method public static androidx.camera.camera2.impl.CameraEventCallbacks createEmptyCallback();
+  }
+
+}
+
diff --git a/camera/camera-core/api/1.0.0-alpha08.txt b/camera/camera-core/api/1.0.0-alpha08.txt
new file mode 100644
index 0000000..72a74c6
--- /dev/null
+++ b/camera/camera-core/api/1.0.0-alpha08.txt
@@ -0,0 +1,242 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getLinearZoom();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMaxZoomRatio();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMinZoomRatio();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getZoomRatio();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    ctor public CameraXConfig.Builder();
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.content.Context, androidx.camera.core.CameraSelector, float, float);
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint);
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getFlashMode();
+    method public void setFlashMode(int);
+    method public void setTargetAspectRatioCustom(android.util.Rational);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(java.io.File, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method public void takePicture(java.io.File, androidx.camera.core.ImageCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(int, String, Throwable?);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(int, String, Throwable?);
+    method public void onImageSaved(java.io.File);
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public class Preview extends androidx.camera.core.UseCase {
+    method @UiThread public androidx.camera.core.Preview.PreviewSurfaceProvider? getPreviewSurfaceProvider();
+    method @UiThread public void setPreviewSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    method @UiThread public void setPreviewSurfaceProvider(androidx.camera.core.Preview.PreviewSurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.PreviewSurfaceProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface(android.util.Size, com.google.common.util.concurrent.ListenableFuture<java.lang.Void!>);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+}
+
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
new file mode 100644
index 0000000..72a74c6
--- /dev/null
+++ b/camera/camera-core/api/current.txt
@@ -0,0 +1,242 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getLinearZoom();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMaxZoomRatio();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMinZoomRatio();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getZoomRatio();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    ctor public CameraXConfig.Builder();
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.content.Context, androidx.camera.core.CameraSelector, float, float);
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint);
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getFlashMode();
+    method public void setFlashMode(int);
+    method public void setTargetAspectRatioCustom(android.util.Rational);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(java.io.File, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method public void takePicture(java.io.File, androidx.camera.core.ImageCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(int, String, Throwable?);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(int, String, Throwable?);
+    method public void onImageSaved(java.io.File);
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public class Preview extends androidx.camera.core.UseCase {
+    method @UiThread public androidx.camera.core.Preview.PreviewSurfaceProvider? getPreviewSurfaceProvider();
+    method @UiThread public void setPreviewSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    method @UiThread public void setPreviewSurfaceProvider(androidx.camera.core.Preview.PreviewSurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.PreviewSurfaceProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface(android.util.Size, com.google.common.util.concurrent.ListenableFuture<java.lang.Void!>);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+}
+
diff --git a/camera/camera-core/api/public_plus_experimental_1.0.0-alpha08.txt b/camera/camera-core/api/public_plus_experimental_1.0.0-alpha08.txt
new file mode 100644
index 0000000..01f5953
--- /dev/null
+++ b/camera/camera-core/api/public_plus_experimental_1.0.0-alpha08.txt
@@ -0,0 +1,246 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getLinearZoom();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMaxZoomRatio();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMinZoomRatio();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getZoomRatio();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    ctor public CameraXConfig.Builder();
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.content.Context, androidx.camera.core.CameraSelector, float, float);
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint);
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getFlashMode();
+    method public void setFlashMode(int);
+    method public void setTargetAspectRatioCustom(android.util.Rational);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(java.io.File, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method public void takePicture(java.io.File, androidx.camera.core.ImageCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(int, String, Throwable?);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(int, String, Throwable?);
+    method public void onImageSaved(java.io.File);
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method @androidx.camera.core.ExperimentalGetImage public android.media.Image? getImage();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public class Preview extends androidx.camera.core.UseCase {
+    method @UiThread public androidx.camera.core.Preview.PreviewSurfaceProvider? getPreviewSurfaceProvider();
+    method @UiThread public void setPreviewSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    method @UiThread public void setPreviewSurfaceProvider(androidx.camera.core.Preview.PreviewSurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.PreviewSurfaceProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface(android.util.Size, com.google.common.util.concurrent.ListenableFuture<java.lang.Void!>);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+}
+
diff --git a/camera/camera-core/api/public_plus_experimental_current.txt b/camera/camera-core/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..01f5953
--- /dev/null
+++ b/camera/camera-core/api/public_plus_experimental_current.txt
@@ -0,0 +1,246 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getLinearZoom();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMaxZoomRatio();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMinZoomRatio();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getZoomRatio();
+    method public boolean hasFlashUnit();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  public final class CameraSelector {
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  public final class CameraXConfig {
+  }
+
+  public static final class CameraXConfig.Builder {
+    ctor public CameraXConfig.Builder();
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.content.Context, androidx.camera.core.CameraSelector, float, float);
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+  }
+
+  @experimental.Experimental @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint);
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  public class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getFlashMode();
+    method public void setFlashMode(int);
+    method public void setTargetAspectRatioCustom(android.util.Rational);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(java.io.File, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method public void takePicture(java.io.File, androidx.camera.core.ImageCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(int, String, Throwable?);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(int, String, Throwable?);
+    method public void onImageSaved(java.io.File);
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public long getTimestamp();
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method @androidx.camera.core.ExperimentalGetImage public android.media.Image? getImage();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+  }
+
+  public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  public class Preview extends androidx.camera.core.UseCase {
+    method @UiThread public androidx.camera.core.Preview.PreviewSurfaceProvider? getPreviewSurfaceProvider();
+    method @UiThread public void setPreviewSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    method @UiThread public void setPreviewSurfaceProvider(androidx.camera.core.Preview.PreviewSurfaceProvider?);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.PreviewSurfaceProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface(android.util.Size, com.google.common.util.concurrent.ListenableFuture<java.lang.Void!>);
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  public abstract class UseCase {
+  }
+
+}
+
diff --git a/camera/camera-core/api/res-1.0.0-alpha08.txt b/camera/camera-core/api/res-1.0.0-alpha08.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/camera/camera-core/api/res-1.0.0-alpha08.txt
diff --git a/camera/camera-core/api/restricted_1.0.0-alpha08.txt b/camera/camera-core/api/restricted_1.0.0-alpha08.txt
new file mode 100644
index 0000000..5c7ebeb
--- /dev/null
+++ b/camera/camera-core/api/restricted_1.0.0-alpha08.txt
@@ -0,0 +1,1460 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @IntDef({androidx.camera.core.AspectRatio.RATIO_4_3, androidx.camera.core.AspectRatio.RATIO_16_9}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AspectRatio.Ratio {
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class CameraCaptureCallback {
+    ctor public CameraCaptureCallback();
+    method public void onCaptureCancelled();
+    method public void onCaptureCompleted(androidx.camera.core.CameraCaptureResult);
+    method public void onCaptureFailed(androidx.camera.core.CameraCaptureFailure);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureCallbacks {
+    method public static androidx.camera.core.CameraCaptureCallback! createComboCallback(androidx.camera.core.CameraCaptureCallback!...);
+    method public static androidx.camera.core.CameraCaptureCallback! createNoOpCallback();
+  }
+
+  public static final class CameraCaptureCallbacks.ComboCameraCaptureCallback extends androidx.camera.core.CameraCaptureCallback {
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getCallbacks();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureFailure {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraCaptureFailure(androidx.camera.core.CameraCaptureFailure.Reason!);
+    method public androidx.camera.core.CameraCaptureFailure.Reason! getReason();
+  }
+
+  public enum CameraCaptureFailure.Reason {
+    enum_constant public static final androidx.camera.core.CameraCaptureFailure.Reason ERROR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureMetaData {
+  }
+
+  public enum CameraCaptureMetaData.AeState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState CONVERGED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState FLASH_REQUIRED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState INACTIVE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState LOCKED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState SEARCHING;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.AfMode {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode OFF;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode ON_CONTINUOUS_AUTO;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode ON_MANUAL_AUTO;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.AfState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState FOCUSED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState INACTIVE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState LOCKED_FOCUSED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState LOCKED_NOT_FOCUSED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState SCANNING;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.AwbState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState CONVERGED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState INACTIVE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState LOCKED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState METERING;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.FlashState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState FIRED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState NONE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState READY;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState UNKNOWN;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraCaptureResult {
+    method public androidx.camera.core.CameraCaptureMetaData.AeState getAeState();
+    method public androidx.camera.core.CameraCaptureMetaData.AfMode getAfMode();
+    method public androidx.camera.core.CameraCaptureMetaData.AfState getAfState();
+    method public androidx.camera.core.CameraCaptureMetaData.AwbState getAwbState();
+    method public androidx.camera.core.CameraCaptureMetaData.FlashState getFlashState();
+    method public Object! getTag();
+    method public long getTimestamp();
+  }
+
+  public static final class CameraCaptureResult.EmptyCameraCaptureResult implements androidx.camera.core.CameraCaptureResult {
+    ctor public CameraCaptureResult.EmptyCameraCaptureResult();
+    method public static androidx.camera.core.CameraCaptureResult! create();
+    method public androidx.camera.core.CameraCaptureMetaData.AeState getAeState();
+    method public androidx.camera.core.CameraCaptureMetaData.AfMode getAfMode();
+    method public androidx.camera.core.CameraCaptureMetaData.AfState getAfState();
+    method public androidx.camera.core.CameraCaptureMetaData.AwbState getAwbState();
+    method public androidx.camera.core.CameraCaptureMetaData.FlashState getFlashState();
+    method public Object! getTag();
+    method public long getTimestamp();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureResults {
+    method public static androidx.camera.core.CameraCaptureResult! retrieveCameraCaptureResult(androidx.camera.core.ImageInfo!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureSessionStateCallbacks {
+    method public static android.hardware.camera2.CameraCaptureSession.StateCallback! createComboCallback(java.util.List<android.hardware.camera2.CameraCaptureSession.StateCallback!>!);
+    method public static android.hardware.camera2.CameraCaptureSession.StateCallback! createComboCallback(android.hardware.camera2.CameraCaptureSession.StateCallback!...);
+    method public static android.hardware.camera2.CameraCaptureSession.StateCallback! createNoOpCallback();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraControl.OperationCanceledException(String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraControl.OperationCanceledException(String, Throwable);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraControlInternal extends androidx.camera.core.CameraControl {
+    method public void cancelAfAeTrigger(boolean, boolean);
+    method @androidx.camera.core.ImageCapture.FlashMode public int getFlashMode();
+    method public void setCropRegion(android.graphics.Rect?);
+    method public void setFlashMode(@androidx.camera.core.ImageCapture.FlashMode int);
+    method public void submitCaptureRequests(java.util.List<androidx.camera.core.CaptureConfig!>);
+    method public void triggerAePrecapture();
+    method public void triggerAf();
+    field public static final androidx.camera.core.CameraControlInternal! DEFAULT_EMPTY_INSTANCE;
+  }
+
+  public static interface CameraControlInternal.ControlUpdateCallback {
+    method public void onCameraControlCaptureRequests(java.util.List<androidx.camera.core.CaptureConfig!>);
+    method public void onCameraControlUpdateSessionConfig(androidx.camera.core.SessionConfig);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraDeviceConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.CameraIdFilter!>! OPTION_CAMERA_ID_FILTER;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_LENS_FACING;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface CameraDeviceConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraDeviceStateCallbacks {
+    method public static android.hardware.camera2.CameraDevice.StateCallback! createComboCallback(java.util.List<android.hardware.camera2.CameraDevice.StateCallback!>!);
+    method public static android.hardware.camera2.CameraDevice.StateCallback! createComboCallback(android.hardware.camera2.CameraDevice.StateCallback!...);
+    method public static android.hardware.camera2.CameraDevice.StateCallback! createNoOpCallback();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraDeviceSurfaceManager {
+    method public boolean checkSupported(String!, java.util.List<androidx.camera.core.SurfaceConfig!>!);
+    method public android.util.Rational? getCorrectedAspectRatio(String, @androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public android.util.Size? getMaxOutputSize(String!, int);
+    method public android.util.Size! getPreviewSize();
+    method public java.util.Map<androidx.camera.core.UseCase!,android.util.Size!>! getSuggestedResolutions(String!, java.util.List<androidx.camera.core.UseCase!>!, java.util.List<androidx.camera.core.UseCase!>!);
+    method public void init();
+    method public boolean isInitialized();
+    method public boolean requiresCorrectedAspectRatio(String);
+    method public androidx.camera.core.SurfaceConfig! transformSurfaceConfig(String!, int, android.util.Size!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraFactory {
+    method public String? cameraIdForLensFacing(@androidx.camera.core.CameraSelector.LensFacing int) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public java.util.Set<java.lang.String!> getAvailableCameraIds() throws androidx.camera.core.CameraInfoUnavailableException;
+    method public androidx.camera.core.CameraInternal getCamera(String) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public androidx.camera.core.LensFacingCameraIdFilter getLensFacingCameraIdFilter(@androidx.camera.core.CameraSelector.LensFacing int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraIdFilter {
+    method public java.util.Set<java.lang.String!> filter(java.util.Set<java.lang.String!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraIdFilterSet implements androidx.camera.core.CameraIdFilter {
+    ctor public CameraIdFilterSet();
+    method public void addCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method public java.util.Set<java.lang.String!> filter(java.util.Set<java.lang.String!>);
+    method public java.util.Set<androidx.camera.core.CameraIdFilter!> getCameraIdFilters();
+  }
+
+  public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getLinearZoom();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMaxZoomRatio();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMinZoomRatio();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getZoomRatio();
+    method public boolean hasFlashUnit();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraInfoInternal extends androidx.camera.core.CameraInfo {
+    method public String getCameraId();
+    method public Integer? getLensFacing();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraInfoUnavailableException(String!, Throwable!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraInfoUnavailableException(String!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraInternal extends androidx.camera.core.Camera androidx.camera.core.UseCase.StateChangeCallback {
+    method public void addOnlineUseCase(java.util.Collection<androidx.camera.core.UseCase!>);
+    method public void close();
+    method public androidx.camera.core.CameraControlInternal getCameraControlInternal();
+    method public androidx.camera.core.CameraInfoInternal getCameraInfoInternal();
+    method public androidx.camera.core.Observable<androidx.camera.core.CameraInternal.State!> getCameraState();
+    method public void open();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> release();
+    method public void removeOnlineUseCase(java.util.Collection<androidx.camera.core.UseCase!>);
+  }
+
+  public enum CameraInternal.State {
+    enum_constant public static final androidx.camera.core.CameraInternal.State CLOSED;
+    enum_constant public static final androidx.camera.core.CameraInternal.State CLOSING;
+    enum_constant public static final androidx.camera.core.CameraInternal.State OPEN;
+    enum_constant public static final androidx.camera.core.CameraInternal.State OPENING;
+    enum_constant public static final androidx.camera.core.CameraInternal.State PENDING_OPEN;
+    enum_constant public static final androidx.camera.core.CameraInternal.State RELEASED;
+    enum_constant public static final androidx.camera.core.CameraInternal.State RELEASING;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraOrientationUtil {
+    method public static int getRelativeImageRotation(int, int, boolean);
+    method public static int surfaceRotationToDegrees(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraRepository {
+    ctor public CameraRepository();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> deinit();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraInternal! getCamera(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void init(androidx.camera.core.CameraFactory!);
+    method public void onGroupActive(androidx.camera.core.UseCaseGroup!);
+    method public void onGroupInactive(androidx.camera.core.UseCaseGroup!);
+  }
+
+  public final class CameraSelector {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.LinkedHashSet<androidx.camera.core.CameraIdFilter!> getCameraFilterSet();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String select(java.util.Set<java.lang.String!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraSelector.Builder appendFilter(androidx.camera.core.CameraIdFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraSelector.Builder fromSelector(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+  }
+
+  @IntDef({androidx.camera.core.CameraSelector.LENS_FACING_FRONT, androidx.camera.core.CameraSelector.LENS_FACING_BACK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CameraSelector.LensFacing {
+  }
+
+  @MainThread @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraX {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static java.util.Collection<androidx.camera.core.UseCase!>? getActiveUseCases();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraFactory getCameraFactory();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraInfoInternal getCameraInfo(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static String? getCameraWithCameraSelector(androidx.camera.core.CameraSelector);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static String? getCameraWithLensFacing(@androidx.camera.core.CameraSelector.LensFacing int) throws androidx.camera.core.CameraInfoUnavailableException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static android.content.Context getContext();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public static int getDefaultLensFacing() throws androidx.camera.core.CameraInfoUnavailableException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static <C extends androidx.camera.core.UseCaseConfig<?>> C? getDefaultUseCaseConfig(Class<C!>!, Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.CameraX!> getOrCreateInstance(android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraDeviceSurfaceManager getSurfaceManager();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> initialize(android.content.Context, androidx.camera.core.CameraXConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean isBound(androidx.camera.core.UseCase);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean isInitialized();
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> shutdown();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void unbind(androidx.camera.core.UseCase!...);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void unbindAll();
+  }
+
+  public final class CameraXConfig implements androidx.camera.core.Config androidx.camera.core.TargetConfig<androidx.camera.core.CameraX> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraFactory? getCameraFactory(androidx.camera.core.CameraFactory?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraDeviceSurfaceManager? getDeviceSurfaceManager(androidx.camera.core.CameraDeviceSurfaceManager?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.CameraX!>? getTargetClass(Class<androidx.camera.core.CameraX!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.CameraX!> getTargetClass();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String? getTargetName(String?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String getTargetName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCaseConfigFactory? getUseCaseConfigRepository(androidx.camera.core.UseCaseConfigFactory?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+  }
+
+  public static final class CameraXConfig.Builder implements androidx.camera.core.TargetConfig.Builder<androidx.camera.core.CameraX,androidx.camera.core.CameraXConfig.Builder> {
+    ctor public CameraXConfig.Builder();
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setCameraFactory(androidx.camera.core.CameraFactory);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setDeviceSurfaceManager(androidx.camera.core.CameraDeviceSurfaceManager);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setTargetClass(Class<androidx.camera.core.CameraX!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setTargetName(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setUseCaseConfigFactory(androidx.camera.core.UseCaseConfigFactory);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraXThreads {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String TAG = "CameraX-";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CaptureBundle {
+    method public java.util.List<androidx.camera.core.CaptureStage!>! getCaptureStages();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CaptureConfig {
+    method public static androidx.camera.core.CaptureConfig! defaultEmptyCaptureConfig();
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!>! getCameraCaptureCallbacks();
+    method public androidx.camera.core.Config! getImplementationOptions();
+    method public java.util.List<androidx.camera.core.DeferrableSurface!>! getSurfaces();
+    method public Object! getTag();
+    method public int getTemplateType();
+    method public boolean isUseRepeatingSurface();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class CaptureConfig.Builder {
+    ctor public CaptureConfig.Builder();
+    method public void addAllCameraCaptureCallbacks(java.util.Collection<androidx.camera.core.CameraCaptureCallback!>!);
+    method public void addCameraCaptureCallback(androidx.camera.core.CameraCaptureCallback!);
+    method public void addImplementationOptions(androidx.camera.core.Config!);
+    method public void addSurface(androidx.camera.core.DeferrableSurface!);
+    method public androidx.camera.core.CaptureConfig! build();
+    method public void clearSurfaces();
+    method public static androidx.camera.core.CaptureConfig.Builder! createFrom(androidx.camera.core.UseCaseConfig<?>!);
+    method public static androidx.camera.core.CaptureConfig.Builder! from(androidx.camera.core.CaptureConfig!);
+    method public androidx.camera.core.Config! getImplementationOptions();
+    method public java.util.Set<androidx.camera.core.DeferrableSurface!> getSurfaces();
+    method public void removeSurface(androidx.camera.core.DeferrableSurface!);
+    method public void setImplementationOptions(androidx.camera.core.Config!);
+    method public void setTag(Object!);
+    method public void setTemplateType(int);
+    method public void setUseRepeatingSurface(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface CaptureConfig.OptionUnpacker {
+    method public void unpack(androidx.camera.core.UseCaseConfig<?>!, androidx.camera.core.CaptureConfig.Builder!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CaptureProcessor {
+    method public void onOutputSurface(android.view.Surface!, int);
+    method public void onResolutionUpdate(android.util.Size!);
+    method public void process(androidx.camera.core.ImageProxyBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CaptureStage {
+    method public androidx.camera.core.CaptureConfig! getCaptureConfig();
+    method public int getId();
+  }
+
+  public static final class CaptureStage.DefaultCaptureStage implements androidx.camera.core.CaptureStage {
+    method public androidx.camera.core.CaptureConfig! getCaptureConfig();
+    method public int getId();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface Config {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String!, androidx.camera.core.Config.OptionMatcher!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!>! listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT! retrieveOption(androidx.camera.core.Config.Option<ValueT!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>!, ValueT?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class Config.Option<T> {
+    method public static <T> androidx.camera.core.Config.Option<T!>! create(String!, Class<?>!);
+    method public static <T> androidx.camera.core.Config.Option<T!>! create(String!, Class<?>!, Object?);
+    method public abstract String! getId();
+    method public abstract Object? getToken();
+    method public abstract Class<T!>! getValueClass();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface Config.OptionMatcher {
+    method public boolean onOptionMatched(androidx.camera.core.Config.Option<?>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ConfigProvider<C extends androidx.camera.core.Config> {
+    method public C! getConfig(Integer?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class DeferrableSurface {
+    ctor public DeferrableSurface();
+    method public final void close();
+    method public final com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> getSurface();
+    method public void notifySurfaceAttached();
+    method public void notifySurfaceDetached();
+    method public void setOnSurfaceDetachedListener(java.util.concurrent.Executor, androidx.camera.core.DeferrableSurface.OnSurfaceDetachedListener);
+    field protected static final String TAG = "DeferrableSurface";
+  }
+
+  public static interface DeferrableSurface.OnSurfaceDetachedListener {
+    method public void onSurfaceDetached();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class DeferrableSurface.SurfaceClosedException extends java.lang.Exception {
+    ctor public DeferrableSurface.SurfaceClosedException(String, Throwable, androidx.camera.core.DeferrableSurface);
+    ctor public DeferrableSurface.SurfaceClosedException(String, androidx.camera.core.DeferrableSurface);
+    method public androidx.camera.core.DeferrableSurface getDeferrableSurface();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class DeferrableSurfaces {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.util.List<android.view.Surface!>!> surfaceListWithTimeout(java.util.Collection<androidx.camera.core.DeferrableSurface!>, boolean, long, java.util.concurrent.Executor, java.util.concurrent.ScheduledExecutorService);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class DeviceProperties {
+    ctor public DeviceProperties();
+    method public static androidx.camera.core.DeviceProperties! create();
+    method public static androidx.camera.core.DeviceProperties! create(String!, String!, int);
+    method public abstract String! manufacturer();
+    method public abstract String! model();
+    method public abstract int sdkVersion();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.content.Context, androidx.camera.core.CameraSelector, float, float);
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected android.graphics.PointF convertPoint(float, float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Exif {
+    method public void attachLocation(android.location.Location!);
+    method public void attachTimestamp();
+    method public static androidx.camera.core.Exif! createFromFile(java.io.File!) throws java.io.IOException;
+    method public static androidx.camera.core.Exif! createFromFileString(String!) throws java.io.IOException;
+    method public static androidx.camera.core.Exif! createFromInputStream(java.io.InputStream!) throws java.io.IOException;
+    method public void flipHorizontally();
+    method public void flipVertically();
+    method public String? getDescription();
+    method public int getHeight();
+    method public long getLastModifiedTimestamp();
+    method public android.location.Location? getLocation();
+    method public int getRotation();
+    method public long getTimestamp();
+    method public int getWidth();
+    method public boolean isFlippedHorizontally();
+    method public boolean isFlippedVertically();
+    method public void removeLocation();
+    method public void removeTimestamp();
+    method public void rotate(int);
+    method public void save() throws java.io.IOException;
+    method public void setDescription(String?);
+    field public static final long INVALID_TIMESTAMP = -1L; // 0xffffffffffffffffL
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ExtendableUseCaseConfigFactory implements androidx.camera.core.UseCaseConfigFactory {
+    ctor public ExtendableUseCaseConfigFactory();
+    method public <C extends androidx.camera.core.UseCaseConfig<?>> C? getConfig(Class<C!>!, Integer?);
+    method public <C extends androidx.camera.core.Config> void installDefaultProvider(Class<C!>!, androidx.camera.core.ConfigProvider<C!>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class FlashModeHelper {
+    method public static String nameOf(@androidx.camera.core.ImageCapture.FlashMode int);
+    method @androidx.camera.core.ImageCapture.FlashMode public static int valueOf(String?);
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, @androidx.camera.core.FocusMeteringAction.MeteringMode int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint);
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint, @androidx.camera.core.FocusMeteringAction.MeteringMode int);
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @IntDef(flag=true, value={androidx.camera.core.FocusMeteringAction.FLAG_AF, androidx.camera.core.FocusMeteringAction.FLAG_AE, androidx.camera.core.FocusMeteringAction.FLAG_AWB}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FocusMeteringAction.MeteringMode {
+  }
+
+  public final class FocusMeteringResult {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.FocusMeteringResult create(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.FocusMeteringResult emptyInstance();
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method public void clearAnalyzer();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.ImageAnalysis.Defaults! DEFAULT_CONFIG;
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  @IntDef({androidx.camera.core.ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST, androidx.camera.core.ImageAnalysis.STRATEGY_BLOCK_PRODUCER}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageAnalysis.BackpressureStrategy {
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.ImageAnalysis.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.ImageAnalysis.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.ImageAnalysis,androidx.camera.core.ImageAnalysisConfig,androidx.camera.core.ImageAnalysis.Builder> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.ImageAnalysis.Builder fromConfig(androidx.camera.core.ImageAnalysisConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysisConfig getUseCaseConfig();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(@androidx.camera.core.ImageAnalysis.BackpressureStrategy int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setTargetClass(Class<androidx.camera.core.ImageAnalysis!>);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class ImageAnalysis.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.ImageAnalysisConfig> {
+    ctor public ImageAnalysis.Defaults();
+    method public androidx.camera.core.ImageAnalysisConfig getConfig(Integer?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageAnalysisConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.ImageAnalysis> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method public java.util.concurrent.Executor? getBackgroundExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getBackgroundExecutor();
+    method @androidx.camera.core.ImageAnalysis.BackpressureStrategy public int getBackpressureStrategy(@androidx.camera.core.ImageAnalysis.BackpressureStrategy int);
+    method @androidx.camera.core.ImageAnalysis.BackpressureStrategy public int getBackpressureStrategy();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method public int getImageQueueDepth(int);
+    method public int getImageQueueDepth();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageAnalysis!>? getTargetClass(Class<androidx.camera.core.ImageAnalysis!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageAnalysis!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method public android.util.Size? getTargetResolution(android.util.Size?);
+    method public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_BACKGROUND_EXECUTOR;
+  }
+
+  public class ImageCapture extends androidx.camera.core.UseCase {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method @androidx.camera.core.ImageCapture.FlashMode public int getFlashMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method public void setFlashMode(@androidx.camera.core.ImageCapture.FlashMode int);
+    method public void setTargetAspectRatioCustom(android.util.Rational);
+    method public void setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(java.io.File, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method public void takePicture(java.io.File, androidx.camera.core.ImageCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.ImageCapture.Defaults! DEFAULT_CONFIG;
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.ImageCapture.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.ImageCapture.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.ImageCapture,androidx.camera.core.ImageCaptureConfig,androidx.camera.core.ImageCapture.Builder> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.ImageCapture.Builder fromConfig(androidx.camera.core.ImageCaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCaptureConfig getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setBufferFormat(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCaptureBundle(androidx.camera.core.CaptureBundle);
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(@androidx.camera.core.ImageCapture.CaptureMode int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCaptureProcessor(androidx.camera.core.CaptureProcessor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(@androidx.camera.core.ImageCapture.FlashMode int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setMaxCaptureStages(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setTargetClass(Class<androidx.camera.core.ImageCapture!>);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @IntDef({androidx.camera.core.ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY, androidx.camera.core.ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageCapture.CaptureMode {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class ImageCapture.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.ImageCaptureConfig> {
+    ctor public ImageCapture.Defaults();
+    method public androidx.camera.core.ImageCaptureConfig! getConfig(Integer?);
+  }
+
+  @IntDef({androidx.camera.core.ImageCapture.FLASH_MODE_AUTO, androidx.camera.core.ImageCapture.FLASH_MODE_ON, androidx.camera.core.ImageCapture.FLASH_MODE_OFF}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageCapture.FlashMode {
+  }
+
+  @IntDef({androidx.camera.core.ImageCapture.ERROR_UNKNOWN, androidx.camera.core.ImageCapture.ERROR_FILE_IO, androidx.camera.core.ImageCapture.ERROR_CAPTURE_FAILED, androidx.camera.core.ImageCapture.ERROR_CAMERA_CLOSED, androidx.camera.core.ImageCapture.ERROR_INVALID_CAMERA}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageCapture.ImageCaptureError {
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(@androidx.camera.core.ImageCapture.ImageCaptureError int, String, Throwable?);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(@androidx.camera.core.ImageCapture.ImageCaptureError int, String, Throwable?);
+    method public void onImageSaved(java.io.File);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageCaptureConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.ImageCapture> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getBufferFormat(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer getBufferFormat();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureBundle? getCaptureBundle(androidx.camera.core.CaptureBundle?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureBundle getCaptureBundle();
+    method @androidx.camera.core.ImageCapture.CaptureMode public int getCaptureMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor? getCaptureProcessor(androidx.camera.core.CaptureProcessor?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor getCaptureProcessor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method @androidx.camera.core.ImageCapture.FlashMode public int getFlashMode();
+    method public java.util.concurrent.Executor? getIoExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getIoExecutor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getMaxCaptureStages(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getMaxCaptureStages();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageCapture!>? getTargetClass(Class<androidx.camera.core.ImageCapture!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageCapture!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method public android.util.Size? getTargetResolution(android.util.Size?);
+    method public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public boolean hasCaptureMode();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_IO_EXECUTOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageFormatConstants {
+    field public static final int INTERNAL_DEFINED_IMAGE_FORMAT_JPEG = 33; // 0x21
+    field public static final int INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE = 34; // 0x22
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Object? getTag();
+    method public long getTimestamp();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageInfoProcessor {
+    method public androidx.camera.core.CaptureStage! getCaptureStage();
+    method public boolean process(androidx.camera.core.ImageInfo!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageOutputConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getTargetResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method public boolean hasTargetAspectRatio();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final int INVALID_ROTATION = -1; // 0xffffffff
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Size!>! OPTION_DEFAULT_RESOLUTION;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Size!>! OPTION_MAX_RESOLUTION;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>!>! OPTION_SUPPORTED_RESOLUTIONS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_TARGET_ASPECT_RATIO;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Rational!>! OPTION_TARGET_ASPECT_RATIO_CUSTOM;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Size!>! OPTION_TARGET_RESOLUTION;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_TARGET_ROTATION;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface ImageOutputConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method public B setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setTargetResolution(android.util.Size);
+    method public B setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+  }
+
+  @IntDef({android.view.Surface.ROTATION_0, android.view.Surface.ROTATION_90, android.view.Surface.ROTATION_180, android.view.Surface.ROTATION_270}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageOutputConfig.RotationValue {
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageProxyBundle {
+    method public java.util.List<java.lang.Integer!> getCaptureIds();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.ImageProxy!> getImageProxy(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageReaderProxy {
+    method public androidx.camera.core.ImageProxy? acquireLatestImage();
+    method public androidx.camera.core.ImageProxy? acquireNextImage();
+    method public void close();
+    method public int getHeight();
+    method public int getImageFormat();
+    method public int getMaxImages();
+    method public android.view.Surface! getSurface();
+    method public int getWidth();
+    method public void setOnImageAvailableListener(androidx.camera.core.ImageReaderProxy.OnImageAvailableListener, android.os.Handler?);
+    method public void setOnImageAvailableListener(androidx.camera.core.ImageReaderProxy.OnImageAvailableListener, java.util.concurrent.Executor);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface ImageReaderProxy.OnImageAvailableListener {
+    method public void onImageAvailable(androidx.camera.core.ImageReaderProxy!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageReaderProxys {
+    method public static androidx.camera.core.ImageReaderProxy createIsolatedReader(int, int, int, int);
+    method public static androidx.camera.core.ImageReaderProxy createSharedReader(androidx.camera.core.CameraDeviceSurfaceManager, String, int, int, int, int, java.util.concurrent.Executor);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImmediateSurface extends androidx.camera.core.DeferrableSurface {
+    ctor public ImmediateSurface(android.view.Surface);
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class LensFacingCameraIdFilter implements androidx.camera.core.CameraIdFilter {
+    ctor public LensFacingCameraIdFilter(@androidx.camera.core.CameraSelector.LensFacing int);
+    method public java.util.Set<java.lang.String!> filter(java.util.Set<java.lang.String!>);
+    method @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class LensFacingConverter {
+    method public static String nameOf(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @androidx.camera.core.CameraSelector.LensFacing public static int valueOf(String?);
+    method public static Integer![] values();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getSurfaceAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public float getX();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public float getY();
+  }
+
+  public abstract class MeteringPointFactory {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public MeteringPointFactory();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public MeteringPointFactory(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected abstract android.graphics.PointF convertPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class MultiValueSet<C> {
+    ctor public MultiValueSet();
+    method public void addAll(java.util.List<C!>!);
+    method public abstract androidx.camera.core.MultiValueSet<C!>! clone();
+    method public java.util.List<C!> getAllItems();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface MutableConfig extends androidx.camera.core.Config {
+    method public <ValueT> void insertOption(androidx.camera.core.Config.Option<ValueT!>!, ValueT!);
+    method public <ValueT> ValueT? removeOption(androidx.camera.core.Config.Option<ValueT!>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class MutableOptionsBundle extends androidx.camera.core.OptionsBundle implements androidx.camera.core.MutableConfig {
+    method public static androidx.camera.core.MutableOptionsBundle! create();
+    method public static androidx.camera.core.MutableOptionsBundle! from(androidx.camera.core.Config!);
+    method public <ValueT> void insertOption(androidx.camera.core.Config.Option<ValueT!>!, ValueT!);
+    method public <ValueT> ValueT? removeOption(androidx.camera.core.Config.Option<ValueT!>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface Observable<T> {
+    method public void addObserver(java.util.concurrent.Executor, androidx.camera.core.Observable.Observer<T!>);
+    method public com.google.common.util.concurrent.ListenableFuture<T!> fetchData();
+    method public void removeObserver(androidx.camera.core.Observable.Observer<T!>);
+  }
+
+  public static interface Observable.Observer<T> {
+    method public void onError(Throwable);
+    method public void onNewData(T?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class OptionsBundle implements androidx.camera.core.Config {
+    method public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method public static androidx.camera.core.OptionsBundle emptyBundle();
+    method public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method public static androidx.camera.core.OptionsBundle from(androidx.camera.core.Config);
+    method public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field protected final java.util.TreeMap<androidx.camera.core.Config.Option<?>!,java.lang.Object!>! mOptions;
+  }
+
+  public class Preview extends androidx.camera.core.UseCase {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method @UiThread public androidx.camera.core.Preview.PreviewSurfaceProvider? getPreviewSurfaceProvider();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method @UiThread public void setPreviewSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    method @UiThread public void setPreviewSurfaceProvider(androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Preview.Defaults! DEFAULT_CONFIG;
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.Preview.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.Preview.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.Preview,androidx.camera.core.PreviewConfig,androidx.camera.core.Preview.Builder> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.Preview.Builder fromConfig(androidx.camera.core.PreviewConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.PreviewConfig getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setCaptureProcessor(androidx.camera.core.CaptureProcessor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setImageInfoProcessor(androidx.camera.core.ImageInfoProcessor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setTargetClass(Class<androidx.camera.core.Preview!>);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class Preview.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.PreviewConfig> {
+    ctor public Preview.Defaults();
+    method public androidx.camera.core.PreviewConfig! getConfig(Integer?);
+  }
+
+  public static interface Preview.PreviewSurfaceProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface(android.util.Size, com.google.common.util.concurrent.ListenableFuture<java.lang.Void!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class PreviewConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.Preview> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.concurrent.Executor? getBackgroundExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getBackgroundExecutor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor? getCaptureProcessor(androidx.camera.core.CaptureProcessor?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor getCaptureProcessor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.Preview!>? getTargetClass(Class<androidx.camera.core.Preview!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.Preview!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method public android.util.Size? getTargetResolution(android.util.Size?);
+    method public android.util.Size getTargetResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_BACKGROUND_EXECUTOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class SessionConfig {
+    method public static androidx.camera.core.SessionConfig defaultEmptySessionConfig();
+    method public java.util.List<android.hardware.camera2.CameraDevice.StateCallback!> getDeviceStateCallbacks();
+    method public java.util.List<androidx.camera.core.SessionConfig.ErrorListener!> getErrorListeners();
+    method public androidx.camera.core.Config getImplementationOptions();
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getRepeatingCameraCaptureCallbacks();
+    method public androidx.camera.core.CaptureConfig getRepeatingCaptureConfig();
+    method public java.util.List<android.hardware.camera2.CameraCaptureSession.StateCallback!> getSessionStateCallbacks();
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getSingleCameraCaptureCallbacks();
+    method public java.util.List<androidx.camera.core.DeferrableSurface!> getSurfaces();
+    method public int getTemplateType();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static class SessionConfig.Builder {
+    ctor public SessionConfig.Builder();
+    method public void addAllCameraCaptureCallbacks(java.util.Collection<androidx.camera.core.CameraCaptureCallback!>);
+    method public void addAllDeviceStateCallbacks(java.util.Collection<android.hardware.camera2.CameraDevice.StateCallback!>);
+    method public void addAllRepeatingCameraCaptureCallbacks(java.util.Collection<androidx.camera.core.CameraCaptureCallback!>);
+    method public void addAllSessionStateCallbacks(java.util.List<android.hardware.camera2.CameraCaptureSession.StateCallback!>);
+    method public void addCameraCaptureCallback(androidx.camera.core.CameraCaptureCallback);
+    method public void addDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public void addErrorListener(androidx.camera.core.SessionConfig.ErrorListener);
+    method public void addImplementationOptions(androidx.camera.core.Config);
+    method public void addNonRepeatingSurface(androidx.camera.core.DeferrableSurface);
+    method public void addRepeatingCameraCaptureCallback(androidx.camera.core.CameraCaptureCallback);
+    method public void addSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+    method public void addSurface(androidx.camera.core.DeferrableSurface);
+    method public androidx.camera.core.SessionConfig build();
+    method public void clearSurfaces();
+    method public static androidx.camera.core.SessionConfig.Builder createFrom(androidx.camera.core.UseCaseConfig<?>);
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getSingleCameraCaptureCallbacks();
+    method public void removeSurface(androidx.camera.core.DeferrableSurface);
+    method public void setImplementationOptions(androidx.camera.core.Config!);
+    method public void setTag(Object!);
+    method public void setTemplateType(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface SessionConfig.ErrorListener {
+    method public void onError(androidx.camera.core.SessionConfig, androidx.camera.core.SessionConfig.SessionError);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface SessionConfig.OptionUnpacker {
+    method public void unpack(androidx.camera.core.UseCaseConfig<?>, androidx.camera.core.SessionConfig.Builder);
+  }
+
+  public enum SessionConfig.SessionError {
+    enum_constant public static final androidx.camera.core.SessionConfig.SessionError SESSION_ERROR_SURFACE_NEEDS_RESET;
+    enum_constant public static final androidx.camera.core.SessionConfig.SessionError SESSION_ERROR_UNKNOWN;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class SessionConfig.ValidatingBuilder {
+    ctor public SessionConfig.ValidatingBuilder();
+    method public void add(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.SessionConfig build();
+    method public boolean isValid();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class SingleImageProxyBundle implements androidx.camera.core.ImageProxyBundle {
+    ctor public SingleImageProxyBundle(androidx.camera.core.ImageProxy);
+    method public java.util.List<java.lang.Integer!> getCaptureIds();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.ImageProxy!> getImageProxy(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class SurfaceCombination {
+    ctor public SurfaceCombination();
+    method public boolean addSurfaceConfig(androidx.camera.core.SurfaceConfig!);
+    method public java.util.List<androidx.camera.core.SurfaceConfig!>! getSurfaceConfigList();
+    method public boolean isSupported(java.util.List<androidx.camera.core.SurfaceConfig!>!);
+    method public boolean removeSurfaceConfig(androidx.camera.core.SurfaceConfig!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class SurfaceConfig {
+    method public static androidx.camera.core.SurfaceConfig! create(androidx.camera.core.SurfaceConfig.ConfigType!, androidx.camera.core.SurfaceConfig.ConfigSize!);
+    method public abstract androidx.camera.core.SurfaceConfig.ConfigSize! getConfigSize();
+    method public abstract androidx.camera.core.SurfaceConfig.ConfigType! getConfigType();
+    method public final boolean isSupported(androidx.camera.core.SurfaceConfig!);
+  }
+
+  public enum SurfaceConfig.ConfigSize {
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize ANALYSIS;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize MAXIMUM;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize NOT_SUPPORT;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize PREVIEW;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize RECORD;
+  }
+
+  public enum SurfaceConfig.ConfigType {
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType JPEG;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType PRIV;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType RAW;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType YUV;
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected android.graphics.PointF convertPoint(float, float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class SurfaceSizeDefinition {
+    method public static androidx.camera.core.SurfaceSizeDefinition! create(android.util.Size!, android.util.Size!, android.util.Size!);
+    method public abstract android.util.Size! getAnalysisSize();
+    method public abstract android.util.Size! getPreviewSize();
+    method public abstract android.util.Size! getRecordSize();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface TargetConfig<T> {
+    method public Class<T!>? getTargetClass(Class<T!>?);
+    method public Class<T!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Class<?>!>! OPTION_TARGET_CLASS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.String!>! OPTION_TARGET_NAME;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface TargetConfig.Builder<T, B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setTargetClass(Class<T!>);
+    method public B setTargetName(String);
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @IntDef({androidx.camera.core.TorchState.OFF, androidx.camera.core.TorchState.ON}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TorchState.State {
+  }
+
+  public abstract class UseCase {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected UseCase(androidx.camera.core.UseCaseConfig<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void addStateChangeCallback(androidx.camera.core.UseCase.StateChangeCallback);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected androidx.camera.core.UseCaseConfig<?> applyDefaults(androidx.camera.core.UseCaseConfig<?>, androidx.camera.core.UseCaseConfig.Builder<?,?,?>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void attachCameraControl(String!, androidx.camera.core.CameraControlInternal!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void attachToCamera(String!, androidx.camera.core.SessionConfig!);
+    method @CallSuper @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void clear();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<java.lang.String!>! getAttachedCameraIds();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size! getAttachedSurfaceResolution(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraInternal? getBoundCamera();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected String getBoundCameraId();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected androidx.camera.core.CameraControlInternal! getCameraControl(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected androidx.camera.core.UseCaseConfig.Builder<?,?,?>? getDefaultBuilder(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getImageFormat();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String getName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig! getSessionConfig(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCaseConfig<?>! getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected boolean isCurrentlyBoundCamera(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyActive();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyInactive();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyReset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyState();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyUpdated();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void onBind(androidx.camera.core.CameraInternal);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void onCameraControlReady(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void onStateOffline(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void onStateOnline(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected abstract java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void removeStateChangeCallback(androidx.camera.core.UseCase.StateChangeCallback);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void setImageFormat(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void updateSuggestedResolution(java.util.Map<java.lang.String!,android.util.Size!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void updateUseCaseConfig(androidx.camera.core.UseCaseConfig<?>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCase.EventCallback {
+    method public void onBind(String);
+    method public void onUnbind();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCase.StateChangeCallback {
+    method public void onUseCaseActive(androidx.camera.core.UseCase);
+    method public void onUseCaseInactive(androidx.camera.core.UseCase);
+    method public void onUseCaseReset(androidx.camera.core.UseCase);
+    method public void onUseCaseUpdated(androidx.camera.core.UseCase);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class UseCaseAttachState {
+    ctor public UseCaseAttachState(String!);
+    method public androidx.camera.core.SessionConfig.ValidatingBuilder! getActiveAndOnlineBuilder();
+    method public java.util.Collection<androidx.camera.core.UseCase!>! getActiveAndOnlineUseCases();
+    method public androidx.camera.core.SessionConfig.ValidatingBuilder! getOnlineBuilder();
+    method public java.util.Collection<androidx.camera.core.UseCase!>! getOnlineUseCases();
+    method public androidx.camera.core.SessionConfig! getUseCaseSessionConfig(androidx.camera.core.UseCase!);
+    method public boolean isUseCaseOnline(androidx.camera.core.UseCase!);
+    method public void setUseCaseActive(androidx.camera.core.UseCase!);
+    method public void setUseCaseInactive(androidx.camera.core.UseCase!);
+    method public void setUseCaseOffline(androidx.camera.core.UseCase!);
+    method public void setUseCaseOnline(androidx.camera.core.UseCase!);
+    method public void updateUseCase(androidx.camera.core.UseCase!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface UseCaseConfig<T extends androidx.camera.core.UseCase> extends androidx.camera.core.TargetConfig<T> androidx.camera.core.Config androidx.camera.core.UseCaseEventConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.CaptureConfig.OptionUnpacker!>! OPTION_CAPTURE_CONFIG_UNPACKER;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.CaptureConfig!>! OPTION_DEFAULT_CAPTURE_CONFIG;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.SessionConfig!>! OPTION_DEFAULT_SESSION_CONFIG;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.SessionConfig.OptionUnpacker!>! OPTION_SESSION_CONFIG_UNPACKER;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_SURFACE_OCCUPANCY_PRIORITY;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCaseConfig.Builder<T extends androidx.camera.core.UseCase, C extends androidx.camera.core.UseCaseConfig<T>, B> extends androidx.camera.core.TargetConfig.Builder<T,B> androidx.camera.core.ExtendableBuilder<T> androidx.camera.core.UseCaseEventConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public C getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setSurfaceOccupancyPriority(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface UseCaseConfigFactory {
+    method public <C extends androidx.camera.core.UseCaseConfig<?>> C? getConfig(Class<C!>!, Integer?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface UseCaseEventConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.UseCase.EventCallback!>! OPTION_USE_CASE_EVENT_CALLBACK;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCaseEventConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class UseCaseGroup {
+    ctor public UseCaseGroup();
+    method public boolean addUseCase(androidx.camera.core.UseCase!);
+    method public void clear();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class VideoCapture extends androidx.camera.core.UseCase {
+    ctor public VideoCapture(androidx.camera.core.VideoCaptureConfig!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method public void setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public void startRecording(java.io.File, java.util.concurrent.Executor, androidx.camera.core.VideoCapture.OnVideoSavedCallback);
+    method public void startRecording(java.io.File, androidx.camera.core.VideoCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.VideoCapture.OnVideoSavedCallback);
+    method public void stopRecording();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.VideoCapture.Defaults! DEFAULT_CONFIG;
+    field public static final int ERROR_ENCODER = 1; // 0x1
+    field public static final int ERROR_MUXER = 2; // 0x2
+    field public static final int ERROR_RECORDING_IN_PROGRESS = 3; // 0x3
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class VideoCapture.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.VideoCaptureConfig> {
+    ctor public VideoCapture.Defaults();
+    method public androidx.camera.core.VideoCaptureConfig! getConfig(Integer?);
+  }
+
+  public static final class VideoCapture.Metadata {
+    ctor public VideoCapture.Metadata();
+    field public android.location.Location? location;
+  }
+
+  public static interface VideoCapture.OnVideoSavedCallback {
+    method public void onError(@androidx.camera.core.VideoCapture.VideoCaptureError int, String, Throwable?);
+    method public void onVideoSaved(java.io.File);
+  }
+
+  @IntDef({androidx.camera.core.VideoCapture.ERROR_UNKNOWN, androidx.camera.core.VideoCapture.ERROR_ENCODER, androidx.camera.core.VideoCapture.ERROR_MUXER, androidx.camera.core.VideoCapture.ERROR_RECORDING_IN_PROGRESS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface VideoCapture.VideoCaptureError {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class VideoCaptureConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.VideoCapture> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioBitRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioBitRate();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioChannelCount(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioChannelCount();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioMinBufferSize(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioMinBufferSize();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioRecordSource(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioRecordSource();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioSampleRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioSampleRate();
+    method public java.util.concurrent.Executor? getBackgroundExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getBackgroundExecutor();
+    method public int getBitRate(int);
+    method public int getBitRate();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method public int getIFrameInterval(int);
+    method public int getIFrameInterval();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.VideoCapture!>? getTargetClass(Class<androidx.camera.core.VideoCapture!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.VideoCapture!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getTargetResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public int getVideoFrameRate(int);
+    method public int getVideoFrameRate();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_BACKGROUND_EXECUTOR;
+  }
+
+  public static final class VideoCaptureConfig.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.VideoCaptureConfig.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.VideoCaptureConfig.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.VideoCapture,androidx.camera.core.VideoCaptureConfig,androidx.camera.core.VideoCaptureConfig.Builder> {
+    ctor public VideoCaptureConfig.Builder();
+    method public androidx.camera.core.VideoCapture build();
+    method public static androidx.camera.core.VideoCaptureConfig.Builder fromConfig(androidx.camera.core.VideoCaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method public androidx.camera.core.VideoCaptureConfig getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioBitRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioChannelCount(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioMinBufferSize(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioRecordSource(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioSampleRate(int);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setBitRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setIFrameInterval(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setTargetClass(Class<androidx.camera.core.VideoCapture!>);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setTargetName(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setVideoFrameRate(int);
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class LiveDataObservable<T> implements androidx.camera.core.Observable<T> {
+    ctor public LiveDataObservable();
+    method public void addObserver(java.util.concurrent.Executor, androidx.camera.core.Observable.Observer<T!>);
+    method public com.google.common.util.concurrent.ListenableFuture<T!> fetchData();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.impl.LiveDataObservable.Result<T!>!> getLiveData();
+    method public void postError(Throwable);
+    method public void postValue(T?);
+    method public void removeObserver(androidx.camera.core.Observable.Observer<T!>);
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl.annotation {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface ExecutedBy {
+    method public abstract String value();
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl.utils {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraSelectorUtil {
+    method public static androidx.camera.core.CameraDeviceConfig toCameraDeviceConfig(androidx.camera.core.CameraSelector);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class MainThreadAsyncHandler {
+    method public static android.os.Handler! getInstance();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Threads {
+    method public static void checkBackgroundThread();
+    method public static void checkMainThread();
+    method public static boolean isBackgroundThread();
+    method public static boolean isMainThread();
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl.utils.futures {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.FunctionalInterface public interface AsyncFunction<I, O> {
+    method public com.google.common.util.concurrent.ListenableFuture<O!>! apply(I?) throws java.lang.Exception;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface FutureCallback<V> {
+    method public void onFailure(Throwable!);
+    method public void onSuccess(V?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class FutureChain<V> implements com.google.common.util.concurrent.ListenableFuture<V> {
+    method public final void addCallback(androidx.camera.core.impl.utils.futures.FutureCallback<? super V>, java.util.concurrent.Executor);
+    method public void addListener(Runnable, java.util.concurrent.Executor);
+    method public boolean cancel(boolean);
+    method public static <V> androidx.camera.core.impl.utils.futures.FutureChain<V!> from(com.google.common.util.concurrent.ListenableFuture<V!>);
+    method public V? get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public V? get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method public boolean isCancelled();
+    method public boolean isDone();
+    method public final <T> androidx.camera.core.impl.utils.futures.FutureChain<T!> transform(androidx.arch.core.util.Function<? super V,T!>, java.util.concurrent.Executor);
+    method public final <T> androidx.camera.core.impl.utils.futures.FutureChain<T!> transformAsync(androidx.camera.core.impl.utils.futures.AsyncFunction<? super V,T!>, java.util.concurrent.Executor);
+  }
+
+}
+
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
new file mode 100644
index 0000000..5c7ebeb
--- /dev/null
+++ b/camera/camera-core/api/restricted_current.txt
@@ -0,0 +1,1460 @@
+// Signature format: 3.0
+package androidx.camera.core {
+
+  public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @IntDef({androidx.camera.core.AspectRatio.RATIO_4_3, androidx.camera.core.AspectRatio.RATIO_16_9}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AspectRatio.Ratio {
+  }
+
+  public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class CameraCaptureCallback {
+    ctor public CameraCaptureCallback();
+    method public void onCaptureCancelled();
+    method public void onCaptureCompleted(androidx.camera.core.CameraCaptureResult);
+    method public void onCaptureFailed(androidx.camera.core.CameraCaptureFailure);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureCallbacks {
+    method public static androidx.camera.core.CameraCaptureCallback! createComboCallback(androidx.camera.core.CameraCaptureCallback!...);
+    method public static androidx.camera.core.CameraCaptureCallback! createNoOpCallback();
+  }
+
+  public static final class CameraCaptureCallbacks.ComboCameraCaptureCallback extends androidx.camera.core.CameraCaptureCallback {
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getCallbacks();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureFailure {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraCaptureFailure(androidx.camera.core.CameraCaptureFailure.Reason!);
+    method public androidx.camera.core.CameraCaptureFailure.Reason! getReason();
+  }
+
+  public enum CameraCaptureFailure.Reason {
+    enum_constant public static final androidx.camera.core.CameraCaptureFailure.Reason ERROR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureMetaData {
+  }
+
+  public enum CameraCaptureMetaData.AeState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState CONVERGED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState FLASH_REQUIRED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState INACTIVE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState LOCKED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState SEARCHING;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AeState UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.AfMode {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode OFF;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode ON_CONTINUOUS_AUTO;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode ON_MANUAL_AUTO;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfMode UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.AfState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState FOCUSED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState INACTIVE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState LOCKED_FOCUSED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState LOCKED_NOT_FOCUSED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState SCANNING;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AfState UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.AwbState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState CONVERGED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState INACTIVE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState LOCKED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState METERING;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.AwbState UNKNOWN;
+  }
+
+  public enum CameraCaptureMetaData.FlashState {
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState FIRED;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState NONE;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState READY;
+    enum_constant public static final androidx.camera.core.CameraCaptureMetaData.FlashState UNKNOWN;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraCaptureResult {
+    method public androidx.camera.core.CameraCaptureMetaData.AeState getAeState();
+    method public androidx.camera.core.CameraCaptureMetaData.AfMode getAfMode();
+    method public androidx.camera.core.CameraCaptureMetaData.AfState getAfState();
+    method public androidx.camera.core.CameraCaptureMetaData.AwbState getAwbState();
+    method public androidx.camera.core.CameraCaptureMetaData.FlashState getFlashState();
+    method public Object! getTag();
+    method public long getTimestamp();
+  }
+
+  public static final class CameraCaptureResult.EmptyCameraCaptureResult implements androidx.camera.core.CameraCaptureResult {
+    ctor public CameraCaptureResult.EmptyCameraCaptureResult();
+    method public static androidx.camera.core.CameraCaptureResult! create();
+    method public androidx.camera.core.CameraCaptureMetaData.AeState getAeState();
+    method public androidx.camera.core.CameraCaptureMetaData.AfMode getAfMode();
+    method public androidx.camera.core.CameraCaptureMetaData.AfState getAfState();
+    method public androidx.camera.core.CameraCaptureMetaData.AwbState getAwbState();
+    method public androidx.camera.core.CameraCaptureMetaData.FlashState getFlashState();
+    method public Object! getTag();
+    method public long getTimestamp();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureResults {
+    method public static androidx.camera.core.CameraCaptureResult! retrieveCameraCaptureResult(androidx.camera.core.ImageInfo!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraCaptureSessionStateCallbacks {
+    method public static android.hardware.camera2.CameraCaptureSession.StateCallback! createComboCallback(java.util.List<android.hardware.camera2.CameraCaptureSession.StateCallback!>!);
+    method public static android.hardware.camera2.CameraCaptureSession.StateCallback! createComboCallback(android.hardware.camera2.CameraCaptureSession.StateCallback!...);
+    method public static android.hardware.camera2.CameraCaptureSession.StateCallback! createNoOpCallback();
+  }
+
+  public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraControl.OperationCanceledException(String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraControl.OperationCanceledException(String, Throwable);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraControlInternal extends androidx.camera.core.CameraControl {
+    method public void cancelAfAeTrigger(boolean, boolean);
+    method @androidx.camera.core.ImageCapture.FlashMode public int getFlashMode();
+    method public void setCropRegion(android.graphics.Rect?);
+    method public void setFlashMode(@androidx.camera.core.ImageCapture.FlashMode int);
+    method public void submitCaptureRequests(java.util.List<androidx.camera.core.CaptureConfig!>);
+    method public void triggerAePrecapture();
+    method public void triggerAf();
+    field public static final androidx.camera.core.CameraControlInternal! DEFAULT_EMPTY_INSTANCE;
+  }
+
+  public static interface CameraControlInternal.ControlUpdateCallback {
+    method public void onCameraControlCaptureRequests(java.util.List<androidx.camera.core.CaptureConfig!>);
+    method public void onCameraControlUpdateSessionConfig(androidx.camera.core.SessionConfig);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraDeviceConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.CameraIdFilter!>! OPTION_CAMERA_ID_FILTER;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_LENS_FACING;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface CameraDeviceConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraDeviceStateCallbacks {
+    method public static android.hardware.camera2.CameraDevice.StateCallback! createComboCallback(java.util.List<android.hardware.camera2.CameraDevice.StateCallback!>!);
+    method public static android.hardware.camera2.CameraDevice.StateCallback! createComboCallback(android.hardware.camera2.CameraDevice.StateCallback!...);
+    method public static android.hardware.camera2.CameraDevice.StateCallback! createNoOpCallback();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraDeviceSurfaceManager {
+    method public boolean checkSupported(String!, java.util.List<androidx.camera.core.SurfaceConfig!>!);
+    method public android.util.Rational? getCorrectedAspectRatio(String, @androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public android.util.Size? getMaxOutputSize(String!, int);
+    method public android.util.Size! getPreviewSize();
+    method public java.util.Map<androidx.camera.core.UseCase!,android.util.Size!>! getSuggestedResolutions(String!, java.util.List<androidx.camera.core.UseCase!>!, java.util.List<androidx.camera.core.UseCase!>!);
+    method public void init();
+    method public boolean isInitialized();
+    method public boolean requiresCorrectedAspectRatio(String);
+    method public androidx.camera.core.SurfaceConfig! transformSurfaceConfig(String!, int, android.util.Size!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraFactory {
+    method public String? cameraIdForLensFacing(@androidx.camera.core.CameraSelector.LensFacing int) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public java.util.Set<java.lang.String!> getAvailableCameraIds() throws androidx.camera.core.CameraInfoUnavailableException;
+    method public androidx.camera.core.CameraInternal getCamera(String) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public androidx.camera.core.LensFacingCameraIdFilter getLensFacingCameraIdFilter(@androidx.camera.core.CameraSelector.LensFacing int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraIdFilter {
+    method public java.util.Set<java.lang.String!> filter(java.util.Set<java.lang.String!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraIdFilterSet implements androidx.camera.core.CameraIdFilter {
+    ctor public CameraIdFilterSet();
+    method public void addCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method public java.util.Set<java.lang.String!> filter(java.util.Set<java.lang.String!>);
+    method public java.util.Set<androidx.camera.core.CameraIdFilter!> getCameraIdFilters();
+  }
+
+  public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getLinearZoom();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMaxZoomRatio();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getMinZoomRatio();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<java.lang.Float!> getZoomRatio();
+    method public boolean hasFlashUnit();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraInfoInternal extends androidx.camera.core.CameraInfo {
+    method public String getCameraId();
+    method public Integer? getLensFacing();
+  }
+
+  public final class CameraInfoUnavailableException extends java.lang.Exception {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraInfoUnavailableException(String!, Throwable!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public CameraInfoUnavailableException(String!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CameraInternal extends androidx.camera.core.Camera androidx.camera.core.UseCase.StateChangeCallback {
+    method public void addOnlineUseCase(java.util.Collection<androidx.camera.core.UseCase!>);
+    method public void close();
+    method public androidx.camera.core.CameraControlInternal getCameraControlInternal();
+    method public androidx.camera.core.CameraInfoInternal getCameraInfoInternal();
+    method public androidx.camera.core.Observable<androidx.camera.core.CameraInternal.State!> getCameraState();
+    method public void open();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> release();
+    method public void removeOnlineUseCase(java.util.Collection<androidx.camera.core.UseCase!>);
+  }
+
+  public enum CameraInternal.State {
+    enum_constant public static final androidx.camera.core.CameraInternal.State CLOSED;
+    enum_constant public static final androidx.camera.core.CameraInternal.State CLOSING;
+    enum_constant public static final androidx.camera.core.CameraInternal.State OPEN;
+    enum_constant public static final androidx.camera.core.CameraInternal.State OPENING;
+    enum_constant public static final androidx.camera.core.CameraInternal.State PENDING_OPEN;
+    enum_constant public static final androidx.camera.core.CameraInternal.State RELEASED;
+    enum_constant public static final androidx.camera.core.CameraInternal.State RELEASING;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraOrientationUtil {
+    method public static int getRelativeImageRotation(int, int, boolean);
+    method public static int surfaceRotationToDegrees(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraRepository {
+    ctor public CameraRepository();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> deinit();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraInternal! getCamera(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void init(androidx.camera.core.CameraFactory!);
+    method public void onGroupActive(androidx.camera.core.UseCaseGroup!);
+    method public void onGroupInactive(androidx.camera.core.UseCaseGroup!);
+  }
+
+  public final class CameraSelector {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.LinkedHashSet<androidx.camera.core.CameraIdFilter!> getCameraFilterSet();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String select(java.util.Set<java.lang.String!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraSelector.Builder appendFilter(androidx.camera.core.CameraIdFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraSelector.Builder fromSelector(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+  }
+
+  @IntDef({androidx.camera.core.CameraSelector.LENS_FACING_FRONT, androidx.camera.core.CameraSelector.LENS_FACING_BACK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CameraSelector.LensFacing {
+  }
+
+  @MainThread @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraX {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static java.util.Collection<androidx.camera.core.UseCase!>? getActiveUseCases();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraFactory getCameraFactory();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraInfoInternal getCameraInfo(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static String? getCameraWithCameraSelector(androidx.camera.core.CameraSelector);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static String? getCameraWithLensFacing(@androidx.camera.core.CameraSelector.LensFacing int) throws androidx.camera.core.CameraInfoUnavailableException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static android.content.Context getContext();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public static int getDefaultLensFacing() throws androidx.camera.core.CameraInfoUnavailableException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static <C extends androidx.camera.core.UseCaseConfig<?>> C? getDefaultUseCaseConfig(Class<C!>!, Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.CameraX!> getOrCreateInstance(android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.CameraDeviceSurfaceManager getSurfaceManager();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> initialize(android.content.Context, androidx.camera.core.CameraXConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean isBound(androidx.camera.core.UseCase);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean isInitialized();
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> shutdown();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void unbind(androidx.camera.core.UseCase!...);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static void unbindAll();
+  }
+
+  public final class CameraXConfig implements androidx.camera.core.Config androidx.camera.core.TargetConfig<androidx.camera.core.CameraX> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraFactory? getCameraFactory(androidx.camera.core.CameraFactory?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraDeviceSurfaceManager? getDeviceSurfaceManager(androidx.camera.core.CameraDeviceSurfaceManager?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.CameraX!>? getTargetClass(Class<androidx.camera.core.CameraX!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.CameraX!> getTargetClass();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String? getTargetName(String?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String getTargetName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCaseConfigFactory? getUseCaseConfigRepository(androidx.camera.core.UseCaseConfigFactory?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+  }
+
+  public static final class CameraXConfig.Builder implements androidx.camera.core.TargetConfig.Builder<androidx.camera.core.CameraX,androidx.camera.core.CameraXConfig.Builder> {
+    ctor public CameraXConfig.Builder();
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setCameraFactory(androidx.camera.core.CameraFactory);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setDeviceSurfaceManager(androidx.camera.core.CameraDeviceSurfaceManager);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setTargetClass(Class<androidx.camera.core.CameraX!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setTargetName(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraXConfig.Builder setUseCaseConfigFactory(androidx.camera.core.UseCaseConfigFactory);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraXThreads {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String TAG = "CameraX-";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CaptureBundle {
+    method public java.util.List<androidx.camera.core.CaptureStage!>! getCaptureStages();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CaptureConfig {
+    method public static androidx.camera.core.CaptureConfig! defaultEmptyCaptureConfig();
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!>! getCameraCaptureCallbacks();
+    method public androidx.camera.core.Config! getImplementationOptions();
+    method public java.util.List<androidx.camera.core.DeferrableSurface!>! getSurfaces();
+    method public Object! getTag();
+    method public int getTemplateType();
+    method public boolean isUseRepeatingSurface();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class CaptureConfig.Builder {
+    ctor public CaptureConfig.Builder();
+    method public void addAllCameraCaptureCallbacks(java.util.Collection<androidx.camera.core.CameraCaptureCallback!>!);
+    method public void addCameraCaptureCallback(androidx.camera.core.CameraCaptureCallback!);
+    method public void addImplementationOptions(androidx.camera.core.Config!);
+    method public void addSurface(androidx.camera.core.DeferrableSurface!);
+    method public androidx.camera.core.CaptureConfig! build();
+    method public void clearSurfaces();
+    method public static androidx.camera.core.CaptureConfig.Builder! createFrom(androidx.camera.core.UseCaseConfig<?>!);
+    method public static androidx.camera.core.CaptureConfig.Builder! from(androidx.camera.core.CaptureConfig!);
+    method public androidx.camera.core.Config! getImplementationOptions();
+    method public java.util.Set<androidx.camera.core.DeferrableSurface!> getSurfaces();
+    method public void removeSurface(androidx.camera.core.DeferrableSurface!);
+    method public void setImplementationOptions(androidx.camera.core.Config!);
+    method public void setTag(Object!);
+    method public void setTemplateType(int);
+    method public void setUseRepeatingSurface(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface CaptureConfig.OptionUnpacker {
+    method public void unpack(androidx.camera.core.UseCaseConfig<?>!, androidx.camera.core.CaptureConfig.Builder!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CaptureProcessor {
+    method public void onOutputSurface(android.view.Surface!, int);
+    method public void onResolutionUpdate(android.util.Size!);
+    method public void process(androidx.camera.core.ImageProxyBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface CaptureStage {
+    method public androidx.camera.core.CaptureConfig! getCaptureConfig();
+    method public int getId();
+  }
+
+  public static final class CaptureStage.DefaultCaptureStage implements androidx.camera.core.CaptureStage {
+    method public androidx.camera.core.CaptureConfig! getCaptureConfig();
+    method public int getId();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface Config {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String!, androidx.camera.core.Config.OptionMatcher!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!>! listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT! retrieveOption(androidx.camera.core.Config.Option<ValueT!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>!, ValueT?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class Config.Option<T> {
+    method public static <T> androidx.camera.core.Config.Option<T!>! create(String!, Class<?>!);
+    method public static <T> androidx.camera.core.Config.Option<T!>! create(String!, Class<?>!, Object?);
+    method public abstract String! getId();
+    method public abstract Object? getToken();
+    method public abstract Class<T!>! getValueClass();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface Config.OptionMatcher {
+    method public boolean onOptionMatched(androidx.camera.core.Config.Option<?>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ConfigProvider<C extends androidx.camera.core.Config> {
+    method public C! getConfig(Integer?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class DeferrableSurface {
+    ctor public DeferrableSurface();
+    method public final void close();
+    method public final com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> getSurface();
+    method public void notifySurfaceAttached();
+    method public void notifySurfaceDetached();
+    method public void setOnSurfaceDetachedListener(java.util.concurrent.Executor, androidx.camera.core.DeferrableSurface.OnSurfaceDetachedListener);
+    field protected static final String TAG = "DeferrableSurface";
+  }
+
+  public static interface DeferrableSurface.OnSurfaceDetachedListener {
+    method public void onSurfaceDetached();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class DeferrableSurface.SurfaceClosedException extends java.lang.Exception {
+    ctor public DeferrableSurface.SurfaceClosedException(String, Throwable, androidx.camera.core.DeferrableSurface);
+    ctor public DeferrableSurface.SurfaceClosedException(String, androidx.camera.core.DeferrableSurface);
+    method public androidx.camera.core.DeferrableSurface getDeferrableSurface();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class DeferrableSurfaces {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.util.List<android.view.Surface!>!> surfaceListWithTimeout(java.util.Collection<androidx.camera.core.DeferrableSurface!>, boolean, long, java.util.concurrent.Executor, java.util.concurrent.ScheduledExecutorService);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class DeviceProperties {
+    ctor public DeviceProperties();
+    method public static androidx.camera.core.DeviceProperties! create();
+    method public static androidx.camera.core.DeviceProperties! create(String!, String!, int);
+    method public abstract String! manufacturer();
+    method public abstract String! model();
+    method public abstract int sdkVersion();
+  }
+
+  public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.content.Context, androidx.camera.core.CameraSelector, float, float);
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraSelector, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected android.graphics.PointF convertPoint(float, float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Exif {
+    method public void attachLocation(android.location.Location!);
+    method public void attachTimestamp();
+    method public static androidx.camera.core.Exif! createFromFile(java.io.File!) throws java.io.IOException;
+    method public static androidx.camera.core.Exif! createFromFileString(String!) throws java.io.IOException;
+    method public static androidx.camera.core.Exif! createFromInputStream(java.io.InputStream!) throws java.io.IOException;
+    method public void flipHorizontally();
+    method public void flipVertically();
+    method public String? getDescription();
+    method public int getHeight();
+    method public long getLastModifiedTimestamp();
+    method public android.location.Location? getLocation();
+    method public int getRotation();
+    method public long getTimestamp();
+    method public int getWidth();
+    method public boolean isFlippedHorizontally();
+    method public boolean isFlippedVertically();
+    method public void removeLocation();
+    method public void removeTimestamp();
+    method public void rotate(int);
+    method public void save() throws java.io.IOException;
+    method public void setDescription(String?);
+    field public static final long INVALID_TIMESTAMP = -1L; // 0xffffffffffffffffL
+  }
+
+  public interface ExtendableBuilder<T> {
+    method public T build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ExtendableUseCaseConfigFactory implements androidx.camera.core.UseCaseConfigFactory {
+    ctor public ExtendableUseCaseConfigFactory();
+    method public <C extends androidx.camera.core.UseCaseConfig<?>> C? getConfig(Class<C!>!, Integer?);
+    method public <C extends androidx.camera.core.Config> void installDefaultProvider(Class<C!>!, androidx.camera.core.ConfigProvider<C!>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class FlashModeHelper {
+    method public static String nameOf(@androidx.camera.core.ImageCapture.FlashMode int);
+    method @androidx.camera.core.ImageCapture.FlashMode public static int valueOf(String?);
+  }
+
+  public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, @androidx.camera.core.FocusMeteringAction.MeteringMode int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint);
+    method public static androidx.camera.core.FocusMeteringAction.Builder from(androidx.camera.core.MeteringPoint, @androidx.camera.core.FocusMeteringAction.MeteringMode int);
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @IntDef(flag=true, value={androidx.camera.core.FocusMeteringAction.FLAG_AF, androidx.camera.core.FocusMeteringAction.FLAG_AE, androidx.camera.core.FocusMeteringAction.FLAG_AWB}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FocusMeteringAction.MeteringMode {
+  }
+
+  public final class FocusMeteringResult {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.FocusMeteringResult create(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.FocusMeteringResult emptyInstance();
+    method public boolean isFocusSuccessful();
+  }
+
+  public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method public void clearAnalyzer();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.ImageAnalysis.Defaults! DEFAULT_CONFIG;
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  @IntDef({androidx.camera.core.ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST, androidx.camera.core.ImageAnalysis.STRATEGY_BLOCK_PRODUCER}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageAnalysis.BackpressureStrategy {
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.ImageAnalysis.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.ImageAnalysis.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.ImageAnalysis,androidx.camera.core.ImageAnalysisConfig,androidx.camera.core.ImageAnalysis.Builder> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.ImageAnalysis.Builder fromConfig(androidx.camera.core.ImageAnalysisConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysisConfig getUseCaseConfig();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(@androidx.camera.core.ImageAnalysis.BackpressureStrategy int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setTargetClass(Class<androidx.camera.core.ImageAnalysis!>);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageAnalysis.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class ImageAnalysis.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.ImageAnalysisConfig> {
+    ctor public ImageAnalysis.Defaults();
+    method public androidx.camera.core.ImageAnalysisConfig getConfig(Integer?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageAnalysisConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.ImageAnalysis> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method public java.util.concurrent.Executor? getBackgroundExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getBackgroundExecutor();
+    method @androidx.camera.core.ImageAnalysis.BackpressureStrategy public int getBackpressureStrategy(@androidx.camera.core.ImageAnalysis.BackpressureStrategy int);
+    method @androidx.camera.core.ImageAnalysis.BackpressureStrategy public int getBackpressureStrategy();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method public int getImageQueueDepth(int);
+    method public int getImageQueueDepth();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageAnalysis!>? getTargetClass(Class<androidx.camera.core.ImageAnalysis!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageAnalysis!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method public android.util.Size? getTargetResolution(android.util.Size?);
+    method public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_BACKGROUND_EXECUTOR;
+  }
+
+  public class ImageCapture extends androidx.camera.core.UseCase {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method @androidx.camera.core.ImageCapture.FlashMode public int getFlashMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method public void setFlashMode(@androidx.camera.core.ImageCapture.FlashMode int);
+    method public void setTargetAspectRatioCustom(android.util.Rational);
+    method public void setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(java.io.File, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method public void takePicture(java.io.File, androidx.camera.core.ImageCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.ImageCapture.Defaults! DEFAULT_CONFIG;
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.ImageCapture.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.ImageCapture.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.ImageCapture,androidx.camera.core.ImageCaptureConfig,androidx.camera.core.ImageCapture.Builder> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.ImageCapture.Builder fromConfig(androidx.camera.core.ImageCaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCaptureConfig getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setBufferFormat(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCaptureBundle(androidx.camera.core.CaptureBundle);
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(@androidx.camera.core.ImageCapture.CaptureMode int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setCaptureProcessor(androidx.camera.core.CaptureProcessor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(@androidx.camera.core.ImageCapture.FlashMode int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setMaxCaptureStages(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setTargetClass(Class<androidx.camera.core.ImageCapture!>);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.ImageCapture.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @IntDef({androidx.camera.core.ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY, androidx.camera.core.ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageCapture.CaptureMode {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class ImageCapture.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.ImageCaptureConfig> {
+    ctor public ImageCapture.Defaults();
+    method public androidx.camera.core.ImageCaptureConfig! getConfig(Integer?);
+  }
+
+  @IntDef({androidx.camera.core.ImageCapture.FLASH_MODE_AUTO, androidx.camera.core.ImageCapture.FLASH_MODE_ON, androidx.camera.core.ImageCapture.FLASH_MODE_OFF}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageCapture.FlashMode {
+  }
+
+  @IntDef({androidx.camera.core.ImageCapture.ERROR_UNKNOWN, androidx.camera.core.ImageCapture.ERROR_FILE_IO, androidx.camera.core.ImageCapture.ERROR_CAPTURE_FAILED, androidx.camera.core.ImageCapture.ERROR_CAMERA_CLOSED, androidx.camera.core.ImageCapture.ERROR_INVALID_CAMERA}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageCapture.ImageCaptureError {
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(@androidx.camera.core.ImageCapture.ImageCaptureError int, String, Throwable?);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(@androidx.camera.core.ImageCapture.ImageCaptureError int, String, Throwable?);
+    method public void onImageSaved(java.io.File);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageCaptureConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.ImageCapture> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getBufferFormat(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer getBufferFormat();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureBundle? getCaptureBundle(androidx.camera.core.CaptureBundle?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureBundle getCaptureBundle();
+    method @androidx.camera.core.ImageCapture.CaptureMode public int getCaptureMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor? getCaptureProcessor(androidx.camera.core.CaptureProcessor?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor getCaptureProcessor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method @androidx.camera.core.ImageCapture.FlashMode public int getFlashMode();
+    method public java.util.concurrent.Executor? getIoExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getIoExecutor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getMaxCaptureStages(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getMaxCaptureStages();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageCapture!>? getTargetClass(Class<androidx.camera.core.ImageCapture!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.ImageCapture!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method public android.util.Size? getTargetResolution(android.util.Size?);
+    method public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public boolean hasCaptureMode();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_IO_EXECUTOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageFormatConstants {
+    field public static final int INTERNAL_DEFINED_IMAGE_FORMAT_JPEG = 33; // 0x21
+    field public static final int INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE = 34; // 0x22
+  }
+
+  public interface ImageInfo {
+    method public int getRotationDegrees();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Object? getTag();
+    method public long getTimestamp();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageInfoProcessor {
+    method public androidx.camera.core.CaptureStage! getCaptureStage();
+    method public boolean process(androidx.camera.core.ImageInfo!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageOutputConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getTargetResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method public boolean hasTargetAspectRatio();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final int INVALID_ROTATION = -1; // 0xffffffff
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Size!>! OPTION_DEFAULT_RESOLUTION;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Size!>! OPTION_MAX_RESOLUTION;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>!>! OPTION_SUPPORTED_RESOLUTIONS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_TARGET_ASPECT_RATIO;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Rational!>! OPTION_TARGET_ASPECT_RATIO_CUSTOM;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<android.util.Size!>! OPTION_TARGET_RESOLUTION;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_TARGET_ROTATION;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface ImageOutputConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method public B setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setTargetResolution(android.util.Size);
+    method public B setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+  }
+
+  @IntDef({android.view.Surface.ROTATION_0, android.view.Surface.ROTATION_90, android.view.Surface.ROTATION_180, android.view.Surface.ROTATION_270}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ImageOutputConfig.RotationValue {
+  }
+
+  public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageProxyBundle {
+    method public java.util.List<java.lang.Integer!> getCaptureIds();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.ImageProxy!> getImageProxy(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface ImageReaderProxy {
+    method public androidx.camera.core.ImageProxy? acquireLatestImage();
+    method public androidx.camera.core.ImageProxy? acquireNextImage();
+    method public void close();
+    method public int getHeight();
+    method public int getImageFormat();
+    method public int getMaxImages();
+    method public android.view.Surface! getSurface();
+    method public int getWidth();
+    method public void setOnImageAvailableListener(androidx.camera.core.ImageReaderProxy.OnImageAvailableListener, android.os.Handler?);
+    method public void setOnImageAvailableListener(androidx.camera.core.ImageReaderProxy.OnImageAvailableListener, java.util.concurrent.Executor);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface ImageReaderProxy.OnImageAvailableListener {
+    method public void onImageAvailable(androidx.camera.core.ImageReaderProxy!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImageReaderProxys {
+    method public static androidx.camera.core.ImageReaderProxy createIsolatedReader(int, int, int, int);
+    method public static androidx.camera.core.ImageReaderProxy createSharedReader(androidx.camera.core.CameraDeviceSurfaceManager, String, int, int, int, int, java.util.concurrent.Executor);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ImmediateSurface extends androidx.camera.core.DeferrableSurface {
+    ctor public ImmediateSurface(android.view.Surface);
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class LensFacingCameraIdFilter implements androidx.camera.core.CameraIdFilter {
+    ctor public LensFacingCameraIdFilter(@androidx.camera.core.CameraSelector.LensFacing int);
+    method public java.util.Set<java.lang.String!> filter(java.util.Set<java.lang.String!>);
+    method @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class LensFacingConverter {
+    method public static String nameOf(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @androidx.camera.core.CameraSelector.LensFacing public static int valueOf(String?);
+    method public static Integer![] values();
+  }
+
+  public class MeteringPoint {
+    method public float getSize();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getSurfaceAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public float getX();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public float getY();
+  }
+
+  public abstract class MeteringPointFactory {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public MeteringPointFactory();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public MeteringPointFactory(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected abstract android.graphics.PointF convertPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class MultiValueSet<C> {
+    ctor public MultiValueSet();
+    method public void addAll(java.util.List<C!>!);
+    method public abstract androidx.camera.core.MultiValueSet<C!>! clone();
+    method public java.util.List<C!> getAllItems();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface MutableConfig extends androidx.camera.core.Config {
+    method public <ValueT> void insertOption(androidx.camera.core.Config.Option<ValueT!>!, ValueT!);
+    method public <ValueT> ValueT? removeOption(androidx.camera.core.Config.Option<ValueT!>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class MutableOptionsBundle extends androidx.camera.core.OptionsBundle implements androidx.camera.core.MutableConfig {
+    method public static androidx.camera.core.MutableOptionsBundle! create();
+    method public static androidx.camera.core.MutableOptionsBundle! from(androidx.camera.core.Config!);
+    method public <ValueT> void insertOption(androidx.camera.core.Config.Option<ValueT!>!, ValueT!);
+    method public <ValueT> ValueT? removeOption(androidx.camera.core.Config.Option<ValueT!>!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface Observable<T> {
+    method public void addObserver(java.util.concurrent.Executor, androidx.camera.core.Observable.Observer<T!>);
+    method public com.google.common.util.concurrent.ListenableFuture<T!> fetchData();
+    method public void removeObserver(androidx.camera.core.Observable.Observer<T!>);
+  }
+
+  public static interface Observable.Observer<T> {
+    method public void onError(Throwable);
+    method public void onNewData(T?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class OptionsBundle implements androidx.camera.core.Config {
+    method public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method public static androidx.camera.core.OptionsBundle emptyBundle();
+    method public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method public static androidx.camera.core.OptionsBundle from(androidx.camera.core.Config);
+    method public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field protected final java.util.TreeMap<androidx.camera.core.Config.Option<?>!,java.lang.Object!>! mOptions;
+  }
+
+  public class Preview extends androidx.camera.core.UseCase {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method @UiThread public androidx.camera.core.Preview.PreviewSurfaceProvider? getPreviewSurfaceProvider();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method @UiThread public void setPreviewSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    method @UiThread public void setPreviewSurfaceProvider(androidx.camera.core.Preview.PreviewSurfaceProvider?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Preview.Defaults! DEFAULT_CONFIG;
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.Preview.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.Preview.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.Preview,androidx.camera.core.PreviewConfig,androidx.camera.core.Preview.Builder> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.camera.core.Preview.Builder fromConfig(androidx.camera.core.PreviewConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.PreviewConfig getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setCaptureProcessor(androidx.camera.core.CaptureProcessor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setImageInfoProcessor(androidx.camera.core.ImageInfoProcessor);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setTargetClass(Class<androidx.camera.core.Preview!>);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.Preview.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class Preview.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.PreviewConfig> {
+    ctor public Preview.Defaults();
+    method public androidx.camera.core.PreviewConfig! getConfig(Integer?);
+  }
+
+  public static interface Preview.PreviewSurfaceProvider {
+    method public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> provideSurface(android.util.Size, com.google.common.util.concurrent.ListenableFuture<java.lang.Void!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class PreviewConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.Preview> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.concurrent.Executor? getBackgroundExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getBackgroundExecutor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor? getCaptureProcessor(androidx.camera.core.CaptureProcessor?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureProcessor getCaptureProcessor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.Preview!>? getTargetClass(Class<androidx.camera.core.Preview!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.Preview!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method public android.util.Size? getTargetResolution(android.util.Size?);
+    method public android.util.Size getTargetResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_BACKGROUND_EXECUTOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class SessionConfig {
+    method public static androidx.camera.core.SessionConfig defaultEmptySessionConfig();
+    method public java.util.List<android.hardware.camera2.CameraDevice.StateCallback!> getDeviceStateCallbacks();
+    method public java.util.List<androidx.camera.core.SessionConfig.ErrorListener!> getErrorListeners();
+    method public androidx.camera.core.Config getImplementationOptions();
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getRepeatingCameraCaptureCallbacks();
+    method public androidx.camera.core.CaptureConfig getRepeatingCaptureConfig();
+    method public java.util.List<android.hardware.camera2.CameraCaptureSession.StateCallback!> getSessionStateCallbacks();
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getSingleCameraCaptureCallbacks();
+    method public java.util.List<androidx.camera.core.DeferrableSurface!> getSurfaces();
+    method public int getTemplateType();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static class SessionConfig.Builder {
+    ctor public SessionConfig.Builder();
+    method public void addAllCameraCaptureCallbacks(java.util.Collection<androidx.camera.core.CameraCaptureCallback!>);
+    method public void addAllDeviceStateCallbacks(java.util.Collection<android.hardware.camera2.CameraDevice.StateCallback!>);
+    method public void addAllRepeatingCameraCaptureCallbacks(java.util.Collection<androidx.camera.core.CameraCaptureCallback!>);
+    method public void addAllSessionStateCallbacks(java.util.List<android.hardware.camera2.CameraCaptureSession.StateCallback!>);
+    method public void addCameraCaptureCallback(androidx.camera.core.CameraCaptureCallback);
+    method public void addDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public void addErrorListener(androidx.camera.core.SessionConfig.ErrorListener);
+    method public void addImplementationOptions(androidx.camera.core.Config);
+    method public void addNonRepeatingSurface(androidx.camera.core.DeferrableSurface);
+    method public void addRepeatingCameraCaptureCallback(androidx.camera.core.CameraCaptureCallback);
+    method public void addSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+    method public void addSurface(androidx.camera.core.DeferrableSurface);
+    method public androidx.camera.core.SessionConfig build();
+    method public void clearSurfaces();
+    method public static androidx.camera.core.SessionConfig.Builder createFrom(androidx.camera.core.UseCaseConfig<?>);
+    method public java.util.List<androidx.camera.core.CameraCaptureCallback!> getSingleCameraCaptureCallbacks();
+    method public void removeSurface(androidx.camera.core.DeferrableSurface);
+    method public void setImplementationOptions(androidx.camera.core.Config!);
+    method public void setTag(Object!);
+    method public void setTemplateType(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface SessionConfig.ErrorListener {
+    method public void onError(androidx.camera.core.SessionConfig, androidx.camera.core.SessionConfig.SessionError);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface SessionConfig.OptionUnpacker {
+    method public void unpack(androidx.camera.core.UseCaseConfig<?>, androidx.camera.core.SessionConfig.Builder);
+  }
+
+  public enum SessionConfig.SessionError {
+    enum_constant public static final androidx.camera.core.SessionConfig.SessionError SESSION_ERROR_SURFACE_NEEDS_RESET;
+    enum_constant public static final androidx.camera.core.SessionConfig.SessionError SESSION_ERROR_UNKNOWN;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class SessionConfig.ValidatingBuilder {
+    ctor public SessionConfig.ValidatingBuilder();
+    method public void add(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.SessionConfig build();
+    method public boolean isValid();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class SingleImageProxyBundle implements androidx.camera.core.ImageProxyBundle {
+    ctor public SingleImageProxyBundle(androidx.camera.core.ImageProxy);
+    method public java.util.List<java.lang.Integer!> getCaptureIds();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.ImageProxy!> getImageProxy(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class SurfaceCombination {
+    ctor public SurfaceCombination();
+    method public boolean addSurfaceConfig(androidx.camera.core.SurfaceConfig!);
+    method public java.util.List<androidx.camera.core.SurfaceConfig!>! getSurfaceConfigList();
+    method public boolean isSupported(java.util.List<androidx.camera.core.SurfaceConfig!>!);
+    method public boolean removeSurfaceConfig(androidx.camera.core.SurfaceConfig!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class SurfaceConfig {
+    method public static androidx.camera.core.SurfaceConfig! create(androidx.camera.core.SurfaceConfig.ConfigType!, androidx.camera.core.SurfaceConfig.ConfigSize!);
+    method public abstract androidx.camera.core.SurfaceConfig.ConfigSize! getConfigSize();
+    method public abstract androidx.camera.core.SurfaceConfig.ConfigType! getConfigType();
+    method public final boolean isSupported(androidx.camera.core.SurfaceConfig!);
+  }
+
+  public enum SurfaceConfig.ConfigSize {
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize ANALYSIS;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize MAXIMUM;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize NOT_SUPPORT;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize PREVIEW;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigSize RECORD;
+  }
+
+  public enum SurfaceConfig.ConfigType {
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType JPEG;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType PRIV;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType RAW;
+    enum_constant public static final androidx.camera.core.SurfaceConfig.ConfigType YUV;
+  }
+
+  public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected android.graphics.PointF convertPoint(float, float);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class SurfaceSizeDefinition {
+    method public static androidx.camera.core.SurfaceSizeDefinition! create(android.util.Size!, android.util.Size!, android.util.Size!);
+    method public abstract android.util.Size! getAnalysisSize();
+    method public abstract android.util.Size! getPreviewSize();
+    method public abstract android.util.Size! getRecordSize();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface TargetConfig<T> {
+    method public Class<T!>? getTargetClass(Class<T!>?);
+    method public Class<T!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Class<?>!>! OPTION_TARGET_CLASS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.String!>! OPTION_TARGET_NAME;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface TargetConfig.Builder<T, B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setTargetClass(Class<T!>);
+    method public B setTargetName(String);
+  }
+
+  public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @IntDef({androidx.camera.core.TorchState.OFF, androidx.camera.core.TorchState.ON}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TorchState.State {
+  }
+
+  public abstract class UseCase {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected UseCase(androidx.camera.core.UseCaseConfig<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void addStateChangeCallback(androidx.camera.core.UseCase.StateChangeCallback);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected androidx.camera.core.UseCaseConfig<?> applyDefaults(androidx.camera.core.UseCaseConfig<?>, androidx.camera.core.UseCaseConfig.Builder<?,?,?>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void attachCameraControl(String!, androidx.camera.core.CameraControlInternal!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void attachToCamera(String!, androidx.camera.core.SessionConfig!);
+    method @CallSuper @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void clear();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<java.lang.String!>! getAttachedCameraIds();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size! getAttachedSurfaceResolution(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraInternal? getBoundCamera();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected String getBoundCameraId();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected androidx.camera.core.CameraControlInternal! getCameraControl(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected androidx.camera.core.UseCaseConfig.Builder<?,?,?>? getDefaultBuilder(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getImageFormat();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String getName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig! getSessionConfig(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCaseConfig<?>! getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected boolean isCurrentlyBoundCamera(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyActive();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyInactive();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyReset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyState();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void notifyUpdated();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void onBind(androidx.camera.core.CameraInternal);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void onCameraControlReady(String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void onStateOffline(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void onStateOnline(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected abstract java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void removeStateChangeCallback(androidx.camera.core.UseCase.StateChangeCallback);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected void setImageFormat(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void updateSuggestedResolution(java.util.Map<java.lang.String!,android.util.Size!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected final void updateUseCaseConfig(androidx.camera.core.UseCaseConfig<?>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCase.EventCallback {
+    method public void onBind(String);
+    method public void onUnbind();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCase.StateChangeCallback {
+    method public void onUseCaseActive(androidx.camera.core.UseCase);
+    method public void onUseCaseInactive(androidx.camera.core.UseCase);
+    method public void onUseCaseReset(androidx.camera.core.UseCase);
+    method public void onUseCaseUpdated(androidx.camera.core.UseCase);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class UseCaseAttachState {
+    ctor public UseCaseAttachState(String!);
+    method public androidx.camera.core.SessionConfig.ValidatingBuilder! getActiveAndOnlineBuilder();
+    method public java.util.Collection<androidx.camera.core.UseCase!>! getActiveAndOnlineUseCases();
+    method public androidx.camera.core.SessionConfig.ValidatingBuilder! getOnlineBuilder();
+    method public java.util.Collection<androidx.camera.core.UseCase!>! getOnlineUseCases();
+    method public androidx.camera.core.SessionConfig! getUseCaseSessionConfig(androidx.camera.core.UseCase!);
+    method public boolean isUseCaseOnline(androidx.camera.core.UseCase!);
+    method public void setUseCaseActive(androidx.camera.core.UseCase!);
+    method public void setUseCaseInactive(androidx.camera.core.UseCase!);
+    method public void setUseCaseOffline(androidx.camera.core.UseCase!);
+    method public void setUseCaseOnline(androidx.camera.core.UseCase!);
+    method public void updateUseCase(androidx.camera.core.UseCase!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface UseCaseConfig<T extends androidx.camera.core.UseCase> extends androidx.camera.core.TargetConfig<T> androidx.camera.core.Config androidx.camera.core.UseCaseEventConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.CaptureConfig.OptionUnpacker!>! OPTION_CAPTURE_CONFIG_UNPACKER;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.CaptureConfig!>! OPTION_DEFAULT_CAPTURE_CONFIG;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.SessionConfig!>! OPTION_DEFAULT_SESSION_CONFIG;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.SessionConfig.OptionUnpacker!>! OPTION_SESSION_CONFIG_UNPACKER;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.lang.Integer!>! OPTION_SURFACE_OCCUPANCY_PRIORITY;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCaseConfig.Builder<T extends androidx.camera.core.UseCase, C extends androidx.camera.core.UseCaseConfig<T>, B> extends androidx.camera.core.TargetConfig.Builder<T,B> androidx.camera.core.ExtendableBuilder<T> androidx.camera.core.UseCaseEventConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public C getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setSurfaceOccupancyPriority(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface UseCaseConfigFactory {
+    method public <C extends androidx.camera.core.UseCaseConfig<?>> C? getConfig(Class<C!>!, Integer?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface UseCaseEventConfig {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<androidx.camera.core.UseCase.EventCallback!>! OPTION_USE_CASE_EVENT_CALLBACK;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static interface UseCaseEventConfig.Builder<B> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public B setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class UseCaseGroup {
+    ctor public UseCaseGroup();
+    method public boolean addUseCase(androidx.camera.core.UseCase!);
+    method public void clear();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class VideoCapture extends androidx.camera.core.UseCase {
+    ctor public VideoCapture(androidx.camera.core.VideoCaptureConfig!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void clear();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected java.util.Map<java.lang.String!,android.util.Size!> onSuggestedResolutionUpdated(java.util.Map<java.lang.String!,android.util.Size!>);
+    method public void setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method public void startRecording(java.io.File, java.util.concurrent.Executor, androidx.camera.core.VideoCapture.OnVideoSavedCallback);
+    method public void startRecording(java.io.File, androidx.camera.core.VideoCapture.Metadata, java.util.concurrent.Executor, androidx.camera.core.VideoCapture.OnVideoSavedCallback);
+    method public void stopRecording();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.VideoCapture.Defaults! DEFAULT_CONFIG;
+    field public static final int ERROR_ENCODER = 1; // 0x1
+    field public static final int ERROR_MUXER = 2; // 0x2
+    field public static final int ERROR_RECORDING_IN_PROGRESS = 3; // 0x3
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class VideoCapture.Defaults implements androidx.camera.core.ConfigProvider<androidx.camera.core.VideoCaptureConfig> {
+    ctor public VideoCapture.Defaults();
+    method public androidx.camera.core.VideoCaptureConfig! getConfig(Integer?);
+  }
+
+  public static final class VideoCapture.Metadata {
+    ctor public VideoCapture.Metadata();
+    field public android.location.Location? location;
+  }
+
+  public static interface VideoCapture.OnVideoSavedCallback {
+    method public void onError(@androidx.camera.core.VideoCapture.VideoCaptureError int, String, Throwable?);
+    method public void onVideoSaved(java.io.File);
+  }
+
+  @IntDef({androidx.camera.core.VideoCapture.ERROR_UNKNOWN, androidx.camera.core.VideoCapture.ERROR_ENCODER, androidx.camera.core.VideoCapture.ERROR_MUXER, androidx.camera.core.VideoCapture.ERROR_RECORDING_IN_PROGRESS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface VideoCapture.VideoCaptureError {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class VideoCaptureConfig implements androidx.camera.core.CameraDeviceConfig androidx.camera.core.ImageOutputConfig androidx.camera.core.UseCaseConfig<androidx.camera.core.VideoCapture> {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean containsOption(androidx.camera.core.Config.Option<?>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void findOptions(String, androidx.camera.core.Config.OptionMatcher);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioBitRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioBitRate();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioChannelCount(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioChannelCount();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioMinBufferSize(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioMinBufferSize();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioRecordSource(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioRecordSource();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioSampleRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getAudioSampleRate();
+    method public java.util.concurrent.Executor? getBackgroundExecutor(java.util.concurrent.Executor?);
+    method public java.util.concurrent.Executor getBackgroundExecutor();
+    method public int getBitRate(int);
+    method public int getBitRate();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter? getCameraIdFilter(androidx.camera.core.CameraIdFilter?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CameraIdFilter getCameraIdFilter();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker? getCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig.OptionUnpacker getCaptureOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig? getDefaultCaptureConfig(androidx.camera.core.CaptureConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.CaptureConfig getDefaultCaptureConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getDefaultResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getDefaultResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig? getDefaultSessionConfig(androidx.camera.core.SessionConfig?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig getDefaultSessionConfig();
+    method public int getIFrameInterval(int);
+    method public int getIFrameInterval();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Integer? getLensFacing(Integer?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.camera.core.CameraSelector.LensFacing public int getLensFacing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getMaxResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getMaxResolution();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker? getSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.SessionConfig.OptionUnpacker getSessionOptionUnpacker();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>? getSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!> getSupportedResolutions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int getSurfaceOccupancyPriority();
+    method @androidx.camera.core.AspectRatio.Ratio public int getTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational? getTargetAspectRatioCustom(android.util.Rational?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Rational getTargetAspectRatioCustom();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.VideoCapture!>? getTargetClass(Class<androidx.camera.core.VideoCapture!>?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public Class<androidx.camera.core.VideoCapture!> getTargetClass();
+    method public String? getTargetName(String?);
+    method public String getTargetName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size? getTargetResolution(android.util.Size?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.util.Size getTargetResolution();
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation(int);
+    method @androidx.camera.core.ImageOutputConfig.RotationValue public int getTargetRotation();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback? getUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.UseCase.EventCallback getUseCaseEventCallback();
+    method public int getVideoFrameRate(int);
+    method public int getVideoFrameRate();
+    method public boolean hasTargetAspectRatio();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.Set<androidx.camera.core.Config.Option<?>!> listOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <ValueT> ValueT? retrieveOption(androidx.camera.core.Config.Option<ValueT!>, ValueT?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.camera.core.Config.Option<java.util.concurrent.Executor!>! OPTION_BACKGROUND_EXECUTOR;
+  }
+
+  public static final class VideoCaptureConfig.Builder implements androidx.camera.core.CameraDeviceConfig.Builder<androidx.camera.core.VideoCaptureConfig.Builder> androidx.camera.core.ImageOutputConfig.Builder<androidx.camera.core.VideoCaptureConfig.Builder> androidx.camera.core.UseCaseConfig.Builder<androidx.camera.core.VideoCapture,androidx.camera.core.VideoCaptureConfig,androidx.camera.core.VideoCaptureConfig.Builder> {
+    ctor public VideoCaptureConfig.Builder();
+    method public androidx.camera.core.VideoCapture build();
+    method public static androidx.camera.core.VideoCaptureConfig.Builder fromConfig(androidx.camera.core.VideoCaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.MutableConfig getMutableConfig();
+    method public androidx.camera.core.VideoCaptureConfig getUseCaseConfig();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioBitRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioChannelCount(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioMinBufferSize(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioRecordSource(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setAudioSampleRate(int);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setBitRate(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setCameraIdFilter(androidx.camera.core.CameraIdFilter);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setCaptureOptionUnpacker(androidx.camera.core.CaptureConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setDefaultCaptureConfig(androidx.camera.core.CaptureConfig);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setDefaultResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setDefaultSessionConfig(androidx.camera.core.SessionConfig);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setIFrameInterval(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setLensFacing(@androidx.camera.core.CameraSelector.LensFacing int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setMaxResolution(android.util.Size);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setSessionOptionUnpacker(androidx.camera.core.SessionConfig.OptionUnpacker);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setSupportedResolutions(java.util.List<android.util.Pair<java.lang.Integer!,android.util.Size![]!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setSurfaceOccupancyPriority(int);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setTargetAspectRatio(@androidx.camera.core.AspectRatio.Ratio int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setTargetAspectRatioCustom(android.util.Rational);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setTargetClass(Class<androidx.camera.core.VideoCapture!>);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setTargetName(String);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setTargetRotation(@androidx.camera.core.ImageOutputConfig.RotationValue int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.VideoCaptureConfig.Builder setUseCaseEventCallback(androidx.camera.core.UseCase.EventCallback);
+    method public androidx.camera.core.VideoCaptureConfig.Builder setVideoFrameRate(int);
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class LiveDataObservable<T> implements androidx.camera.core.Observable<T> {
+    ctor public LiveDataObservable();
+    method public void addObserver(java.util.concurrent.Executor, androidx.camera.core.Observable.Observer<T!>);
+    method public com.google.common.util.concurrent.ListenableFuture<T!> fetchData();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.impl.LiveDataObservable.Result<T!>!> getLiveData();
+    method public void postError(Throwable);
+    method public void postValue(T?);
+    method public void removeObserver(androidx.camera.core.Observable.Observer<T!>);
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl.annotation {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface ExecutedBy {
+    method public abstract String value();
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl.utils {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class CameraSelectorUtil {
+    method public static androidx.camera.core.CameraDeviceConfig toCameraDeviceConfig(androidx.camera.core.CameraSelector);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class MainThreadAsyncHandler {
+    method public static android.os.Handler! getInstance();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Threads {
+    method public static void checkBackgroundThread();
+    method public static void checkMainThread();
+    method public static boolean isBackgroundThread();
+    method public static boolean isMainThread();
+  }
+
+}
+
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.camera.core.impl.utils.futures {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.FunctionalInterface public interface AsyncFunction<I, O> {
+    method public com.google.common.util.concurrent.ListenableFuture<O!>! apply(I?) throws java.lang.Exception;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface FutureCallback<V> {
+    method public void onFailure(Throwable!);
+    method public void onSuccess(V?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class FutureChain<V> implements com.google.common.util.concurrent.ListenableFuture<V> {
+    method public final void addCallback(androidx.camera.core.impl.utils.futures.FutureCallback<? super V>, java.util.concurrent.Executor);
+    method public void addListener(Runnable, java.util.concurrent.Executor);
+    method public boolean cancel(boolean);
+    method public static <V> androidx.camera.core.impl.utils.futures.FutureChain<V!> from(com.google.common.util.concurrent.ListenableFuture<V!>);
+    method public V? get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public V? get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method public boolean isCancelled();
+    method public boolean isDone();
+    method public final <T> androidx.camera.core.impl.utils.futures.FutureChain<T!> transform(androidx.arch.core.util.Function<? super V,T!>, java.util.concurrent.Executor);
+    method public final <T> androidx.camera.core.impl.utils.futures.FutureChain<T!> transformAsync(androidx.camera.core.impl.utils.futures.AsyncFunction<? super V,T!>, java.util.concurrent.Executor);
+  }
+
+}
+
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/DeferrableSurfacesTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/DeferrableSurfacesTest.java
index e115ec2..b29231c 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/DeferrableSurfacesTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/DeferrableSurfacesTest.java
@@ -30,6 +30,7 @@
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -63,6 +64,7 @@
     }
 
     @Test
+    @MediumTest
     public void getSurfaceTimeoutTest() {
         DeferrableSurface fakeDeferrableSurface = new DeferrableSurface() {
             @Override
diff --git a/camera/camera-lifecycle/api/1.0.0-alpha02.txt b/camera/camera-lifecycle/api/1.0.0-alpha02.txt
new file mode 100644
index 0000000..a6aba27
--- /dev/null
+++ b/camera/camera-lifecycle/api/1.0.0-alpha02.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public interface LifecycleCameraProvider {
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+  public final class ProcessCameraProvider implements androidx.camera.lifecycle.LifecycleCameraProvider {
+    method public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/current.txt b/camera/camera-lifecycle/api/current.txt
new file mode 100644
index 0000000..a6aba27
--- /dev/null
+++ b/camera/camera-lifecycle/api/current.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public interface LifecycleCameraProvider {
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+  public final class ProcessCameraProvider implements androidx.camera.lifecycle.LifecycleCameraProvider {
+    method public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-alpha02.txt b/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-alpha02.txt
new file mode 100644
index 0000000..a6aba27
--- /dev/null
+++ b/camera/camera-lifecycle/api/public_plus_experimental_1.0.0-alpha02.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public interface LifecycleCameraProvider {
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+  public final class ProcessCameraProvider implements androidx.camera.lifecycle.LifecycleCameraProvider {
+    method public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_current.txt b/camera/camera-lifecycle/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..a6aba27
--- /dev/null
+++ b/camera/camera-lifecycle/api/public_plus_experimental_current.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public interface LifecycleCameraProvider {
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+  public final class ProcessCameraProvider implements androidx.camera.lifecycle.LifecycleCameraProvider {
+    method public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/res-1.0.0-alpha02.txt b/camera/camera-lifecycle/api/res-1.0.0-alpha02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/camera/camera-lifecycle/api/res-1.0.0-alpha02.txt
diff --git a/camera/camera-lifecycle/api/restricted_1.0.0-alpha02.txt b/camera/camera-lifecycle/api/restricted_1.0.0-alpha02.txt
new file mode 100644
index 0000000..a6aba27
--- /dev/null
+++ b/camera/camera-lifecycle/api/restricted_1.0.0-alpha02.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public interface LifecycleCameraProvider {
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+  public final class ProcessCameraProvider implements androidx.camera.lifecycle.LifecycleCameraProvider {
+    method public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/restricted_current.txt b/camera/camera-lifecycle/api/restricted_current.txt
new file mode 100644
index 0000000..a6aba27
--- /dev/null
+++ b/camera/camera-lifecycle/api/restricted_current.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.camera.lifecycle {
+
+  public interface LifecycleCameraProvider {
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+  public final class ProcessCameraProvider implements androidx.camera.lifecycle.LifecycleCameraProvider {
+    method public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method public void unbind(androidx.camera.core.UseCase!...);
+    method public void unbindAll();
+  }
+
+}
+
diff --git a/compose/compose-runtime/api/0.1.0-dev04.txt b/compose/compose-runtime/api/0.1.0-dev04.txt
new file mode 100644
index 0000000..786046d
--- /dev/null
+++ b/compose/compose-runtime/api/0.1.0-dev04.txt
@@ -0,0 +1,703 @@
+// Signature format: 3.0
+package androidx.compose {
+
+  public final class ActualAndroidKt {
+    ctor public ActualAndroidKt();
+    method public static android.content.Context getContext(android.view.View);
+    method public static android.view.ViewParent getParent(android.view.View);
+    method public static boolean isMainThread();
+  }
+
+  public final class ActualJvmKt {
+    ctor public ActualJvmKt();
+    method public static int identityHashCode(Object? instance);
+    method public static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public final class Ambient<T> {
+    method @androidx.compose.Composable public void Provider(T? value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    field public static final androidx.compose.Ambient.Companion! Companion;
+  }
+
+  public static final class Ambient.Companion {
+    method public <T> androidx.compose.Ambient<T> of(kotlin.jvm.functions.Function0<? extends T>? defaultFactory = null);
+  }
+
+  public final class Anchor {
+    ctor public Anchor(internal int loc);
+    method public boolean getValid();
+    method public int location(androidx.compose.SlotTable slots);
+    property public final boolean valid;
+  }
+
+  public final class Applier<N> {
+    ctor public Applier(N! root, androidx.compose.ApplyAdapter<N> adapter);
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insert(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public void remove(int index, int count);
+    method public void reset();
+    method public void up();
+    property public final N! current;
+  }
+
+  public interface ApplyAdapter<N> {
+    method public void end(N?, N? instance, N? parent);
+    method public void insertAt(N?, int index, N? instance);
+    method public void move(N?, int from, int to, int count);
+    method public void removeAt(N?, int index, int count);
+    method public void start(N?, N? instance);
+  }
+
+  public final class Choreographer {
+    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
+    method public void postFrameCallbackDelayed(long delayMillis, android.view.Choreographer.FrameCallback callback);
+    method public void removeFrameCallback(android.view.Choreographer.FrameCallback callback);
+    field public static final androidx.compose.Choreographer! INSTANCE;
+  }
+
+  @androidx.compose.EffectsDsl public interface CommitScope {
+    method public void onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+  }
+
+  public abstract class Component {
+    ctor public Component();
+    method @androidx.compose.Composable public abstract void compose();
+    method protected final void recompose();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY}) public @interface Composable {
+  }
+
+  public final class Compose {
+    method @MainThread public androidx.compose.CompositionContext? composeInto(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public androidx.compose.CompositionContext composeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public void disposeComposition(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null);
+    method @MainThread public void disposeComposition(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null);
+    method public androidx.compose.Component? findRoot(android.view.View view);
+    method @MainThread public androidx.compose.CompositionContext subcomposeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    field public static final androidx.compose.Compose! INSTANCE;
+  }
+
+  public final class ComposeAndroidKt {
+    ctor public ComposeAndroidKt();
+    method public static void disposeComposition(android.app.Activity);
+    method public static androidx.compose.CompositionContext? setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public final class ComposeKt {
+    ctor public ComposeKt();
+    method public static void disposeComposition(android.view.ViewGroup);
+    method public static androidx.compose.CompositionContext? setViewContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public class Composer<N> {
+    ctor public Composer(androidx.compose.SlotTable slotTable, androidx.compose.Applier<N> applier, androidx.compose.Recomposer recomposer);
+    method public final <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public final void applyChanges();
+    method public final androidx.compose.CompositionReference buildReference();
+    method public final <T> boolean changed(T? value);
+    method public final void collectKeySourceInformation();
+    method protected final void composeRoot(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public final <T extends N> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void doneJoin(boolean valid);
+    method public final <T extends N> void emitNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void emitNode(N? node);
+    method public final void endGroup();
+    method public final void endNode();
+    method public final androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public final void endRoot();
+    method public final int getChangeCount();
+    method public final boolean getInserting();
+    method public final androidx.compose.SlotTable getSlotTable();
+    method public final Object joinKey(Object? left, Object? right);
+    method public final Object? nextSlot();
+    method public final boolean recompose();
+    method public final void skipCurrentGroup();
+    method public final void skipValue();
+    method public final void startGroup(Object key);
+    method public final kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> startJoin(Object key, boolean valid, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> compose);
+    method public final void startNode(Object key);
+    method public final void startRestartGroup(Object key);
+    method public final void startRoot();
+    method public final void updateValue(Object? value);
+    method public final N! useNode();
+    property public final int changeCount;
+    property public final boolean inserting;
+  }
+
+  public final class ComposerKt {
+    ctor public ComposerKt();
+    method public static inline <N, T> T! cache(androidx.compose.Composer<N>, boolean valid = true, kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T> T! escapeCompose(kotlin.jvm.functions.Function1<? super androidx.compose.NullCompilationScope,? extends T> block);
+    method public static <N> Object? nextValue(androidx.compose.Composer<N>);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1> V! remember(androidx.compose.Composer<N>, P1? p1, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3, P4> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, P4? p4, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, Object![]? args, kotlin.jvm.functions.Function0<? extends V> block);
+    field public static final int DEFAULT_SLOT_ACTIONS_SIZE = 16; // 0x10
+    field public static final int DEFAULT_SLOT_KEYS_SIZE = 8; // 0x8
+  }
+
+  public final class ComposerUpdater<N, T extends N> {
+    ctor public ComposerUpdater(androidx.compose.Composer<N> composer, T! node);
+    method public androidx.compose.Composer<N> getComposer();
+    method public T! getNode();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void update(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+  }
+
+  public final class CompositionContext {
+    method public void compose();
+    method public androidx.compose.Component getComponent();
+    method public androidx.compose.Composer<?> getComposer();
+    method public boolean recomposeSync();
+    field public static final androidx.compose.CompositionContext.Companion! Companion;
+  }
+
+  public static final class CompositionContext.Companion {
+    method public androidx.compose.CompositionContext prepare(android.content.Context context, Object root, androidx.compose.Component component, androidx.compose.CompositionReference? compositionReference);
+    method public androidx.compose.CompositionContext prepare(androidx.compose.Component component, androidx.compose.CompositionReference? ambientReference, kotlin.jvm.functions.Function1<? super androidx.compose.Recomposer,? extends androidx.compose.Composer<?>> makeComposer);
+  }
+
+  public interface CompositionLifecycleObserver {
+    method public void onEnter();
+    method public void onLeave();
+  }
+
+  public interface CompositionReference {
+    method public <T> T! getAmbient(androidx.compose.Ambient<T> key);
+    method public void invalidate(boolean sync);
+    method public <T> void invalidateConsumers(androidx.compose.Ambient<T> key);
+    method public <N> void registerComposer(androidx.compose.Composer<N> composer);
+  }
+
+  @androidx.compose.EffectsDsl public final class Effect<T> {
+    method @androidx.compose.annotations.Hide public Object constructKey(int key);
+    method public androidx.compose.Composer<?> getContext();
+    method @androidx.compose.annotations.Hide public T! resolve(androidx.compose.Composer<?> composerContext, int key = sourceLocation());
+    method public void setContext(androidx.compose.Composer<?> p);
+    method public operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+    property public final androidx.compose.Composer<?> context;
+    field @androidx.compose.annotations.Hide public androidx.compose.Composer<?> context;
+  }
+
+  @kotlin.DslMarker public @interface EffectsDsl {
+  }
+
+  public final class EffectsKt {
+    ctor public EffectsKt();
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> ambient(androidx.compose.Ambient<T> key);
+    method public static androidx.compose.Effect<androidx.compose.CompositionReference> compositionReference();
+    method public static <T> androidx.compose.Effect<T> effectOf(kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method public static androidx.compose.Effect<kotlin.jvm.functions.Function0<kotlin.Unit>> getInvalidate();
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> key(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> key(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> key(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> memo(V1? v1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> memo(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> model(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> modelFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> modelFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> modelFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onActive(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> state(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method public static operator <T> T! unaryPlus(androidx.compose.Effect<T>);
+  }
+
+  public interface Emittable {
+    method public void emitInsertAt(int index, androidx.compose.Emittable instance);
+    method public void emitMove(int from, int to, int count);
+    method public void emitRemoveAt(int index, int count);
+  }
+
+  public final class ExpectKt {
+    ctor public ExpectKt();
+    method public static <T> androidx.compose.ThreadLocal<T> ThreadLocal();
+  }
+
+  public final class FrameManager {
+    method public void ensureStarted();
+    method public <T> T! framed(kotlin.jvm.functions.Function0<? extends T> block);
+    method public <T> T! isolated(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void nextFrame();
+    method public <T> T! unframed(kotlin.jvm.functions.Function0<? extends T> block);
+    field public static final androidx.compose.FrameManager! INSTANCE;
+  }
+
+  public final class Handler {
+    ctor public Handler(android.os.Looper looper);
+    method public android.os.Handler getHandler();
+    method public boolean postAtFrontOfQueue(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    property public final android.os.Handler handler;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface HiddenAttribute {
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  public final class JoinedKeyKt {
+    ctor public JoinedKeyKt();
+    method public static boolean isJoinedKey(Object? key);
+    method public static Object? joinedKeyLeft(Object? key);
+    method public static Object? joinedKeyRight(Object? key);
+  }
+
+  public final class KeyInfo {
+    ctor public KeyInfo(Object key, int location, int nodes, int index);
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLocation();
+    method public int getNodes();
+  }
+
+  public final class KeyKt {
+    ctor public KeyKt();
+    method @androidx.compose.Composable public static void Key(@androidx.compose.Pivotal Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class KeySourceInfoKt {
+    ctor public KeySourceInfoKt();
+    method public static String? keySourceInfoOf(Object key);
+  }
+
+  public final class LooperWrapper {
+    method public android.os.Looper getMainLooper();
+    field public static final androidx.compose.LooperWrapper! INSTANCE;
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Model {
+  }
+
+  public final class NullCompilationScope {
+    method public kotlin.Unit getComposer();
+    property public final kotlin.Unit composer;
+    field public static final androidx.compose.NullCompilationScope! INSTANCE;
+  }
+
+  public final class ObserveKt {
+    ctor public ObserveKt();
+    method @androidx.compose.Composable public static void Observe(kotlin.jvm.functions.Function0<kotlin.Unit> body);
+  }
+
+  public final class ObserverMap<K, V> {
+    ctor public ObserverMap();
+    method public void add(K key, V value);
+    method public void clear();
+    method public void clearValues(kotlin.jvm.functions.Function1<? super V,java.lang.Boolean> predicate);
+    method public boolean contains(K key, V value);
+    method public operator java.util.List<V> get(Iterable<? extends K> keys);
+    method public java.util.List<V> remove(K key);
+    method public void remove(K key, V value);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets={AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public @interface Pivotal {
+  }
+
+  public final class RecomposeKt {
+    ctor public RecomposeKt();
+    method @androidx.compose.Composable public static void Recompose(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> body);
+  }
+
+  public abstract class Recomposer {
+    ctor public Recomposer();
+    method protected final void dispatchRecomposes();
+    method public abstract void recomposeSync();
+    method protected abstract void scheduleChangesDispatch();
+    field public static final androidx.compose.Recomposer.Companion! Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public androidx.compose.Recomposer current();
+    method public boolean hasPendingChanges();
+  }
+
+  public final class RecomposerKt {
+    ctor public RecomposerKt();
+  }
+
+  public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public class SlotEditor {
+    method public final Object? get(androidx.compose.Anchor anchor);
+    method public final Object? get(int index);
+    method public final int getCurrent();
+    method public final int getGroupSize();
+    method public final int getNodeIndex();
+    method public final int getParentIndex();
+    method public final int getParentNodes();
+    method public final androidx.compose.SlotTable getTable();
+    method public final int groupSize(int index);
+    method public final boolean isGroup();
+    method public final boolean isGroup(int index);
+    method public final boolean isNode();
+    method public final void setCurrent(int p);
+    property public final int current;
+    property public final int groupSize;
+    property public final boolean isGroup;
+    property public final boolean isNode;
+    property public final int nodeIndex;
+    property public final int parentIndex;
+    property public final int parentNodes;
+  }
+
+  public final class SlotReader extends androidx.compose.SlotEditor {
+    method public void beginEmpty();
+    method public void close();
+    method public void endEmpty();
+    method public int endGroup();
+    method public int endNode();
+    method public java.util.List<androidx.compose.KeyInfo> extractKeys();
+    method public Object? get();
+    method public Object! getGroupKey();
+    method public boolean getInEmpty();
+    method public Object groupKey(int index);
+    method public boolean isGroupEnd();
+    method public Object? next();
+    method public void previous();
+    method public void reportUncertainNodeCount();
+    method public int skipEnclosingGroup();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    property public final Object! groupKey;
+    property public final boolean inEmpty;
+    property public final boolean isGroupEnd;
+  }
+
+  public final class SlotTable {
+    ctor public SlotTable(internal Object![] slots);
+    ctor public SlotTable();
+    method public int getSize();
+    method public androidx.compose.SlotReader openReader();
+    method public androidx.compose.SlotWriter openWriter();
+    method public <T> T! read(kotlin.jvm.functions.Function1<? super androidx.compose.SlotReader,? extends T> block);
+    method public <T> T! write(kotlin.jvm.functions.Function1<? super androidx.compose.SlotWriter,? extends T> block);
+    property public final int size;
+    field public static final androidx.compose.SlotTable.Companion! Companion;
+  }
+
+  public static final class SlotTable.Companion {
+    method public Object getEMPTY();
+    property public final Object EMPTY;
+  }
+
+  public final class SlotTableKt {
+    ctor public SlotTableKt();
+  }
+
+  public final class SlotWriter extends androidx.compose.SlotEditor {
+    method public androidx.compose.Anchor anchor(int index = current);
+    method public void beginInsert();
+    method public void close();
+    method public int endGroup();
+    method public void endInsert();
+    method public int endNode();
+    method public java.util.Iterator<java.lang.Object> groupSlots();
+    method public void moveGroup(int offset);
+    method public void previous();
+    method public boolean removeGroup();
+    method public void set(Object? value);
+    method public Object? skip();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    method public Object? update(Object? value);
+  }
+
+  public final class SourceLocationKt {
+    ctor public SourceLocationKt();
+    method public static inline int sourceLocation();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.Model public final class State<T> implements androidx.compose.frames.Framed {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public T! getValue();
+    method public operator T! getValue(Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method @androidx.compose.annotations.Hide public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public void setValue(T? value);
+    method public operator void setValue(Object? thisObj, kotlin.reflect.KProperty<?> property, T? next);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public final T! value;
+  }
+
+  public class ThreadLocal<T> extends java.lang.ThreadLocal<T> {
+    ctor public ThreadLocal(kotlin.jvm.functions.Function0<? extends T> initialValue);
+  }
+
+  public final class Trace {
+    method public void beginSection(String name);
+    method public void endSection();
+    field public static final androidx.compose.Trace! INSTANCE;
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public @interface UnionType {
+    method public abstract Class<?>[] types();
+  }
+
+  public final class ViewAdapters {
+    ctor public ViewAdapters();
+    method public Object? adapt(Object parent, Object child);
+    method public boolean register(kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+  }
+
+  public final class ViewComposer extends androidx.compose.Composer<java.lang.Object> {
+    ctor public ViewComposer(Object root, android.content.Context context, androidx.compose.Recomposer recomposer, androidx.compose.ViewAdapters? adapters);
+    method public androidx.compose.ViewAdapters? getAdapters();
+    method public android.content.Context getContext();
+    method public Object getRoot();
+  }
+
+  public final class ViewComposerCommonKt {
+    ctor public ViewComposerCommonKt();
+  }
+
+  public final class ViewComposerKt {
+    ctor public ViewComposerKt();
+    method public static androidx.compose.ViewComposition! getComposer();
+    method public static Boolean? registerAdapter(androidx.compose.ViewComposition, kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+    method public static <T> T! runWithCurrent(androidx.compose.Composer<?>, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @androidx.compose.EffectsDsl public final class ViewComposition {
+    ctor public ViewComposition(androidx.compose.ViewComposer composer);
+    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T extends android.view.View> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends android.view.ViewGroup> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public inline <T> T! expr(Object key, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.ViewComposer getComposer();
+    method public inline Object joinKey(Object left, Object? right);
+    method public void observe(Object key, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> block);
+    method public void startRestartGroup(Object key);
+    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+  }
+
+  public final class ViewValidator {
+    ctor public ViewValidator(androidx.compose.Composer<?> composer);
+    method public boolean changed(int value);
+    method public <T> boolean changed(T? value);
+    method public <T> boolean changedUnchecked(T? value);
+    method public androidx.compose.Composer<?> getComposer();
+    method public operator boolean plus(boolean, boolean other);
+    method public inline boolean set(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean set(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean setUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline boolean update(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean update(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean updateUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public boolean updated(int value);
+    method public <T> boolean updated(T? value);
+  }
+
+}
+
+package androidx.compose.adapters {
+
+  public final class ComposeViewAdapter implements androidx.compose.adapters.ViewAdapter {
+    ctor public ComposeViewAdapter();
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public inline <T extends androidx.compose.adapters.ViewAdapter> T get(int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public java.util.List<androidx.compose.adapters.ViewAdapter> getAdapters();
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public final java.util.List<androidx.compose.adapters.ViewAdapter> adapters;
+    property public int id;
+  }
+
+  public interface ViewAdapter {
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public abstract int id;
+  }
+
+  public final class ViewAdapterKt {
+    ctor public ViewAdapterKt();
+    method public static inline <T extends androidx.compose.adapters.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public static androidx.compose.adapters.ComposeViewAdapter getViewAdapter(android.view.View);
+  }
+
+}
+
+package androidx.compose.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Hide {
+  }
+
+}
+
+package androidx.compose.frames {
+
+  public abstract class AbstractRecord implements androidx.compose.frames.Record {
+    ctor public AbstractRecord();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public int frameId;
+    property public androidx.compose.frames.Record? next;
+  }
+
+  public final class Frame {
+    method public int getId();
+    method public boolean getReadonly();
+    method public boolean hasPendingChanges();
+    property public final boolean readonly;
+  }
+
+  public final class FrameAborted extends java.lang.RuntimeException {
+    ctor public FrameAborted(androidx.compose.frames.Frame frame);
+    method public androidx.compose.frames.Frame getFrame();
+  }
+
+  public final class FrameContainersKt {
+    ctor public FrameContainersKt();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T? element);
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T?... elements);
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf();
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class FrameIdSetKt {
+    ctor public FrameIdSetKt();
+  }
+
+  public interface Framed {
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    property public abstract androidx.compose.frames.Record firstFrameRecord;
+  }
+
+  public final class FramesKt {
+    ctor public FramesKt();
+    method public static kotlin.Unit? _created(androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _readable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _writable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static void abort();
+    method public static void abort(androidx.compose.frames.Frame frame);
+    method public static void abortHandler();
+    method public static void abortHandler(androidx.compose.frames.Frame frame);
+    method public static void commit();
+    method public static void commit(androidx.compose.frames.Frame frame);
+    method public static kotlin.Unit? commitHandler();
+    method public static androidx.compose.frames.Frame currentFrame();
+    method public static boolean getInFrame();
+    method public static void observeAllReads(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> readObserver, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static androidx.compose.frames.Frame open(boolean readOnly = false);
+    method public static androidx.compose.frames.Frame open(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver = null, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver = null);
+    method public static <T extends androidx.compose.frames.Record> T readable(T, androidx.compose.frames.Framed framed);
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> registerCommitObserver(kotlin.jvm.functions.Function1<? super java.util.Set<?>,kotlin.Unit> observer);
+    method public static void restore(androidx.compose.frames.Frame frame);
+    method public static androidx.compose.frames.Frame suspend();
+    method public static boolean wasModified(Object value);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed, androidx.compose.frames.Frame frame);
+  }
+
+  public final class ModelList<T> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableList java.util.List<T> {
+    ctor public ModelList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public int size;
+  }
+
+  public final class ModelMap<K, V> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> {
+    ctor public ModelMap();
+    method public void clear();
+    method public boolean containsKey(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public interface Record {
+    method public void assign(androidx.compose.frames.Record value);
+    method public androidx.compose.frames.Record create();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public abstract int frameId;
+    property public abstract androidx.compose.frames.Record? next;
+  }
+
+}
+
diff --git a/compose/compose-runtime/api/api_lint.ignore b/compose/compose-runtime/api/api_lint.ignore
new file mode 100644
index 0000000..10909e8
--- /dev/null
+++ b/compose/compose-runtime/api/api_lint.ignore
@@ -0,0 +1,83 @@
+// Baseline format: 1.0
+AcronymName: androidx.compose.SlotTable.Companion#getEMPTY():
+    Acronyms should not be capitalized in method names: was `getEMPTY`, should this be `getEmpty`?
+
+
+ArrayReturn: androidx.compose.ComposerKt#remember(androidx.compose.Composer<N>, Object[], kotlin.jvm.functions.Function0<? extends V>) parameter #1:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.EffectsKt#key(Object[], kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T>) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.EffectsKt#memo(Object[], kotlin.jvm.functions.Function0<? extends T>) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.EffectsKt#modelFor(Object[], kotlin.jvm.functions.Function0<? extends T>) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.EffectsKt#onCommit(Object[], kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit>) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.EffectsKt#onPreCommit(Object[], kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit>) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.EffectsKt#stateFor(Object[], kotlin.jvm.functions.Function0<? extends T>) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.SlotTable#SlotTable(Object[]) parameter #0:
+    Method parameter should be Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]`
+ArrayReturn: androidx.compose.UnionType#types():
+    Method should return Collection<Class> (or subclass) instead of raw array; was `java.lang.Class<?>[]`
+
+
+CallbackName: androidx.compose.CompositionLifecycleObserver:
+    Class should be named CompositionLifecycleCallback
+
+
+ContextFirst: androidx.compose.Compose#composeInto(androidx.compose.Emittable, android.content.Context, androidx.compose.CompositionReference, kotlin.jvm.functions.Function0<kotlin.Unit>) parameter #1:
+    Context is distinct, so it must be the first argument (method `composeInto`)
+ContextFirst: androidx.compose.Compose#disposeComposition(androidx.compose.Emittable, android.content.Context, androidx.compose.CompositionReference) parameter #1:
+    Context is distinct, so it must be the first argument (method `disposeComposition`)
+ContextFirst: androidx.compose.Compose#subcomposeInto(androidx.compose.Emittable, android.content.Context, androidx.compose.CompositionReference, kotlin.jvm.functions.Function0<kotlin.Unit>) parameter #1:
+    Context is distinct, so it must be the first argument (method `subcomposeInto`)
+ContextFirst: androidx.compose.ViewComposer#ViewComposer(Object, android.content.Context, androidx.compose.Recomposer, androidx.compose.ViewAdapters) parameter #1:
+    Context is distinct, so it must be the first argument (method `ViewComposer`)
+
+
+DocumentExceptions: androidx.compose.frames.FramesKt#commit(androidx.compose.frames.Frame):
+    Method FramesKt.commit appears to be throwing java.lang.IllegalStateException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions
+DocumentExceptions: androidx.compose.frames.FramesKt#currentFrame():
+    Method FramesKt.currentFrame appears to be throwing java.lang.IllegalStateException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions
+DocumentExceptions: androidx.compose.frames.FramesKt#writable(T, androidx.compose.frames.Framed, androidx.compose.frames.Frame):
+    Method FramesKt.writable appears to be throwing java.lang.IllegalStateException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions
+
+
+EqualsAndHashCode: androidx.compose.Ambient#equals(Object):
+    Must override both equals and hashCode; missing one in androidx.compose.Ambient
+
+
+ExceptionName: androidx.compose.frames.FrameAborted:
+    Exceptions must be named `FooException`, was `FrameAborted`
+
+
+KotlinOperator: androidx.compose.ComposerUpdater#set(V, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit>):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+KotlinOperator: androidx.compose.ComposerUpdater#set(int, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit>):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+KotlinOperator: androidx.compose.SlotEditor#get(androidx.compose.Anchor):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+KotlinOperator: androidx.compose.SlotEditor#get(int):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+KotlinOperator: androidx.compose.ViewValidator#set(T, kotlin.jvm.functions.Function1<? super T,kotlin.Unit>):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+KotlinOperator: androidx.compose.ViewValidator#set(int, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+KotlinOperator: androidx.compose.adapters.ComposeViewAdapter#get(int, kotlin.jvm.functions.Function0<? extends T>):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
+
+
+MissingNullability: androidx.compose.SlotReader#getGroupKey():
+    Missing nullability on method `getGroupKey` return
+MissingNullability: androidx.compose.ViewComposerKt#getComposer():
+    Missing nullability on method `getComposer` return
+
+
+MutableBareField: androidx.compose.Effect#context:
+    Bare field context must be marked final, or moved behind accessors if mutable
+
+
+RegistrationName: androidx.compose.Choreographer#removeFrameCallback(android.view.Choreographer.FrameCallback):
+    Callback methods should be named register/unregister; was removeFrameCallback
diff --git a/compose/compose-runtime/api/current.txt b/compose/compose-runtime/api/current.txt
new file mode 100644
index 0000000..786046d
--- /dev/null
+++ b/compose/compose-runtime/api/current.txt
@@ -0,0 +1,703 @@
+// Signature format: 3.0
+package androidx.compose {
+
+  public final class ActualAndroidKt {
+    ctor public ActualAndroidKt();
+    method public static android.content.Context getContext(android.view.View);
+    method public static android.view.ViewParent getParent(android.view.View);
+    method public static boolean isMainThread();
+  }
+
+  public final class ActualJvmKt {
+    ctor public ActualJvmKt();
+    method public static int identityHashCode(Object? instance);
+    method public static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public final class Ambient<T> {
+    method @androidx.compose.Composable public void Provider(T? value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    field public static final androidx.compose.Ambient.Companion! Companion;
+  }
+
+  public static final class Ambient.Companion {
+    method public <T> androidx.compose.Ambient<T> of(kotlin.jvm.functions.Function0<? extends T>? defaultFactory = null);
+  }
+
+  public final class Anchor {
+    ctor public Anchor(internal int loc);
+    method public boolean getValid();
+    method public int location(androidx.compose.SlotTable slots);
+    property public final boolean valid;
+  }
+
+  public final class Applier<N> {
+    ctor public Applier(N! root, androidx.compose.ApplyAdapter<N> adapter);
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insert(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public void remove(int index, int count);
+    method public void reset();
+    method public void up();
+    property public final N! current;
+  }
+
+  public interface ApplyAdapter<N> {
+    method public void end(N?, N? instance, N? parent);
+    method public void insertAt(N?, int index, N? instance);
+    method public void move(N?, int from, int to, int count);
+    method public void removeAt(N?, int index, int count);
+    method public void start(N?, N? instance);
+  }
+
+  public final class Choreographer {
+    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
+    method public void postFrameCallbackDelayed(long delayMillis, android.view.Choreographer.FrameCallback callback);
+    method public void removeFrameCallback(android.view.Choreographer.FrameCallback callback);
+    field public static final androidx.compose.Choreographer! INSTANCE;
+  }
+
+  @androidx.compose.EffectsDsl public interface CommitScope {
+    method public void onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+  }
+
+  public abstract class Component {
+    ctor public Component();
+    method @androidx.compose.Composable public abstract void compose();
+    method protected final void recompose();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY}) public @interface Composable {
+  }
+
+  public final class Compose {
+    method @MainThread public androidx.compose.CompositionContext? composeInto(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public androidx.compose.CompositionContext composeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public void disposeComposition(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null);
+    method @MainThread public void disposeComposition(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null);
+    method public androidx.compose.Component? findRoot(android.view.View view);
+    method @MainThread public androidx.compose.CompositionContext subcomposeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    field public static final androidx.compose.Compose! INSTANCE;
+  }
+
+  public final class ComposeAndroidKt {
+    ctor public ComposeAndroidKt();
+    method public static void disposeComposition(android.app.Activity);
+    method public static androidx.compose.CompositionContext? setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public final class ComposeKt {
+    ctor public ComposeKt();
+    method public static void disposeComposition(android.view.ViewGroup);
+    method public static androidx.compose.CompositionContext? setViewContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public class Composer<N> {
+    ctor public Composer(androidx.compose.SlotTable slotTable, androidx.compose.Applier<N> applier, androidx.compose.Recomposer recomposer);
+    method public final <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public final void applyChanges();
+    method public final androidx.compose.CompositionReference buildReference();
+    method public final <T> boolean changed(T? value);
+    method public final void collectKeySourceInformation();
+    method protected final void composeRoot(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public final <T extends N> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void doneJoin(boolean valid);
+    method public final <T extends N> void emitNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void emitNode(N? node);
+    method public final void endGroup();
+    method public final void endNode();
+    method public final androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public final void endRoot();
+    method public final int getChangeCount();
+    method public final boolean getInserting();
+    method public final androidx.compose.SlotTable getSlotTable();
+    method public final Object joinKey(Object? left, Object? right);
+    method public final Object? nextSlot();
+    method public final boolean recompose();
+    method public final void skipCurrentGroup();
+    method public final void skipValue();
+    method public final void startGroup(Object key);
+    method public final kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> startJoin(Object key, boolean valid, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> compose);
+    method public final void startNode(Object key);
+    method public final void startRestartGroup(Object key);
+    method public final void startRoot();
+    method public final void updateValue(Object? value);
+    method public final N! useNode();
+    property public final int changeCount;
+    property public final boolean inserting;
+  }
+
+  public final class ComposerKt {
+    ctor public ComposerKt();
+    method public static inline <N, T> T! cache(androidx.compose.Composer<N>, boolean valid = true, kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T> T! escapeCompose(kotlin.jvm.functions.Function1<? super androidx.compose.NullCompilationScope,? extends T> block);
+    method public static <N> Object? nextValue(androidx.compose.Composer<N>);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1> V! remember(androidx.compose.Composer<N>, P1? p1, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3, P4> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, P4? p4, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, Object![]? args, kotlin.jvm.functions.Function0<? extends V> block);
+    field public static final int DEFAULT_SLOT_ACTIONS_SIZE = 16; // 0x10
+    field public static final int DEFAULT_SLOT_KEYS_SIZE = 8; // 0x8
+  }
+
+  public final class ComposerUpdater<N, T extends N> {
+    ctor public ComposerUpdater(androidx.compose.Composer<N> composer, T! node);
+    method public androidx.compose.Composer<N> getComposer();
+    method public T! getNode();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void update(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+  }
+
+  public final class CompositionContext {
+    method public void compose();
+    method public androidx.compose.Component getComponent();
+    method public androidx.compose.Composer<?> getComposer();
+    method public boolean recomposeSync();
+    field public static final androidx.compose.CompositionContext.Companion! Companion;
+  }
+
+  public static final class CompositionContext.Companion {
+    method public androidx.compose.CompositionContext prepare(android.content.Context context, Object root, androidx.compose.Component component, androidx.compose.CompositionReference? compositionReference);
+    method public androidx.compose.CompositionContext prepare(androidx.compose.Component component, androidx.compose.CompositionReference? ambientReference, kotlin.jvm.functions.Function1<? super androidx.compose.Recomposer,? extends androidx.compose.Composer<?>> makeComposer);
+  }
+
+  public interface CompositionLifecycleObserver {
+    method public void onEnter();
+    method public void onLeave();
+  }
+
+  public interface CompositionReference {
+    method public <T> T! getAmbient(androidx.compose.Ambient<T> key);
+    method public void invalidate(boolean sync);
+    method public <T> void invalidateConsumers(androidx.compose.Ambient<T> key);
+    method public <N> void registerComposer(androidx.compose.Composer<N> composer);
+  }
+
+  @androidx.compose.EffectsDsl public final class Effect<T> {
+    method @androidx.compose.annotations.Hide public Object constructKey(int key);
+    method public androidx.compose.Composer<?> getContext();
+    method @androidx.compose.annotations.Hide public T! resolve(androidx.compose.Composer<?> composerContext, int key = sourceLocation());
+    method public void setContext(androidx.compose.Composer<?> p);
+    method public operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+    property public final androidx.compose.Composer<?> context;
+    field @androidx.compose.annotations.Hide public androidx.compose.Composer<?> context;
+  }
+
+  @kotlin.DslMarker public @interface EffectsDsl {
+  }
+
+  public final class EffectsKt {
+    ctor public EffectsKt();
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> ambient(androidx.compose.Ambient<T> key);
+    method public static androidx.compose.Effect<androidx.compose.CompositionReference> compositionReference();
+    method public static <T> androidx.compose.Effect<T> effectOf(kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method public static androidx.compose.Effect<kotlin.jvm.functions.Function0<kotlin.Unit>> getInvalidate();
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> key(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> key(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> key(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> memo(V1? v1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> memo(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> model(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> modelFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> modelFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> modelFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onActive(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> state(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method public static operator <T> T! unaryPlus(androidx.compose.Effect<T>);
+  }
+
+  public interface Emittable {
+    method public void emitInsertAt(int index, androidx.compose.Emittable instance);
+    method public void emitMove(int from, int to, int count);
+    method public void emitRemoveAt(int index, int count);
+  }
+
+  public final class ExpectKt {
+    ctor public ExpectKt();
+    method public static <T> androidx.compose.ThreadLocal<T> ThreadLocal();
+  }
+
+  public final class FrameManager {
+    method public void ensureStarted();
+    method public <T> T! framed(kotlin.jvm.functions.Function0<? extends T> block);
+    method public <T> T! isolated(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void nextFrame();
+    method public <T> T! unframed(kotlin.jvm.functions.Function0<? extends T> block);
+    field public static final androidx.compose.FrameManager! INSTANCE;
+  }
+
+  public final class Handler {
+    ctor public Handler(android.os.Looper looper);
+    method public android.os.Handler getHandler();
+    method public boolean postAtFrontOfQueue(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    property public final android.os.Handler handler;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface HiddenAttribute {
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  public final class JoinedKeyKt {
+    ctor public JoinedKeyKt();
+    method public static boolean isJoinedKey(Object? key);
+    method public static Object? joinedKeyLeft(Object? key);
+    method public static Object? joinedKeyRight(Object? key);
+  }
+
+  public final class KeyInfo {
+    ctor public KeyInfo(Object key, int location, int nodes, int index);
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLocation();
+    method public int getNodes();
+  }
+
+  public final class KeyKt {
+    ctor public KeyKt();
+    method @androidx.compose.Composable public static void Key(@androidx.compose.Pivotal Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class KeySourceInfoKt {
+    ctor public KeySourceInfoKt();
+    method public static String? keySourceInfoOf(Object key);
+  }
+
+  public final class LooperWrapper {
+    method public android.os.Looper getMainLooper();
+    field public static final androidx.compose.LooperWrapper! INSTANCE;
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Model {
+  }
+
+  public final class NullCompilationScope {
+    method public kotlin.Unit getComposer();
+    property public final kotlin.Unit composer;
+    field public static final androidx.compose.NullCompilationScope! INSTANCE;
+  }
+
+  public final class ObserveKt {
+    ctor public ObserveKt();
+    method @androidx.compose.Composable public static void Observe(kotlin.jvm.functions.Function0<kotlin.Unit> body);
+  }
+
+  public final class ObserverMap<K, V> {
+    ctor public ObserverMap();
+    method public void add(K key, V value);
+    method public void clear();
+    method public void clearValues(kotlin.jvm.functions.Function1<? super V,java.lang.Boolean> predicate);
+    method public boolean contains(K key, V value);
+    method public operator java.util.List<V> get(Iterable<? extends K> keys);
+    method public java.util.List<V> remove(K key);
+    method public void remove(K key, V value);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets={AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public @interface Pivotal {
+  }
+
+  public final class RecomposeKt {
+    ctor public RecomposeKt();
+    method @androidx.compose.Composable public static void Recompose(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> body);
+  }
+
+  public abstract class Recomposer {
+    ctor public Recomposer();
+    method protected final void dispatchRecomposes();
+    method public abstract void recomposeSync();
+    method protected abstract void scheduleChangesDispatch();
+    field public static final androidx.compose.Recomposer.Companion! Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public androidx.compose.Recomposer current();
+    method public boolean hasPendingChanges();
+  }
+
+  public final class RecomposerKt {
+    ctor public RecomposerKt();
+  }
+
+  public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public class SlotEditor {
+    method public final Object? get(androidx.compose.Anchor anchor);
+    method public final Object? get(int index);
+    method public final int getCurrent();
+    method public final int getGroupSize();
+    method public final int getNodeIndex();
+    method public final int getParentIndex();
+    method public final int getParentNodes();
+    method public final androidx.compose.SlotTable getTable();
+    method public final int groupSize(int index);
+    method public final boolean isGroup();
+    method public final boolean isGroup(int index);
+    method public final boolean isNode();
+    method public final void setCurrent(int p);
+    property public final int current;
+    property public final int groupSize;
+    property public final boolean isGroup;
+    property public final boolean isNode;
+    property public final int nodeIndex;
+    property public final int parentIndex;
+    property public final int parentNodes;
+  }
+
+  public final class SlotReader extends androidx.compose.SlotEditor {
+    method public void beginEmpty();
+    method public void close();
+    method public void endEmpty();
+    method public int endGroup();
+    method public int endNode();
+    method public java.util.List<androidx.compose.KeyInfo> extractKeys();
+    method public Object? get();
+    method public Object! getGroupKey();
+    method public boolean getInEmpty();
+    method public Object groupKey(int index);
+    method public boolean isGroupEnd();
+    method public Object? next();
+    method public void previous();
+    method public void reportUncertainNodeCount();
+    method public int skipEnclosingGroup();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    property public final Object! groupKey;
+    property public final boolean inEmpty;
+    property public final boolean isGroupEnd;
+  }
+
+  public final class SlotTable {
+    ctor public SlotTable(internal Object![] slots);
+    ctor public SlotTable();
+    method public int getSize();
+    method public androidx.compose.SlotReader openReader();
+    method public androidx.compose.SlotWriter openWriter();
+    method public <T> T! read(kotlin.jvm.functions.Function1<? super androidx.compose.SlotReader,? extends T> block);
+    method public <T> T! write(kotlin.jvm.functions.Function1<? super androidx.compose.SlotWriter,? extends T> block);
+    property public final int size;
+    field public static final androidx.compose.SlotTable.Companion! Companion;
+  }
+
+  public static final class SlotTable.Companion {
+    method public Object getEMPTY();
+    property public final Object EMPTY;
+  }
+
+  public final class SlotTableKt {
+    ctor public SlotTableKt();
+  }
+
+  public final class SlotWriter extends androidx.compose.SlotEditor {
+    method public androidx.compose.Anchor anchor(int index = current);
+    method public void beginInsert();
+    method public void close();
+    method public int endGroup();
+    method public void endInsert();
+    method public int endNode();
+    method public java.util.Iterator<java.lang.Object> groupSlots();
+    method public void moveGroup(int offset);
+    method public void previous();
+    method public boolean removeGroup();
+    method public void set(Object? value);
+    method public Object? skip();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    method public Object? update(Object? value);
+  }
+
+  public final class SourceLocationKt {
+    ctor public SourceLocationKt();
+    method public static inline int sourceLocation();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.Model public final class State<T> implements androidx.compose.frames.Framed {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public T! getValue();
+    method public operator T! getValue(Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method @androidx.compose.annotations.Hide public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public void setValue(T? value);
+    method public operator void setValue(Object? thisObj, kotlin.reflect.KProperty<?> property, T? next);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public final T! value;
+  }
+
+  public class ThreadLocal<T> extends java.lang.ThreadLocal<T> {
+    ctor public ThreadLocal(kotlin.jvm.functions.Function0<? extends T> initialValue);
+  }
+
+  public final class Trace {
+    method public void beginSection(String name);
+    method public void endSection();
+    field public static final androidx.compose.Trace! INSTANCE;
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public @interface UnionType {
+    method public abstract Class<?>[] types();
+  }
+
+  public final class ViewAdapters {
+    ctor public ViewAdapters();
+    method public Object? adapt(Object parent, Object child);
+    method public boolean register(kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+  }
+
+  public final class ViewComposer extends androidx.compose.Composer<java.lang.Object> {
+    ctor public ViewComposer(Object root, android.content.Context context, androidx.compose.Recomposer recomposer, androidx.compose.ViewAdapters? adapters);
+    method public androidx.compose.ViewAdapters? getAdapters();
+    method public android.content.Context getContext();
+    method public Object getRoot();
+  }
+
+  public final class ViewComposerCommonKt {
+    ctor public ViewComposerCommonKt();
+  }
+
+  public final class ViewComposerKt {
+    ctor public ViewComposerKt();
+    method public static androidx.compose.ViewComposition! getComposer();
+    method public static Boolean? registerAdapter(androidx.compose.ViewComposition, kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+    method public static <T> T! runWithCurrent(androidx.compose.Composer<?>, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @androidx.compose.EffectsDsl public final class ViewComposition {
+    ctor public ViewComposition(androidx.compose.ViewComposer composer);
+    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T extends android.view.View> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends android.view.ViewGroup> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public inline <T> T! expr(Object key, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.ViewComposer getComposer();
+    method public inline Object joinKey(Object left, Object? right);
+    method public void observe(Object key, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> block);
+    method public void startRestartGroup(Object key);
+    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+  }
+
+  public final class ViewValidator {
+    ctor public ViewValidator(androidx.compose.Composer<?> composer);
+    method public boolean changed(int value);
+    method public <T> boolean changed(T? value);
+    method public <T> boolean changedUnchecked(T? value);
+    method public androidx.compose.Composer<?> getComposer();
+    method public operator boolean plus(boolean, boolean other);
+    method public inline boolean set(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean set(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean setUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline boolean update(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean update(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean updateUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public boolean updated(int value);
+    method public <T> boolean updated(T? value);
+  }
+
+}
+
+package androidx.compose.adapters {
+
+  public final class ComposeViewAdapter implements androidx.compose.adapters.ViewAdapter {
+    ctor public ComposeViewAdapter();
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public inline <T extends androidx.compose.adapters.ViewAdapter> T get(int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public java.util.List<androidx.compose.adapters.ViewAdapter> getAdapters();
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public final java.util.List<androidx.compose.adapters.ViewAdapter> adapters;
+    property public int id;
+  }
+
+  public interface ViewAdapter {
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public abstract int id;
+  }
+
+  public final class ViewAdapterKt {
+    ctor public ViewAdapterKt();
+    method public static inline <T extends androidx.compose.adapters.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public static androidx.compose.adapters.ComposeViewAdapter getViewAdapter(android.view.View);
+  }
+
+}
+
+package androidx.compose.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Hide {
+  }
+
+}
+
+package androidx.compose.frames {
+
+  public abstract class AbstractRecord implements androidx.compose.frames.Record {
+    ctor public AbstractRecord();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public int frameId;
+    property public androidx.compose.frames.Record? next;
+  }
+
+  public final class Frame {
+    method public int getId();
+    method public boolean getReadonly();
+    method public boolean hasPendingChanges();
+    property public final boolean readonly;
+  }
+
+  public final class FrameAborted extends java.lang.RuntimeException {
+    ctor public FrameAborted(androidx.compose.frames.Frame frame);
+    method public androidx.compose.frames.Frame getFrame();
+  }
+
+  public final class FrameContainersKt {
+    ctor public FrameContainersKt();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T? element);
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T?... elements);
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf();
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class FrameIdSetKt {
+    ctor public FrameIdSetKt();
+  }
+
+  public interface Framed {
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    property public abstract androidx.compose.frames.Record firstFrameRecord;
+  }
+
+  public final class FramesKt {
+    ctor public FramesKt();
+    method public static kotlin.Unit? _created(androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _readable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _writable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static void abort();
+    method public static void abort(androidx.compose.frames.Frame frame);
+    method public static void abortHandler();
+    method public static void abortHandler(androidx.compose.frames.Frame frame);
+    method public static void commit();
+    method public static void commit(androidx.compose.frames.Frame frame);
+    method public static kotlin.Unit? commitHandler();
+    method public static androidx.compose.frames.Frame currentFrame();
+    method public static boolean getInFrame();
+    method public static void observeAllReads(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> readObserver, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static androidx.compose.frames.Frame open(boolean readOnly = false);
+    method public static androidx.compose.frames.Frame open(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver = null, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver = null);
+    method public static <T extends androidx.compose.frames.Record> T readable(T, androidx.compose.frames.Framed framed);
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> registerCommitObserver(kotlin.jvm.functions.Function1<? super java.util.Set<?>,kotlin.Unit> observer);
+    method public static void restore(androidx.compose.frames.Frame frame);
+    method public static androidx.compose.frames.Frame suspend();
+    method public static boolean wasModified(Object value);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed, androidx.compose.frames.Frame frame);
+  }
+
+  public final class ModelList<T> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableList java.util.List<T> {
+    ctor public ModelList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public int size;
+  }
+
+  public final class ModelMap<K, V> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> {
+    ctor public ModelMap();
+    method public void clear();
+    method public boolean containsKey(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public interface Record {
+    method public void assign(androidx.compose.frames.Record value);
+    method public androidx.compose.frames.Record create();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public abstract int frameId;
+    property public abstract androidx.compose.frames.Record? next;
+  }
+
+}
+
diff --git a/compose/compose-runtime/api/public_plus_experimental_0.1.0-dev04.txt b/compose/compose-runtime/api/public_plus_experimental_0.1.0-dev04.txt
new file mode 100644
index 0000000..786046d
--- /dev/null
+++ b/compose/compose-runtime/api/public_plus_experimental_0.1.0-dev04.txt
@@ -0,0 +1,703 @@
+// Signature format: 3.0
+package androidx.compose {
+
+  public final class ActualAndroidKt {
+    ctor public ActualAndroidKt();
+    method public static android.content.Context getContext(android.view.View);
+    method public static android.view.ViewParent getParent(android.view.View);
+    method public static boolean isMainThread();
+  }
+
+  public final class ActualJvmKt {
+    ctor public ActualJvmKt();
+    method public static int identityHashCode(Object? instance);
+    method public static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public final class Ambient<T> {
+    method @androidx.compose.Composable public void Provider(T? value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    field public static final androidx.compose.Ambient.Companion! Companion;
+  }
+
+  public static final class Ambient.Companion {
+    method public <T> androidx.compose.Ambient<T> of(kotlin.jvm.functions.Function0<? extends T>? defaultFactory = null);
+  }
+
+  public final class Anchor {
+    ctor public Anchor(internal int loc);
+    method public boolean getValid();
+    method public int location(androidx.compose.SlotTable slots);
+    property public final boolean valid;
+  }
+
+  public final class Applier<N> {
+    ctor public Applier(N! root, androidx.compose.ApplyAdapter<N> adapter);
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insert(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public void remove(int index, int count);
+    method public void reset();
+    method public void up();
+    property public final N! current;
+  }
+
+  public interface ApplyAdapter<N> {
+    method public void end(N?, N? instance, N? parent);
+    method public void insertAt(N?, int index, N? instance);
+    method public void move(N?, int from, int to, int count);
+    method public void removeAt(N?, int index, int count);
+    method public void start(N?, N? instance);
+  }
+
+  public final class Choreographer {
+    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
+    method public void postFrameCallbackDelayed(long delayMillis, android.view.Choreographer.FrameCallback callback);
+    method public void removeFrameCallback(android.view.Choreographer.FrameCallback callback);
+    field public static final androidx.compose.Choreographer! INSTANCE;
+  }
+
+  @androidx.compose.EffectsDsl public interface CommitScope {
+    method public void onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+  }
+
+  public abstract class Component {
+    ctor public Component();
+    method @androidx.compose.Composable public abstract void compose();
+    method protected final void recompose();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY}) public @interface Composable {
+  }
+
+  public final class Compose {
+    method @MainThread public androidx.compose.CompositionContext? composeInto(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public androidx.compose.CompositionContext composeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public void disposeComposition(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null);
+    method @MainThread public void disposeComposition(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null);
+    method public androidx.compose.Component? findRoot(android.view.View view);
+    method @MainThread public androidx.compose.CompositionContext subcomposeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    field public static final androidx.compose.Compose! INSTANCE;
+  }
+
+  public final class ComposeAndroidKt {
+    ctor public ComposeAndroidKt();
+    method public static void disposeComposition(android.app.Activity);
+    method public static androidx.compose.CompositionContext? setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public final class ComposeKt {
+    ctor public ComposeKt();
+    method public static void disposeComposition(android.view.ViewGroup);
+    method public static androidx.compose.CompositionContext? setViewContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public class Composer<N> {
+    ctor public Composer(androidx.compose.SlotTable slotTable, androidx.compose.Applier<N> applier, androidx.compose.Recomposer recomposer);
+    method public final <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public final void applyChanges();
+    method public final androidx.compose.CompositionReference buildReference();
+    method public final <T> boolean changed(T? value);
+    method public final void collectKeySourceInformation();
+    method protected final void composeRoot(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public final <T extends N> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void doneJoin(boolean valid);
+    method public final <T extends N> void emitNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void emitNode(N? node);
+    method public final void endGroup();
+    method public final void endNode();
+    method public final androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public final void endRoot();
+    method public final int getChangeCount();
+    method public final boolean getInserting();
+    method public final androidx.compose.SlotTable getSlotTable();
+    method public final Object joinKey(Object? left, Object? right);
+    method public final Object? nextSlot();
+    method public final boolean recompose();
+    method public final void skipCurrentGroup();
+    method public final void skipValue();
+    method public final void startGroup(Object key);
+    method public final kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> startJoin(Object key, boolean valid, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> compose);
+    method public final void startNode(Object key);
+    method public final void startRestartGroup(Object key);
+    method public final void startRoot();
+    method public final void updateValue(Object? value);
+    method public final N! useNode();
+    property public final int changeCount;
+    property public final boolean inserting;
+  }
+
+  public final class ComposerKt {
+    ctor public ComposerKt();
+    method public static inline <N, T> T! cache(androidx.compose.Composer<N>, boolean valid = true, kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T> T! escapeCompose(kotlin.jvm.functions.Function1<? super androidx.compose.NullCompilationScope,? extends T> block);
+    method public static <N> Object? nextValue(androidx.compose.Composer<N>);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1> V! remember(androidx.compose.Composer<N>, P1? p1, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3, P4> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, P4? p4, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, Object![]? args, kotlin.jvm.functions.Function0<? extends V> block);
+    field public static final int DEFAULT_SLOT_ACTIONS_SIZE = 16; // 0x10
+    field public static final int DEFAULT_SLOT_KEYS_SIZE = 8; // 0x8
+  }
+
+  public final class ComposerUpdater<N, T extends N> {
+    ctor public ComposerUpdater(androidx.compose.Composer<N> composer, T! node);
+    method public androidx.compose.Composer<N> getComposer();
+    method public T! getNode();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void update(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+  }
+
+  public final class CompositionContext {
+    method public void compose();
+    method public androidx.compose.Component getComponent();
+    method public androidx.compose.Composer<?> getComposer();
+    method public boolean recomposeSync();
+    field public static final androidx.compose.CompositionContext.Companion! Companion;
+  }
+
+  public static final class CompositionContext.Companion {
+    method public androidx.compose.CompositionContext prepare(android.content.Context context, Object root, androidx.compose.Component component, androidx.compose.CompositionReference? compositionReference);
+    method public androidx.compose.CompositionContext prepare(androidx.compose.Component component, androidx.compose.CompositionReference? ambientReference, kotlin.jvm.functions.Function1<? super androidx.compose.Recomposer,? extends androidx.compose.Composer<?>> makeComposer);
+  }
+
+  public interface CompositionLifecycleObserver {
+    method public void onEnter();
+    method public void onLeave();
+  }
+
+  public interface CompositionReference {
+    method public <T> T! getAmbient(androidx.compose.Ambient<T> key);
+    method public void invalidate(boolean sync);
+    method public <T> void invalidateConsumers(androidx.compose.Ambient<T> key);
+    method public <N> void registerComposer(androidx.compose.Composer<N> composer);
+  }
+
+  @androidx.compose.EffectsDsl public final class Effect<T> {
+    method @androidx.compose.annotations.Hide public Object constructKey(int key);
+    method public androidx.compose.Composer<?> getContext();
+    method @androidx.compose.annotations.Hide public T! resolve(androidx.compose.Composer<?> composerContext, int key = sourceLocation());
+    method public void setContext(androidx.compose.Composer<?> p);
+    method public operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+    property public final androidx.compose.Composer<?> context;
+    field @androidx.compose.annotations.Hide public androidx.compose.Composer<?> context;
+  }
+
+  @kotlin.DslMarker public @interface EffectsDsl {
+  }
+
+  public final class EffectsKt {
+    ctor public EffectsKt();
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> ambient(androidx.compose.Ambient<T> key);
+    method public static androidx.compose.Effect<androidx.compose.CompositionReference> compositionReference();
+    method public static <T> androidx.compose.Effect<T> effectOf(kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method public static androidx.compose.Effect<kotlin.jvm.functions.Function0<kotlin.Unit>> getInvalidate();
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> key(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> key(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> key(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> memo(V1? v1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> memo(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> model(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> modelFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> modelFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> modelFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onActive(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> state(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method public static operator <T> T! unaryPlus(androidx.compose.Effect<T>);
+  }
+
+  public interface Emittable {
+    method public void emitInsertAt(int index, androidx.compose.Emittable instance);
+    method public void emitMove(int from, int to, int count);
+    method public void emitRemoveAt(int index, int count);
+  }
+
+  public final class ExpectKt {
+    ctor public ExpectKt();
+    method public static <T> androidx.compose.ThreadLocal<T> ThreadLocal();
+  }
+
+  public final class FrameManager {
+    method public void ensureStarted();
+    method public <T> T! framed(kotlin.jvm.functions.Function0<? extends T> block);
+    method public <T> T! isolated(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void nextFrame();
+    method public <T> T! unframed(kotlin.jvm.functions.Function0<? extends T> block);
+    field public static final androidx.compose.FrameManager! INSTANCE;
+  }
+
+  public final class Handler {
+    ctor public Handler(android.os.Looper looper);
+    method public android.os.Handler getHandler();
+    method public boolean postAtFrontOfQueue(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    property public final android.os.Handler handler;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface HiddenAttribute {
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  public final class JoinedKeyKt {
+    ctor public JoinedKeyKt();
+    method public static boolean isJoinedKey(Object? key);
+    method public static Object? joinedKeyLeft(Object? key);
+    method public static Object? joinedKeyRight(Object? key);
+  }
+
+  public final class KeyInfo {
+    ctor public KeyInfo(Object key, int location, int nodes, int index);
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLocation();
+    method public int getNodes();
+  }
+
+  public final class KeyKt {
+    ctor public KeyKt();
+    method @androidx.compose.Composable public static void Key(@androidx.compose.Pivotal Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class KeySourceInfoKt {
+    ctor public KeySourceInfoKt();
+    method public static String? keySourceInfoOf(Object key);
+  }
+
+  public final class LooperWrapper {
+    method public android.os.Looper getMainLooper();
+    field public static final androidx.compose.LooperWrapper! INSTANCE;
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Model {
+  }
+
+  public final class NullCompilationScope {
+    method public kotlin.Unit getComposer();
+    property public final kotlin.Unit composer;
+    field public static final androidx.compose.NullCompilationScope! INSTANCE;
+  }
+
+  public final class ObserveKt {
+    ctor public ObserveKt();
+    method @androidx.compose.Composable public static void Observe(kotlin.jvm.functions.Function0<kotlin.Unit> body);
+  }
+
+  public final class ObserverMap<K, V> {
+    ctor public ObserverMap();
+    method public void add(K key, V value);
+    method public void clear();
+    method public void clearValues(kotlin.jvm.functions.Function1<? super V,java.lang.Boolean> predicate);
+    method public boolean contains(K key, V value);
+    method public operator java.util.List<V> get(Iterable<? extends K> keys);
+    method public java.util.List<V> remove(K key);
+    method public void remove(K key, V value);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets={AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public @interface Pivotal {
+  }
+
+  public final class RecomposeKt {
+    ctor public RecomposeKt();
+    method @androidx.compose.Composable public static void Recompose(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> body);
+  }
+
+  public abstract class Recomposer {
+    ctor public Recomposer();
+    method protected final void dispatchRecomposes();
+    method public abstract void recomposeSync();
+    method protected abstract void scheduleChangesDispatch();
+    field public static final androidx.compose.Recomposer.Companion! Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public androidx.compose.Recomposer current();
+    method public boolean hasPendingChanges();
+  }
+
+  public final class RecomposerKt {
+    ctor public RecomposerKt();
+  }
+
+  public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public class SlotEditor {
+    method public final Object? get(androidx.compose.Anchor anchor);
+    method public final Object? get(int index);
+    method public final int getCurrent();
+    method public final int getGroupSize();
+    method public final int getNodeIndex();
+    method public final int getParentIndex();
+    method public final int getParentNodes();
+    method public final androidx.compose.SlotTable getTable();
+    method public final int groupSize(int index);
+    method public final boolean isGroup();
+    method public final boolean isGroup(int index);
+    method public final boolean isNode();
+    method public final void setCurrent(int p);
+    property public final int current;
+    property public final int groupSize;
+    property public final boolean isGroup;
+    property public final boolean isNode;
+    property public final int nodeIndex;
+    property public final int parentIndex;
+    property public final int parentNodes;
+  }
+
+  public final class SlotReader extends androidx.compose.SlotEditor {
+    method public void beginEmpty();
+    method public void close();
+    method public void endEmpty();
+    method public int endGroup();
+    method public int endNode();
+    method public java.util.List<androidx.compose.KeyInfo> extractKeys();
+    method public Object? get();
+    method public Object! getGroupKey();
+    method public boolean getInEmpty();
+    method public Object groupKey(int index);
+    method public boolean isGroupEnd();
+    method public Object? next();
+    method public void previous();
+    method public void reportUncertainNodeCount();
+    method public int skipEnclosingGroup();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    property public final Object! groupKey;
+    property public final boolean inEmpty;
+    property public final boolean isGroupEnd;
+  }
+
+  public final class SlotTable {
+    ctor public SlotTable(internal Object![] slots);
+    ctor public SlotTable();
+    method public int getSize();
+    method public androidx.compose.SlotReader openReader();
+    method public androidx.compose.SlotWriter openWriter();
+    method public <T> T! read(kotlin.jvm.functions.Function1<? super androidx.compose.SlotReader,? extends T> block);
+    method public <T> T! write(kotlin.jvm.functions.Function1<? super androidx.compose.SlotWriter,? extends T> block);
+    property public final int size;
+    field public static final androidx.compose.SlotTable.Companion! Companion;
+  }
+
+  public static final class SlotTable.Companion {
+    method public Object getEMPTY();
+    property public final Object EMPTY;
+  }
+
+  public final class SlotTableKt {
+    ctor public SlotTableKt();
+  }
+
+  public final class SlotWriter extends androidx.compose.SlotEditor {
+    method public androidx.compose.Anchor anchor(int index = current);
+    method public void beginInsert();
+    method public void close();
+    method public int endGroup();
+    method public void endInsert();
+    method public int endNode();
+    method public java.util.Iterator<java.lang.Object> groupSlots();
+    method public void moveGroup(int offset);
+    method public void previous();
+    method public boolean removeGroup();
+    method public void set(Object? value);
+    method public Object? skip();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    method public Object? update(Object? value);
+  }
+
+  public final class SourceLocationKt {
+    ctor public SourceLocationKt();
+    method public static inline int sourceLocation();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.Model public final class State<T> implements androidx.compose.frames.Framed {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public T! getValue();
+    method public operator T! getValue(Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method @androidx.compose.annotations.Hide public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public void setValue(T? value);
+    method public operator void setValue(Object? thisObj, kotlin.reflect.KProperty<?> property, T? next);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public final T! value;
+  }
+
+  public class ThreadLocal<T> extends java.lang.ThreadLocal<T> {
+    ctor public ThreadLocal(kotlin.jvm.functions.Function0<? extends T> initialValue);
+  }
+
+  public final class Trace {
+    method public void beginSection(String name);
+    method public void endSection();
+    field public static final androidx.compose.Trace! INSTANCE;
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public @interface UnionType {
+    method public abstract Class<?>[] types();
+  }
+
+  public final class ViewAdapters {
+    ctor public ViewAdapters();
+    method public Object? adapt(Object parent, Object child);
+    method public boolean register(kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+  }
+
+  public final class ViewComposer extends androidx.compose.Composer<java.lang.Object> {
+    ctor public ViewComposer(Object root, android.content.Context context, androidx.compose.Recomposer recomposer, androidx.compose.ViewAdapters? adapters);
+    method public androidx.compose.ViewAdapters? getAdapters();
+    method public android.content.Context getContext();
+    method public Object getRoot();
+  }
+
+  public final class ViewComposerCommonKt {
+    ctor public ViewComposerCommonKt();
+  }
+
+  public final class ViewComposerKt {
+    ctor public ViewComposerKt();
+    method public static androidx.compose.ViewComposition! getComposer();
+    method public static Boolean? registerAdapter(androidx.compose.ViewComposition, kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+    method public static <T> T! runWithCurrent(androidx.compose.Composer<?>, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @androidx.compose.EffectsDsl public final class ViewComposition {
+    ctor public ViewComposition(androidx.compose.ViewComposer composer);
+    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T extends android.view.View> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends android.view.ViewGroup> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public inline <T> T! expr(Object key, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.ViewComposer getComposer();
+    method public inline Object joinKey(Object left, Object? right);
+    method public void observe(Object key, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> block);
+    method public void startRestartGroup(Object key);
+    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+  }
+
+  public final class ViewValidator {
+    ctor public ViewValidator(androidx.compose.Composer<?> composer);
+    method public boolean changed(int value);
+    method public <T> boolean changed(T? value);
+    method public <T> boolean changedUnchecked(T? value);
+    method public androidx.compose.Composer<?> getComposer();
+    method public operator boolean plus(boolean, boolean other);
+    method public inline boolean set(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean set(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean setUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline boolean update(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean update(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean updateUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public boolean updated(int value);
+    method public <T> boolean updated(T? value);
+  }
+
+}
+
+package androidx.compose.adapters {
+
+  public final class ComposeViewAdapter implements androidx.compose.adapters.ViewAdapter {
+    ctor public ComposeViewAdapter();
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public inline <T extends androidx.compose.adapters.ViewAdapter> T get(int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public java.util.List<androidx.compose.adapters.ViewAdapter> getAdapters();
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public final java.util.List<androidx.compose.adapters.ViewAdapter> adapters;
+    property public int id;
+  }
+
+  public interface ViewAdapter {
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public abstract int id;
+  }
+
+  public final class ViewAdapterKt {
+    ctor public ViewAdapterKt();
+    method public static inline <T extends androidx.compose.adapters.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public static androidx.compose.adapters.ComposeViewAdapter getViewAdapter(android.view.View);
+  }
+
+}
+
+package androidx.compose.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Hide {
+  }
+
+}
+
+package androidx.compose.frames {
+
+  public abstract class AbstractRecord implements androidx.compose.frames.Record {
+    ctor public AbstractRecord();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public int frameId;
+    property public androidx.compose.frames.Record? next;
+  }
+
+  public final class Frame {
+    method public int getId();
+    method public boolean getReadonly();
+    method public boolean hasPendingChanges();
+    property public final boolean readonly;
+  }
+
+  public final class FrameAborted extends java.lang.RuntimeException {
+    ctor public FrameAborted(androidx.compose.frames.Frame frame);
+    method public androidx.compose.frames.Frame getFrame();
+  }
+
+  public final class FrameContainersKt {
+    ctor public FrameContainersKt();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T? element);
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T?... elements);
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf();
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class FrameIdSetKt {
+    ctor public FrameIdSetKt();
+  }
+
+  public interface Framed {
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    property public abstract androidx.compose.frames.Record firstFrameRecord;
+  }
+
+  public final class FramesKt {
+    ctor public FramesKt();
+    method public static kotlin.Unit? _created(androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _readable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _writable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static void abort();
+    method public static void abort(androidx.compose.frames.Frame frame);
+    method public static void abortHandler();
+    method public static void abortHandler(androidx.compose.frames.Frame frame);
+    method public static void commit();
+    method public static void commit(androidx.compose.frames.Frame frame);
+    method public static kotlin.Unit? commitHandler();
+    method public static androidx.compose.frames.Frame currentFrame();
+    method public static boolean getInFrame();
+    method public static void observeAllReads(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> readObserver, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static androidx.compose.frames.Frame open(boolean readOnly = false);
+    method public static androidx.compose.frames.Frame open(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver = null, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver = null);
+    method public static <T extends androidx.compose.frames.Record> T readable(T, androidx.compose.frames.Framed framed);
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> registerCommitObserver(kotlin.jvm.functions.Function1<? super java.util.Set<?>,kotlin.Unit> observer);
+    method public static void restore(androidx.compose.frames.Frame frame);
+    method public static androidx.compose.frames.Frame suspend();
+    method public static boolean wasModified(Object value);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed, androidx.compose.frames.Frame frame);
+  }
+
+  public final class ModelList<T> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableList java.util.List<T> {
+    ctor public ModelList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public int size;
+  }
+
+  public final class ModelMap<K, V> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> {
+    ctor public ModelMap();
+    method public void clear();
+    method public boolean containsKey(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public interface Record {
+    method public void assign(androidx.compose.frames.Record value);
+    method public androidx.compose.frames.Record create();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public abstract int frameId;
+    property public abstract androidx.compose.frames.Record? next;
+  }
+
+}
+
diff --git a/compose/compose-runtime/api/public_plus_experimental_current.txt b/compose/compose-runtime/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..786046d
--- /dev/null
+++ b/compose/compose-runtime/api/public_plus_experimental_current.txt
@@ -0,0 +1,703 @@
+// Signature format: 3.0
+package androidx.compose {
+
+  public final class ActualAndroidKt {
+    ctor public ActualAndroidKt();
+    method public static android.content.Context getContext(android.view.View);
+    method public static android.view.ViewParent getParent(android.view.View);
+    method public static boolean isMainThread();
+  }
+
+  public final class ActualJvmKt {
+    ctor public ActualJvmKt();
+    method public static int identityHashCode(Object? instance);
+    method public static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public final class Ambient<T> {
+    method @androidx.compose.Composable public void Provider(T? value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    field public static final androidx.compose.Ambient.Companion! Companion;
+  }
+
+  public static final class Ambient.Companion {
+    method public <T> androidx.compose.Ambient<T> of(kotlin.jvm.functions.Function0<? extends T>? defaultFactory = null);
+  }
+
+  public final class Anchor {
+    ctor public Anchor(internal int loc);
+    method public boolean getValid();
+    method public int location(androidx.compose.SlotTable slots);
+    property public final boolean valid;
+  }
+
+  public final class Applier<N> {
+    ctor public Applier(N! root, androidx.compose.ApplyAdapter<N> adapter);
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insert(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public void remove(int index, int count);
+    method public void reset();
+    method public void up();
+    property public final N! current;
+  }
+
+  public interface ApplyAdapter<N> {
+    method public void end(N?, N? instance, N? parent);
+    method public void insertAt(N?, int index, N? instance);
+    method public void move(N?, int from, int to, int count);
+    method public void removeAt(N?, int index, int count);
+    method public void start(N?, N? instance);
+  }
+
+  public final class Choreographer {
+    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
+    method public void postFrameCallbackDelayed(long delayMillis, android.view.Choreographer.FrameCallback callback);
+    method public void removeFrameCallback(android.view.Choreographer.FrameCallback callback);
+    field public static final androidx.compose.Choreographer! INSTANCE;
+  }
+
+  @androidx.compose.EffectsDsl public interface CommitScope {
+    method public void onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+  }
+
+  public abstract class Component {
+    ctor public Component();
+    method @androidx.compose.Composable public abstract void compose();
+    method protected final void recompose();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY}) public @interface Composable {
+  }
+
+  public final class Compose {
+    method @MainThread public androidx.compose.CompositionContext? composeInto(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public androidx.compose.CompositionContext composeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public void disposeComposition(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null);
+    method @MainThread public void disposeComposition(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null);
+    method public androidx.compose.Component? findRoot(android.view.View view);
+    method @MainThread public androidx.compose.CompositionContext subcomposeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    field public static final androidx.compose.Compose! INSTANCE;
+  }
+
+  public final class ComposeAndroidKt {
+    ctor public ComposeAndroidKt();
+    method public static void disposeComposition(android.app.Activity);
+    method public static androidx.compose.CompositionContext? setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public final class ComposeKt {
+    ctor public ComposeKt();
+    method public static void disposeComposition(android.view.ViewGroup);
+    method public static androidx.compose.CompositionContext? setViewContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public class Composer<N> {
+    ctor public Composer(androidx.compose.SlotTable slotTable, androidx.compose.Applier<N> applier, androidx.compose.Recomposer recomposer);
+    method public final <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public final void applyChanges();
+    method public final androidx.compose.CompositionReference buildReference();
+    method public final <T> boolean changed(T? value);
+    method public final void collectKeySourceInformation();
+    method protected final void composeRoot(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public final <T extends N> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void doneJoin(boolean valid);
+    method public final <T extends N> void emitNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void emitNode(N? node);
+    method public final void endGroup();
+    method public final void endNode();
+    method public final androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public final void endRoot();
+    method public final int getChangeCount();
+    method public final boolean getInserting();
+    method public final androidx.compose.SlotTable getSlotTable();
+    method public final Object joinKey(Object? left, Object? right);
+    method public final Object? nextSlot();
+    method public final boolean recompose();
+    method public final void skipCurrentGroup();
+    method public final void skipValue();
+    method public final void startGroup(Object key);
+    method public final kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> startJoin(Object key, boolean valid, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> compose);
+    method public final void startNode(Object key);
+    method public final void startRestartGroup(Object key);
+    method public final void startRoot();
+    method public final void updateValue(Object? value);
+    method public final N! useNode();
+    property public final int changeCount;
+    property public final boolean inserting;
+  }
+
+  public final class ComposerKt {
+    ctor public ComposerKt();
+    method public static inline <N, T> T! cache(androidx.compose.Composer<N>, boolean valid = true, kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T> T! escapeCompose(kotlin.jvm.functions.Function1<? super androidx.compose.NullCompilationScope,? extends T> block);
+    method public static <N> Object? nextValue(androidx.compose.Composer<N>);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1> V! remember(androidx.compose.Composer<N>, P1? p1, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3, P4> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, P4? p4, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, Object![]? args, kotlin.jvm.functions.Function0<? extends V> block);
+    field public static final int DEFAULT_SLOT_ACTIONS_SIZE = 16; // 0x10
+    field public static final int DEFAULT_SLOT_KEYS_SIZE = 8; // 0x8
+  }
+
+  public final class ComposerUpdater<N, T extends N> {
+    ctor public ComposerUpdater(androidx.compose.Composer<N> composer, T! node);
+    method public androidx.compose.Composer<N> getComposer();
+    method public T! getNode();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void update(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+  }
+
+  public final class CompositionContext {
+    method public void compose();
+    method public androidx.compose.Component getComponent();
+    method public androidx.compose.Composer<?> getComposer();
+    method public boolean recomposeSync();
+    field public static final androidx.compose.CompositionContext.Companion! Companion;
+  }
+
+  public static final class CompositionContext.Companion {
+    method public androidx.compose.CompositionContext prepare(android.content.Context context, Object root, androidx.compose.Component component, androidx.compose.CompositionReference? compositionReference);
+    method public androidx.compose.CompositionContext prepare(androidx.compose.Component component, androidx.compose.CompositionReference? ambientReference, kotlin.jvm.functions.Function1<? super androidx.compose.Recomposer,? extends androidx.compose.Composer<?>> makeComposer);
+  }
+
+  public interface CompositionLifecycleObserver {
+    method public void onEnter();
+    method public void onLeave();
+  }
+
+  public interface CompositionReference {
+    method public <T> T! getAmbient(androidx.compose.Ambient<T> key);
+    method public void invalidate(boolean sync);
+    method public <T> void invalidateConsumers(androidx.compose.Ambient<T> key);
+    method public <N> void registerComposer(androidx.compose.Composer<N> composer);
+  }
+
+  @androidx.compose.EffectsDsl public final class Effect<T> {
+    method @androidx.compose.annotations.Hide public Object constructKey(int key);
+    method public androidx.compose.Composer<?> getContext();
+    method @androidx.compose.annotations.Hide public T! resolve(androidx.compose.Composer<?> composerContext, int key = sourceLocation());
+    method public void setContext(androidx.compose.Composer<?> p);
+    method public operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+    property public final androidx.compose.Composer<?> context;
+    field @androidx.compose.annotations.Hide public androidx.compose.Composer<?> context;
+  }
+
+  @kotlin.DslMarker public @interface EffectsDsl {
+  }
+
+  public final class EffectsKt {
+    ctor public EffectsKt();
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> ambient(androidx.compose.Ambient<T> key);
+    method public static androidx.compose.Effect<androidx.compose.CompositionReference> compositionReference();
+    method public static <T> androidx.compose.Effect<T> effectOf(kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method public static androidx.compose.Effect<kotlin.jvm.functions.Function0<kotlin.Unit>> getInvalidate();
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> key(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> key(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> key(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> memo(V1? v1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> memo(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> model(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> modelFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> modelFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> modelFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onActive(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> state(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method public static operator <T> T! unaryPlus(androidx.compose.Effect<T>);
+  }
+
+  public interface Emittable {
+    method public void emitInsertAt(int index, androidx.compose.Emittable instance);
+    method public void emitMove(int from, int to, int count);
+    method public void emitRemoveAt(int index, int count);
+  }
+
+  public final class ExpectKt {
+    ctor public ExpectKt();
+    method public static <T> androidx.compose.ThreadLocal<T> ThreadLocal();
+  }
+
+  public final class FrameManager {
+    method public void ensureStarted();
+    method public <T> T! framed(kotlin.jvm.functions.Function0<? extends T> block);
+    method public <T> T! isolated(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void nextFrame();
+    method public <T> T! unframed(kotlin.jvm.functions.Function0<? extends T> block);
+    field public static final androidx.compose.FrameManager! INSTANCE;
+  }
+
+  public final class Handler {
+    ctor public Handler(android.os.Looper looper);
+    method public android.os.Handler getHandler();
+    method public boolean postAtFrontOfQueue(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    property public final android.os.Handler handler;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface HiddenAttribute {
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  public final class JoinedKeyKt {
+    ctor public JoinedKeyKt();
+    method public static boolean isJoinedKey(Object? key);
+    method public static Object? joinedKeyLeft(Object? key);
+    method public static Object? joinedKeyRight(Object? key);
+  }
+
+  public final class KeyInfo {
+    ctor public KeyInfo(Object key, int location, int nodes, int index);
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLocation();
+    method public int getNodes();
+  }
+
+  public final class KeyKt {
+    ctor public KeyKt();
+    method @androidx.compose.Composable public static void Key(@androidx.compose.Pivotal Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class KeySourceInfoKt {
+    ctor public KeySourceInfoKt();
+    method public static String? keySourceInfoOf(Object key);
+  }
+
+  public final class LooperWrapper {
+    method public android.os.Looper getMainLooper();
+    field public static final androidx.compose.LooperWrapper! INSTANCE;
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Model {
+  }
+
+  public final class NullCompilationScope {
+    method public kotlin.Unit getComposer();
+    property public final kotlin.Unit composer;
+    field public static final androidx.compose.NullCompilationScope! INSTANCE;
+  }
+
+  public final class ObserveKt {
+    ctor public ObserveKt();
+    method @androidx.compose.Composable public static void Observe(kotlin.jvm.functions.Function0<kotlin.Unit> body);
+  }
+
+  public final class ObserverMap<K, V> {
+    ctor public ObserverMap();
+    method public void add(K key, V value);
+    method public void clear();
+    method public void clearValues(kotlin.jvm.functions.Function1<? super V,java.lang.Boolean> predicate);
+    method public boolean contains(K key, V value);
+    method public operator java.util.List<V> get(Iterable<? extends K> keys);
+    method public java.util.List<V> remove(K key);
+    method public void remove(K key, V value);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets={AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public @interface Pivotal {
+  }
+
+  public final class RecomposeKt {
+    ctor public RecomposeKt();
+    method @androidx.compose.Composable public static void Recompose(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> body);
+  }
+
+  public abstract class Recomposer {
+    ctor public Recomposer();
+    method protected final void dispatchRecomposes();
+    method public abstract void recomposeSync();
+    method protected abstract void scheduleChangesDispatch();
+    field public static final androidx.compose.Recomposer.Companion! Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public androidx.compose.Recomposer current();
+    method public boolean hasPendingChanges();
+  }
+
+  public final class RecomposerKt {
+    ctor public RecomposerKt();
+  }
+
+  public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public class SlotEditor {
+    method public final Object? get(androidx.compose.Anchor anchor);
+    method public final Object? get(int index);
+    method public final int getCurrent();
+    method public final int getGroupSize();
+    method public final int getNodeIndex();
+    method public final int getParentIndex();
+    method public final int getParentNodes();
+    method public final androidx.compose.SlotTable getTable();
+    method public final int groupSize(int index);
+    method public final boolean isGroup();
+    method public final boolean isGroup(int index);
+    method public final boolean isNode();
+    method public final void setCurrent(int p);
+    property public final int current;
+    property public final int groupSize;
+    property public final boolean isGroup;
+    property public final boolean isNode;
+    property public final int nodeIndex;
+    property public final int parentIndex;
+    property public final int parentNodes;
+  }
+
+  public final class SlotReader extends androidx.compose.SlotEditor {
+    method public void beginEmpty();
+    method public void close();
+    method public void endEmpty();
+    method public int endGroup();
+    method public int endNode();
+    method public java.util.List<androidx.compose.KeyInfo> extractKeys();
+    method public Object? get();
+    method public Object! getGroupKey();
+    method public boolean getInEmpty();
+    method public Object groupKey(int index);
+    method public boolean isGroupEnd();
+    method public Object? next();
+    method public void previous();
+    method public void reportUncertainNodeCount();
+    method public int skipEnclosingGroup();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    property public final Object! groupKey;
+    property public final boolean inEmpty;
+    property public final boolean isGroupEnd;
+  }
+
+  public final class SlotTable {
+    ctor public SlotTable(internal Object![] slots);
+    ctor public SlotTable();
+    method public int getSize();
+    method public androidx.compose.SlotReader openReader();
+    method public androidx.compose.SlotWriter openWriter();
+    method public <T> T! read(kotlin.jvm.functions.Function1<? super androidx.compose.SlotReader,? extends T> block);
+    method public <T> T! write(kotlin.jvm.functions.Function1<? super androidx.compose.SlotWriter,? extends T> block);
+    property public final int size;
+    field public static final androidx.compose.SlotTable.Companion! Companion;
+  }
+
+  public static final class SlotTable.Companion {
+    method public Object getEMPTY();
+    property public final Object EMPTY;
+  }
+
+  public final class SlotTableKt {
+    ctor public SlotTableKt();
+  }
+
+  public final class SlotWriter extends androidx.compose.SlotEditor {
+    method public androidx.compose.Anchor anchor(int index = current);
+    method public void beginInsert();
+    method public void close();
+    method public int endGroup();
+    method public void endInsert();
+    method public int endNode();
+    method public java.util.Iterator<java.lang.Object> groupSlots();
+    method public void moveGroup(int offset);
+    method public void previous();
+    method public boolean removeGroup();
+    method public void set(Object? value);
+    method public Object? skip();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    method public Object? update(Object? value);
+  }
+
+  public final class SourceLocationKt {
+    ctor public SourceLocationKt();
+    method public static inline int sourceLocation();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.Model public final class State<T> implements androidx.compose.frames.Framed {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public T! getValue();
+    method public operator T! getValue(Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method @androidx.compose.annotations.Hide public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public void setValue(T? value);
+    method public operator void setValue(Object? thisObj, kotlin.reflect.KProperty<?> property, T? next);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public final T! value;
+  }
+
+  public class ThreadLocal<T> extends java.lang.ThreadLocal<T> {
+    ctor public ThreadLocal(kotlin.jvm.functions.Function0<? extends T> initialValue);
+  }
+
+  public final class Trace {
+    method public void beginSection(String name);
+    method public void endSection();
+    field public static final androidx.compose.Trace! INSTANCE;
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public @interface UnionType {
+    method public abstract Class<?>[] types();
+  }
+
+  public final class ViewAdapters {
+    ctor public ViewAdapters();
+    method public Object? adapt(Object parent, Object child);
+    method public boolean register(kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+  }
+
+  public final class ViewComposer extends androidx.compose.Composer<java.lang.Object> {
+    ctor public ViewComposer(Object root, android.content.Context context, androidx.compose.Recomposer recomposer, androidx.compose.ViewAdapters? adapters);
+    method public androidx.compose.ViewAdapters? getAdapters();
+    method public android.content.Context getContext();
+    method public Object getRoot();
+  }
+
+  public final class ViewComposerCommonKt {
+    ctor public ViewComposerCommonKt();
+  }
+
+  public final class ViewComposerKt {
+    ctor public ViewComposerKt();
+    method public static androidx.compose.ViewComposition! getComposer();
+    method public static Boolean? registerAdapter(androidx.compose.ViewComposition, kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+    method public static <T> T! runWithCurrent(androidx.compose.Composer<?>, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @androidx.compose.EffectsDsl public final class ViewComposition {
+    ctor public ViewComposition(androidx.compose.ViewComposer composer);
+    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T extends android.view.View> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends android.view.ViewGroup> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public inline <T> T! expr(Object key, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.ViewComposer getComposer();
+    method public inline Object joinKey(Object left, Object? right);
+    method public void observe(Object key, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> block);
+    method public void startRestartGroup(Object key);
+    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+  }
+
+  public final class ViewValidator {
+    ctor public ViewValidator(androidx.compose.Composer<?> composer);
+    method public boolean changed(int value);
+    method public <T> boolean changed(T? value);
+    method public <T> boolean changedUnchecked(T? value);
+    method public androidx.compose.Composer<?> getComposer();
+    method public operator boolean plus(boolean, boolean other);
+    method public inline boolean set(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean set(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean setUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline boolean update(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean update(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean updateUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public boolean updated(int value);
+    method public <T> boolean updated(T? value);
+  }
+
+}
+
+package androidx.compose.adapters {
+
+  public final class ComposeViewAdapter implements androidx.compose.adapters.ViewAdapter {
+    ctor public ComposeViewAdapter();
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public inline <T extends androidx.compose.adapters.ViewAdapter> T get(int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public java.util.List<androidx.compose.adapters.ViewAdapter> getAdapters();
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public final java.util.List<androidx.compose.adapters.ViewAdapter> adapters;
+    property public int id;
+  }
+
+  public interface ViewAdapter {
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public abstract int id;
+  }
+
+  public final class ViewAdapterKt {
+    ctor public ViewAdapterKt();
+    method public static inline <T extends androidx.compose.adapters.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public static androidx.compose.adapters.ComposeViewAdapter getViewAdapter(android.view.View);
+  }
+
+}
+
+package androidx.compose.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Hide {
+  }
+
+}
+
+package androidx.compose.frames {
+
+  public abstract class AbstractRecord implements androidx.compose.frames.Record {
+    ctor public AbstractRecord();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public int frameId;
+    property public androidx.compose.frames.Record? next;
+  }
+
+  public final class Frame {
+    method public int getId();
+    method public boolean getReadonly();
+    method public boolean hasPendingChanges();
+    property public final boolean readonly;
+  }
+
+  public final class FrameAborted extends java.lang.RuntimeException {
+    ctor public FrameAborted(androidx.compose.frames.Frame frame);
+    method public androidx.compose.frames.Frame getFrame();
+  }
+
+  public final class FrameContainersKt {
+    ctor public FrameContainersKt();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T? element);
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T?... elements);
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf();
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class FrameIdSetKt {
+    ctor public FrameIdSetKt();
+  }
+
+  public interface Framed {
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    property public abstract androidx.compose.frames.Record firstFrameRecord;
+  }
+
+  public final class FramesKt {
+    ctor public FramesKt();
+    method public static kotlin.Unit? _created(androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _readable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _writable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static void abort();
+    method public static void abort(androidx.compose.frames.Frame frame);
+    method public static void abortHandler();
+    method public static void abortHandler(androidx.compose.frames.Frame frame);
+    method public static void commit();
+    method public static void commit(androidx.compose.frames.Frame frame);
+    method public static kotlin.Unit? commitHandler();
+    method public static androidx.compose.frames.Frame currentFrame();
+    method public static boolean getInFrame();
+    method public static void observeAllReads(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> readObserver, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static androidx.compose.frames.Frame open(boolean readOnly = false);
+    method public static androidx.compose.frames.Frame open(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver = null, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver = null);
+    method public static <T extends androidx.compose.frames.Record> T readable(T, androidx.compose.frames.Framed framed);
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> registerCommitObserver(kotlin.jvm.functions.Function1<? super java.util.Set<?>,kotlin.Unit> observer);
+    method public static void restore(androidx.compose.frames.Frame frame);
+    method public static androidx.compose.frames.Frame suspend();
+    method public static boolean wasModified(Object value);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed, androidx.compose.frames.Frame frame);
+  }
+
+  public final class ModelList<T> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableList java.util.List<T> {
+    ctor public ModelList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public int size;
+  }
+
+  public final class ModelMap<K, V> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> {
+    ctor public ModelMap();
+    method public void clear();
+    method public boolean containsKey(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public interface Record {
+    method public void assign(androidx.compose.frames.Record value);
+    method public androidx.compose.frames.Record create();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public abstract int frameId;
+    property public abstract androidx.compose.frames.Record? next;
+  }
+
+}
+
diff --git a/compose/compose-runtime/api/res-0.1.0-dev04.txt b/compose/compose-runtime/api/res-0.1.0-dev04.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/compose-runtime/api/res-0.1.0-dev04.txt
diff --git a/compose/compose-runtime/api/restricted_0.1.0-dev04.txt b/compose/compose-runtime/api/restricted_0.1.0-dev04.txt
new file mode 100644
index 0000000..786046d
--- /dev/null
+++ b/compose/compose-runtime/api/restricted_0.1.0-dev04.txt
@@ -0,0 +1,703 @@
+// Signature format: 3.0
+package androidx.compose {
+
+  public final class ActualAndroidKt {
+    ctor public ActualAndroidKt();
+    method public static android.content.Context getContext(android.view.View);
+    method public static android.view.ViewParent getParent(android.view.View);
+    method public static boolean isMainThread();
+  }
+
+  public final class ActualJvmKt {
+    ctor public ActualJvmKt();
+    method public static int identityHashCode(Object? instance);
+    method public static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public final class Ambient<T> {
+    method @androidx.compose.Composable public void Provider(T? value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    field public static final androidx.compose.Ambient.Companion! Companion;
+  }
+
+  public static final class Ambient.Companion {
+    method public <T> androidx.compose.Ambient<T> of(kotlin.jvm.functions.Function0<? extends T>? defaultFactory = null);
+  }
+
+  public final class Anchor {
+    ctor public Anchor(internal int loc);
+    method public boolean getValid();
+    method public int location(androidx.compose.SlotTable slots);
+    property public final boolean valid;
+  }
+
+  public final class Applier<N> {
+    ctor public Applier(N! root, androidx.compose.ApplyAdapter<N> adapter);
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insert(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public void remove(int index, int count);
+    method public void reset();
+    method public void up();
+    property public final N! current;
+  }
+
+  public interface ApplyAdapter<N> {
+    method public void end(N?, N? instance, N? parent);
+    method public void insertAt(N?, int index, N? instance);
+    method public void move(N?, int from, int to, int count);
+    method public void removeAt(N?, int index, int count);
+    method public void start(N?, N? instance);
+  }
+
+  public final class Choreographer {
+    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
+    method public void postFrameCallbackDelayed(long delayMillis, android.view.Choreographer.FrameCallback callback);
+    method public void removeFrameCallback(android.view.Choreographer.FrameCallback callback);
+    field public static final androidx.compose.Choreographer! INSTANCE;
+  }
+
+  @androidx.compose.EffectsDsl public interface CommitScope {
+    method public void onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+  }
+
+  public abstract class Component {
+    ctor public Component();
+    method @androidx.compose.Composable public abstract void compose();
+    method protected final void recompose();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY}) public @interface Composable {
+  }
+
+  public final class Compose {
+    method @MainThread public androidx.compose.CompositionContext? composeInto(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public androidx.compose.CompositionContext composeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public void disposeComposition(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null);
+    method @MainThread public void disposeComposition(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null);
+    method public androidx.compose.Component? findRoot(android.view.View view);
+    method @MainThread public androidx.compose.CompositionContext subcomposeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    field public static final androidx.compose.Compose! INSTANCE;
+  }
+
+  public final class ComposeAndroidKt {
+    ctor public ComposeAndroidKt();
+    method public static void disposeComposition(android.app.Activity);
+    method public static androidx.compose.CompositionContext? setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public final class ComposeKt {
+    ctor public ComposeKt();
+    method public static void disposeComposition(android.view.ViewGroup);
+    method public static androidx.compose.CompositionContext? setViewContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public class Composer<N> {
+    ctor public Composer(androidx.compose.SlotTable slotTable, androidx.compose.Applier<N> applier, androidx.compose.Recomposer recomposer);
+    method public final <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public final void applyChanges();
+    method public final androidx.compose.CompositionReference buildReference();
+    method public final <T> boolean changed(T? value);
+    method public final void collectKeySourceInformation();
+    method protected final void composeRoot(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public final <T extends N> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void doneJoin(boolean valid);
+    method public final <T extends N> void emitNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void emitNode(N? node);
+    method public final void endGroup();
+    method public final void endNode();
+    method public final androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public final void endRoot();
+    method public final int getChangeCount();
+    method public final boolean getInserting();
+    method public final androidx.compose.SlotTable getSlotTable();
+    method public final Object joinKey(Object? left, Object? right);
+    method public final Object? nextSlot();
+    method public final boolean recompose();
+    method public final void skipCurrentGroup();
+    method public final void skipValue();
+    method public final void startGroup(Object key);
+    method public final kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> startJoin(Object key, boolean valid, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> compose);
+    method public final void startNode(Object key);
+    method public final void startRestartGroup(Object key);
+    method public final void startRoot();
+    method public final void updateValue(Object? value);
+    method public final N! useNode();
+    property public final int changeCount;
+    property public final boolean inserting;
+  }
+
+  public final class ComposerKt {
+    ctor public ComposerKt();
+    method public static inline <N, T> T! cache(androidx.compose.Composer<N>, boolean valid = true, kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T> T! escapeCompose(kotlin.jvm.functions.Function1<? super androidx.compose.NullCompilationScope,? extends T> block);
+    method public static <N> Object? nextValue(androidx.compose.Composer<N>);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1> V! remember(androidx.compose.Composer<N>, P1? p1, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3, P4> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, P4? p4, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, Object![]? args, kotlin.jvm.functions.Function0<? extends V> block);
+    field public static final int DEFAULT_SLOT_ACTIONS_SIZE = 16; // 0x10
+    field public static final int DEFAULT_SLOT_KEYS_SIZE = 8; // 0x8
+  }
+
+  public final class ComposerUpdater<N, T extends N> {
+    ctor public ComposerUpdater(androidx.compose.Composer<N> composer, T! node);
+    method public androidx.compose.Composer<N> getComposer();
+    method public T! getNode();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void update(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+  }
+
+  public final class CompositionContext {
+    method public void compose();
+    method public androidx.compose.Component getComponent();
+    method public androidx.compose.Composer<?> getComposer();
+    method public boolean recomposeSync();
+    field public static final androidx.compose.CompositionContext.Companion! Companion;
+  }
+
+  public static final class CompositionContext.Companion {
+    method public androidx.compose.CompositionContext prepare(android.content.Context context, Object root, androidx.compose.Component component, androidx.compose.CompositionReference? compositionReference);
+    method public androidx.compose.CompositionContext prepare(androidx.compose.Component component, androidx.compose.CompositionReference? ambientReference, kotlin.jvm.functions.Function1<? super androidx.compose.Recomposer,? extends androidx.compose.Composer<?>> makeComposer);
+  }
+
+  public interface CompositionLifecycleObserver {
+    method public void onEnter();
+    method public void onLeave();
+  }
+
+  public interface CompositionReference {
+    method public <T> T! getAmbient(androidx.compose.Ambient<T> key);
+    method public void invalidate(boolean sync);
+    method public <T> void invalidateConsumers(androidx.compose.Ambient<T> key);
+    method public <N> void registerComposer(androidx.compose.Composer<N> composer);
+  }
+
+  @androidx.compose.EffectsDsl public final class Effect<T> {
+    method @androidx.compose.annotations.Hide public Object constructKey(int key);
+    method public androidx.compose.Composer<?> getContext();
+    method @androidx.compose.annotations.Hide public T! resolve(androidx.compose.Composer<?> composerContext, int key = sourceLocation());
+    method public void setContext(androidx.compose.Composer<?> p);
+    method public operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+    property public final androidx.compose.Composer<?> context;
+    field @androidx.compose.annotations.Hide public androidx.compose.Composer<?> context;
+  }
+
+  @kotlin.DslMarker public @interface EffectsDsl {
+  }
+
+  public final class EffectsKt {
+    ctor public EffectsKt();
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> ambient(androidx.compose.Ambient<T> key);
+    method public static androidx.compose.Effect<androidx.compose.CompositionReference> compositionReference();
+    method public static <T> androidx.compose.Effect<T> effectOf(kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method public static androidx.compose.Effect<kotlin.jvm.functions.Function0<kotlin.Unit>> getInvalidate();
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> key(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> key(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> key(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> memo(V1? v1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> memo(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> model(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> modelFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> modelFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> modelFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onActive(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> state(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method public static operator <T> T! unaryPlus(androidx.compose.Effect<T>);
+  }
+
+  public interface Emittable {
+    method public void emitInsertAt(int index, androidx.compose.Emittable instance);
+    method public void emitMove(int from, int to, int count);
+    method public void emitRemoveAt(int index, int count);
+  }
+
+  public final class ExpectKt {
+    ctor public ExpectKt();
+    method public static <T> androidx.compose.ThreadLocal<T> ThreadLocal();
+  }
+
+  public final class FrameManager {
+    method public void ensureStarted();
+    method public <T> T! framed(kotlin.jvm.functions.Function0<? extends T> block);
+    method public <T> T! isolated(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void nextFrame();
+    method public <T> T! unframed(kotlin.jvm.functions.Function0<? extends T> block);
+    field public static final androidx.compose.FrameManager! INSTANCE;
+  }
+
+  public final class Handler {
+    ctor public Handler(android.os.Looper looper);
+    method public android.os.Handler getHandler();
+    method public boolean postAtFrontOfQueue(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    property public final android.os.Handler handler;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface HiddenAttribute {
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  public final class JoinedKeyKt {
+    ctor public JoinedKeyKt();
+    method public static boolean isJoinedKey(Object? key);
+    method public static Object? joinedKeyLeft(Object? key);
+    method public static Object? joinedKeyRight(Object? key);
+  }
+
+  public final class KeyInfo {
+    ctor public KeyInfo(Object key, int location, int nodes, int index);
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLocation();
+    method public int getNodes();
+  }
+
+  public final class KeyKt {
+    ctor public KeyKt();
+    method @androidx.compose.Composable public static void Key(@androidx.compose.Pivotal Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class KeySourceInfoKt {
+    ctor public KeySourceInfoKt();
+    method public static String? keySourceInfoOf(Object key);
+  }
+
+  public final class LooperWrapper {
+    method public android.os.Looper getMainLooper();
+    field public static final androidx.compose.LooperWrapper! INSTANCE;
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Model {
+  }
+
+  public final class NullCompilationScope {
+    method public kotlin.Unit getComposer();
+    property public final kotlin.Unit composer;
+    field public static final androidx.compose.NullCompilationScope! INSTANCE;
+  }
+
+  public final class ObserveKt {
+    ctor public ObserveKt();
+    method @androidx.compose.Composable public static void Observe(kotlin.jvm.functions.Function0<kotlin.Unit> body);
+  }
+
+  public final class ObserverMap<K, V> {
+    ctor public ObserverMap();
+    method public void add(K key, V value);
+    method public void clear();
+    method public void clearValues(kotlin.jvm.functions.Function1<? super V,java.lang.Boolean> predicate);
+    method public boolean contains(K key, V value);
+    method public operator java.util.List<V> get(Iterable<? extends K> keys);
+    method public java.util.List<V> remove(K key);
+    method public void remove(K key, V value);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets={AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public @interface Pivotal {
+  }
+
+  public final class RecomposeKt {
+    ctor public RecomposeKt();
+    method @androidx.compose.Composable public static void Recompose(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> body);
+  }
+
+  public abstract class Recomposer {
+    ctor public Recomposer();
+    method protected final void dispatchRecomposes();
+    method public abstract void recomposeSync();
+    method protected abstract void scheduleChangesDispatch();
+    field public static final androidx.compose.Recomposer.Companion! Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public androidx.compose.Recomposer current();
+    method public boolean hasPendingChanges();
+  }
+
+  public final class RecomposerKt {
+    ctor public RecomposerKt();
+  }
+
+  public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public class SlotEditor {
+    method public final Object? get(androidx.compose.Anchor anchor);
+    method public final Object? get(int index);
+    method public final int getCurrent();
+    method public final int getGroupSize();
+    method public final int getNodeIndex();
+    method public final int getParentIndex();
+    method public final int getParentNodes();
+    method public final androidx.compose.SlotTable getTable();
+    method public final int groupSize(int index);
+    method public final boolean isGroup();
+    method public final boolean isGroup(int index);
+    method public final boolean isNode();
+    method public final void setCurrent(int p);
+    property public final int current;
+    property public final int groupSize;
+    property public final boolean isGroup;
+    property public final boolean isNode;
+    property public final int nodeIndex;
+    property public final int parentIndex;
+    property public final int parentNodes;
+  }
+
+  public final class SlotReader extends androidx.compose.SlotEditor {
+    method public void beginEmpty();
+    method public void close();
+    method public void endEmpty();
+    method public int endGroup();
+    method public int endNode();
+    method public java.util.List<androidx.compose.KeyInfo> extractKeys();
+    method public Object? get();
+    method public Object! getGroupKey();
+    method public boolean getInEmpty();
+    method public Object groupKey(int index);
+    method public boolean isGroupEnd();
+    method public Object? next();
+    method public void previous();
+    method public void reportUncertainNodeCount();
+    method public int skipEnclosingGroup();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    property public final Object! groupKey;
+    property public final boolean inEmpty;
+    property public final boolean isGroupEnd;
+  }
+
+  public final class SlotTable {
+    ctor public SlotTable(internal Object![] slots);
+    ctor public SlotTable();
+    method public int getSize();
+    method public androidx.compose.SlotReader openReader();
+    method public androidx.compose.SlotWriter openWriter();
+    method public <T> T! read(kotlin.jvm.functions.Function1<? super androidx.compose.SlotReader,? extends T> block);
+    method public <T> T! write(kotlin.jvm.functions.Function1<? super androidx.compose.SlotWriter,? extends T> block);
+    property public final int size;
+    field public static final androidx.compose.SlotTable.Companion! Companion;
+  }
+
+  public static final class SlotTable.Companion {
+    method public Object getEMPTY();
+    property public final Object EMPTY;
+  }
+
+  public final class SlotTableKt {
+    ctor public SlotTableKt();
+  }
+
+  public final class SlotWriter extends androidx.compose.SlotEditor {
+    method public androidx.compose.Anchor anchor(int index = current);
+    method public void beginInsert();
+    method public void close();
+    method public int endGroup();
+    method public void endInsert();
+    method public int endNode();
+    method public java.util.Iterator<java.lang.Object> groupSlots();
+    method public void moveGroup(int offset);
+    method public void previous();
+    method public boolean removeGroup();
+    method public void set(Object? value);
+    method public Object? skip();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    method public Object? update(Object? value);
+  }
+
+  public final class SourceLocationKt {
+    ctor public SourceLocationKt();
+    method public static inline int sourceLocation();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.Model public final class State<T> implements androidx.compose.frames.Framed {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public T! getValue();
+    method public operator T! getValue(Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method @androidx.compose.annotations.Hide public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public void setValue(T? value);
+    method public operator void setValue(Object? thisObj, kotlin.reflect.KProperty<?> property, T? next);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public final T! value;
+  }
+
+  public class ThreadLocal<T> extends java.lang.ThreadLocal<T> {
+    ctor public ThreadLocal(kotlin.jvm.functions.Function0<? extends T> initialValue);
+  }
+
+  public final class Trace {
+    method public void beginSection(String name);
+    method public void endSection();
+    field public static final androidx.compose.Trace! INSTANCE;
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public @interface UnionType {
+    method public abstract Class<?>[] types();
+  }
+
+  public final class ViewAdapters {
+    ctor public ViewAdapters();
+    method public Object? adapt(Object parent, Object child);
+    method public boolean register(kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+  }
+
+  public final class ViewComposer extends androidx.compose.Composer<java.lang.Object> {
+    ctor public ViewComposer(Object root, android.content.Context context, androidx.compose.Recomposer recomposer, androidx.compose.ViewAdapters? adapters);
+    method public androidx.compose.ViewAdapters? getAdapters();
+    method public android.content.Context getContext();
+    method public Object getRoot();
+  }
+
+  public final class ViewComposerCommonKt {
+    ctor public ViewComposerCommonKt();
+  }
+
+  public final class ViewComposerKt {
+    ctor public ViewComposerKt();
+    method public static androidx.compose.ViewComposition! getComposer();
+    method public static Boolean? registerAdapter(androidx.compose.ViewComposition, kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+    method public static <T> T! runWithCurrent(androidx.compose.Composer<?>, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @androidx.compose.EffectsDsl public final class ViewComposition {
+    ctor public ViewComposition(androidx.compose.ViewComposer composer);
+    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T extends android.view.View> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends android.view.ViewGroup> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public inline <T> T! expr(Object key, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.ViewComposer getComposer();
+    method public inline Object joinKey(Object left, Object? right);
+    method public void observe(Object key, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> block);
+    method public void startRestartGroup(Object key);
+    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+  }
+
+  public final class ViewValidator {
+    ctor public ViewValidator(androidx.compose.Composer<?> composer);
+    method public boolean changed(int value);
+    method public <T> boolean changed(T? value);
+    method public <T> boolean changedUnchecked(T? value);
+    method public androidx.compose.Composer<?> getComposer();
+    method public operator boolean plus(boolean, boolean other);
+    method public inline boolean set(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean set(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean setUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline boolean update(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean update(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean updateUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public boolean updated(int value);
+    method public <T> boolean updated(T? value);
+  }
+
+}
+
+package androidx.compose.adapters {
+
+  public final class ComposeViewAdapter implements androidx.compose.adapters.ViewAdapter {
+    ctor public ComposeViewAdapter();
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public inline <T extends androidx.compose.adapters.ViewAdapter> T get(int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public java.util.List<androidx.compose.adapters.ViewAdapter> getAdapters();
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public final java.util.List<androidx.compose.adapters.ViewAdapter> adapters;
+    property public int id;
+  }
+
+  public interface ViewAdapter {
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public abstract int id;
+  }
+
+  public final class ViewAdapterKt {
+    ctor public ViewAdapterKt();
+    method public static inline <T extends androidx.compose.adapters.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public static androidx.compose.adapters.ComposeViewAdapter getViewAdapter(android.view.View);
+  }
+
+}
+
+package androidx.compose.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Hide {
+  }
+
+}
+
+package androidx.compose.frames {
+
+  public abstract class AbstractRecord implements androidx.compose.frames.Record {
+    ctor public AbstractRecord();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public int frameId;
+    property public androidx.compose.frames.Record? next;
+  }
+
+  public final class Frame {
+    method public int getId();
+    method public boolean getReadonly();
+    method public boolean hasPendingChanges();
+    property public final boolean readonly;
+  }
+
+  public final class FrameAborted extends java.lang.RuntimeException {
+    ctor public FrameAborted(androidx.compose.frames.Frame frame);
+    method public androidx.compose.frames.Frame getFrame();
+  }
+
+  public final class FrameContainersKt {
+    ctor public FrameContainersKt();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T? element);
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T?... elements);
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf();
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class FrameIdSetKt {
+    ctor public FrameIdSetKt();
+  }
+
+  public interface Framed {
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    property public abstract androidx.compose.frames.Record firstFrameRecord;
+  }
+
+  public final class FramesKt {
+    ctor public FramesKt();
+    method public static kotlin.Unit? _created(androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _readable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _writable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static void abort();
+    method public static void abort(androidx.compose.frames.Frame frame);
+    method public static void abortHandler();
+    method public static void abortHandler(androidx.compose.frames.Frame frame);
+    method public static void commit();
+    method public static void commit(androidx.compose.frames.Frame frame);
+    method public static kotlin.Unit? commitHandler();
+    method public static androidx.compose.frames.Frame currentFrame();
+    method public static boolean getInFrame();
+    method public static void observeAllReads(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> readObserver, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static androidx.compose.frames.Frame open(boolean readOnly = false);
+    method public static androidx.compose.frames.Frame open(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver = null, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver = null);
+    method public static <T extends androidx.compose.frames.Record> T readable(T, androidx.compose.frames.Framed framed);
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> registerCommitObserver(kotlin.jvm.functions.Function1<? super java.util.Set<?>,kotlin.Unit> observer);
+    method public static void restore(androidx.compose.frames.Frame frame);
+    method public static androidx.compose.frames.Frame suspend();
+    method public static boolean wasModified(Object value);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed, androidx.compose.frames.Frame frame);
+  }
+
+  public final class ModelList<T> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableList java.util.List<T> {
+    ctor public ModelList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public int size;
+  }
+
+  public final class ModelMap<K, V> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> {
+    ctor public ModelMap();
+    method public void clear();
+    method public boolean containsKey(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public interface Record {
+    method public void assign(androidx.compose.frames.Record value);
+    method public androidx.compose.frames.Record create();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public abstract int frameId;
+    property public abstract androidx.compose.frames.Record? next;
+  }
+
+}
+
diff --git a/compose/compose-runtime/api/restricted_current.txt b/compose/compose-runtime/api/restricted_current.txt
new file mode 100644
index 0000000..786046d
--- /dev/null
+++ b/compose/compose-runtime/api/restricted_current.txt
@@ -0,0 +1,703 @@
+// Signature format: 3.0
+package androidx.compose {
+
+  public final class ActualAndroidKt {
+    ctor public ActualAndroidKt();
+    method public static android.content.Context getContext(android.view.View);
+    method public static android.view.ViewParent getParent(android.view.View);
+    method public static boolean isMainThread();
+  }
+
+  public final class ActualJvmKt {
+    ctor public ActualJvmKt();
+    method public static int identityHashCode(Object? instance);
+    method public static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public final class Ambient<T> {
+    method @androidx.compose.Composable public void Provider(T? value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    field public static final androidx.compose.Ambient.Companion! Companion;
+  }
+
+  public static final class Ambient.Companion {
+    method public <T> androidx.compose.Ambient<T> of(kotlin.jvm.functions.Function0<? extends T>? defaultFactory = null);
+  }
+
+  public final class Anchor {
+    ctor public Anchor(internal int loc);
+    method public boolean getValid();
+    method public int location(androidx.compose.SlotTable slots);
+    property public final boolean valid;
+  }
+
+  public final class Applier<N> {
+    ctor public Applier(N! root, androidx.compose.ApplyAdapter<N> adapter);
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insert(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public void remove(int index, int count);
+    method public void reset();
+    method public void up();
+    property public final N! current;
+  }
+
+  public interface ApplyAdapter<N> {
+    method public void end(N?, N? instance, N? parent);
+    method public void insertAt(N?, int index, N? instance);
+    method public void move(N?, int from, int to, int count);
+    method public void removeAt(N?, int index, int count);
+    method public void start(N?, N? instance);
+  }
+
+  public final class Choreographer {
+    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
+    method public void postFrameCallbackDelayed(long delayMillis, android.view.Choreographer.FrameCallback callback);
+    method public void removeFrameCallback(android.view.Choreographer.FrameCallback callback);
+    field public static final androidx.compose.Choreographer! INSTANCE;
+  }
+
+  @androidx.compose.EffectsDsl public interface CommitScope {
+    method public void onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+  }
+
+  public abstract class Component {
+    ctor public Component();
+    method @androidx.compose.Composable public abstract void compose();
+    method protected final void recompose();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY}) public @interface Composable {
+  }
+
+  public final class Compose {
+    method @MainThread public androidx.compose.CompositionContext? composeInto(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public androidx.compose.CompositionContext composeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method @MainThread public void disposeComposition(android.view.ViewGroup container, androidx.compose.CompositionReference? parent = null);
+    method @MainThread public void disposeComposition(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null);
+    method public androidx.compose.Component? findRoot(android.view.View view);
+    method @MainThread public androidx.compose.CompositionContext subcomposeInto(androidx.compose.Emittable container, android.content.Context context, androidx.compose.CompositionReference? parent = null, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    field public static final androidx.compose.Compose! INSTANCE;
+  }
+
+  public final class ComposeAndroidKt {
+    ctor public ComposeAndroidKt();
+    method public static void disposeComposition(android.app.Activity);
+    method public static androidx.compose.CompositionContext? setViewContent(android.app.Activity, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public final class ComposeKt {
+    ctor public ComposeKt();
+    method public static void disposeComposition(android.view.ViewGroup);
+    method public static androidx.compose.CompositionContext? setViewContent(android.view.ViewGroup, kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public class Composer<N> {
+    ctor public Composer(androidx.compose.SlotTable slotTable, androidx.compose.Applier<N> applier, androidx.compose.Recomposer recomposer);
+    method public final <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public final void applyChanges();
+    method public final androidx.compose.CompositionReference buildReference();
+    method public final <T> boolean changed(T? value);
+    method public final void collectKeySourceInformation();
+    method protected final void composeRoot(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public final <T extends N> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void doneJoin(boolean valid);
+    method public final <T extends N> void emitNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method public final void emitNode(N? node);
+    method public final void endGroup();
+    method public final void endNode();
+    method public final androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public final void endRoot();
+    method public final int getChangeCount();
+    method public final boolean getInserting();
+    method public final androidx.compose.SlotTable getSlotTable();
+    method public final Object joinKey(Object? left, Object? right);
+    method public final Object? nextSlot();
+    method public final boolean recompose();
+    method public final void skipCurrentGroup();
+    method public final void skipValue();
+    method public final void startGroup(Object key);
+    method public final kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> startJoin(Object key, boolean valid, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> compose);
+    method public final void startNode(Object key);
+    method public final void startRestartGroup(Object key);
+    method public final void startRoot();
+    method public final void updateValue(Object? value);
+    method public final N! useNode();
+    property public final int changeCount;
+    property public final boolean inserting;
+  }
+
+  public final class ComposerKt {
+    ctor public ComposerKt();
+    method public static inline <N, T> T! cache(androidx.compose.Composer<N>, boolean valid = true, kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T> T! escapeCompose(kotlin.jvm.functions.Function1<? super androidx.compose.NullCompilationScope,? extends T> block);
+    method public static <N> Object? nextValue(androidx.compose.Composer<N>);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1> V! remember(androidx.compose.Composer<N>, P1? p1, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V, P1, P2, P3, P4> V! remember(androidx.compose.Composer<N>, P1? p1, P2? p2, P3? p3, P4? p4, kotlin.jvm.functions.Function0<? extends V> block);
+    method public static <N, V> V! remember(androidx.compose.Composer<N>, Object![]? args, kotlin.jvm.functions.Function0<? extends V> block);
+    field public static final int DEFAULT_SLOT_ACTIONS_SIZE = 16; // 0x10
+    field public static final int DEFAULT_SLOT_KEYS_SIZE = 8; // 0x8
+  }
+
+  public final class ComposerUpdater<N, T extends N> {
+    ctor public ComposerUpdater(androidx.compose.Composer<N> composer, T! node);
+    method public androidx.compose.Composer<N> getComposer();
+    method public T! getNode();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void set(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified V> void update(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+  }
+
+  public final class CompositionContext {
+    method public void compose();
+    method public androidx.compose.Component getComponent();
+    method public androidx.compose.Composer<?> getComposer();
+    method public boolean recomposeSync();
+    field public static final androidx.compose.CompositionContext.Companion! Companion;
+  }
+
+  public static final class CompositionContext.Companion {
+    method public androidx.compose.CompositionContext prepare(android.content.Context context, Object root, androidx.compose.Component component, androidx.compose.CompositionReference? compositionReference);
+    method public androidx.compose.CompositionContext prepare(androidx.compose.Component component, androidx.compose.CompositionReference? ambientReference, kotlin.jvm.functions.Function1<? super androidx.compose.Recomposer,? extends androidx.compose.Composer<?>> makeComposer);
+  }
+
+  public interface CompositionLifecycleObserver {
+    method public void onEnter();
+    method public void onLeave();
+  }
+
+  public interface CompositionReference {
+    method public <T> T! getAmbient(androidx.compose.Ambient<T> key);
+    method public void invalidate(boolean sync);
+    method public <T> void invalidateConsumers(androidx.compose.Ambient<T> key);
+    method public <N> void registerComposer(androidx.compose.Composer<N> composer);
+  }
+
+  @androidx.compose.EffectsDsl public final class Effect<T> {
+    method @androidx.compose.annotations.Hide public Object constructKey(int key);
+    method public androidx.compose.Composer<?> getContext();
+    method @androidx.compose.annotations.Hide public T! resolve(androidx.compose.Composer<?> composerContext, int key = sourceLocation());
+    method public void setContext(androidx.compose.Composer<?> p);
+    method public operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+    property public final androidx.compose.Composer<?> context;
+    field @androidx.compose.annotations.Hide public androidx.compose.Composer<?> context;
+  }
+
+  @kotlin.DslMarker public @interface EffectsDsl {
+  }
+
+  public final class EffectsKt {
+    ctor public EffectsKt();
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> ambient(androidx.compose.Ambient<T> key);
+    method public static androidx.compose.Effect<androidx.compose.CompositionReference> compositionReference();
+    method public static <T> androidx.compose.Effect<T> effectOf(kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method public static androidx.compose.Effect<kotlin.jvm.functions.Function0<kotlin.Unit>> getInvalidate();
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> key(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> key(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> key(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.Effect<T>,? extends T> block);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> memo(V1? v1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> memo(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> memo(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> model(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<T> modelFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<T> modelFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<T> modelFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onActive(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <V1, V2> androidx.compose.Effect<kotlin.Unit> onPreCommit(V1? v1, V2? v2, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static androidx.compose.Effect<kotlin.Unit> onPreCommit(Object![]? inputs, kotlin.jvm.functions.Function1<? super androidx.compose.CommitScope,kotlin.Unit> callback);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> state(kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T, V1, V2> androidx.compose.Effect<androidx.compose.State<T>> stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
+    method @CheckResult(suggest="+") public static <T> androidx.compose.Effect<androidx.compose.State<T>> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
+    method public static operator <T> T! unaryPlus(androidx.compose.Effect<T>);
+  }
+
+  public interface Emittable {
+    method public void emitInsertAt(int index, androidx.compose.Emittable instance);
+    method public void emitMove(int from, int to, int count);
+    method public void emitRemoveAt(int index, int count);
+  }
+
+  public final class ExpectKt {
+    ctor public ExpectKt();
+    method public static <T> androidx.compose.ThreadLocal<T> ThreadLocal();
+  }
+
+  public final class FrameManager {
+    method public void ensureStarted();
+    method public <T> T! framed(kotlin.jvm.functions.Function0<? extends T> block);
+    method public <T> T! isolated(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void nextFrame();
+    method public <T> T! unframed(kotlin.jvm.functions.Function0<? extends T> block);
+    field public static final androidx.compose.FrameManager! INSTANCE;
+  }
+
+  public final class Handler {
+    ctor public Handler(android.os.Looper looper);
+    method public android.os.Handler getHandler();
+    method public boolean postAtFrontOfQueue(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    property public final android.os.Handler handler;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface HiddenAttribute {
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Immutable {
+  }
+
+  public final class JoinedKeyKt {
+    ctor public JoinedKeyKt();
+    method public static boolean isJoinedKey(Object? key);
+    method public static Object? joinedKeyLeft(Object? key);
+    method public static Object? joinedKeyRight(Object? key);
+  }
+
+  public final class KeyInfo {
+    ctor public KeyInfo(Object key, int location, int nodes, int index);
+    method public int getIndex();
+    method public Object getKey();
+    method public int getLocation();
+    method public int getNodes();
+  }
+
+  public final class KeyKt {
+    ctor public KeyKt();
+    method @androidx.compose.Composable public static void Key(@androidx.compose.Pivotal Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class KeySourceInfoKt {
+    ctor public KeySourceInfoKt();
+    method public static String? keySourceInfoOf(Object key);
+  }
+
+  public final class LooperWrapper {
+    method public android.os.Looper getMainLooper();
+    field public static final androidx.compose.LooperWrapper! INSTANCE;
+  }
+
+  @androidx.compose.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=AnnotationTarget.CLASS) public @interface Model {
+  }
+
+  public final class NullCompilationScope {
+    method public kotlin.Unit getComposer();
+    property public final kotlin.Unit composer;
+    field public static final androidx.compose.NullCompilationScope! INSTANCE;
+  }
+
+  public final class ObserveKt {
+    ctor public ObserveKt();
+    method @androidx.compose.Composable public static void Observe(kotlin.jvm.functions.Function0<kotlin.Unit> body);
+  }
+
+  public final class ObserverMap<K, V> {
+    ctor public ObserverMap();
+    method public void add(K key, V value);
+    method public void clear();
+    method public void clearValues(kotlin.jvm.functions.Function1<? super V,java.lang.Boolean> predicate);
+    method public boolean contains(K key, V value);
+    method public operator java.util.List<V> get(Iterable<? extends K> keys);
+    method public java.util.List<V> remove(K key);
+    method public void remove(K key, V value);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Target(allowedTargets={AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION}) public @interface Pivotal {
+  }
+
+  public final class RecomposeKt {
+    ctor public RecomposeKt();
+    method @androidx.compose.Composable public static void Recompose(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> body);
+  }
+
+  public abstract class Recomposer {
+    ctor public Recomposer();
+    method protected final void dispatchRecomposes();
+    method public abstract void recomposeSync();
+    method protected abstract void scheduleChangesDispatch();
+    field public static final androidx.compose.Recomposer.Companion! Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public androidx.compose.Recomposer current();
+    method public boolean hasPendingChanges();
+  }
+
+  public final class RecomposerKt {
+    ctor public RecomposerKt();
+  }
+
+  public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public class SlotEditor {
+    method public final Object? get(androidx.compose.Anchor anchor);
+    method public final Object? get(int index);
+    method public final int getCurrent();
+    method public final int getGroupSize();
+    method public final int getNodeIndex();
+    method public final int getParentIndex();
+    method public final int getParentNodes();
+    method public final androidx.compose.SlotTable getTable();
+    method public final int groupSize(int index);
+    method public final boolean isGroup();
+    method public final boolean isGroup(int index);
+    method public final boolean isNode();
+    method public final void setCurrent(int p);
+    property public final int current;
+    property public final int groupSize;
+    property public final boolean isGroup;
+    property public final boolean isNode;
+    property public final int nodeIndex;
+    property public final int parentIndex;
+    property public final int parentNodes;
+  }
+
+  public final class SlotReader extends androidx.compose.SlotEditor {
+    method public void beginEmpty();
+    method public void close();
+    method public void endEmpty();
+    method public int endGroup();
+    method public int endNode();
+    method public java.util.List<androidx.compose.KeyInfo> extractKeys();
+    method public Object? get();
+    method public Object! getGroupKey();
+    method public boolean getInEmpty();
+    method public Object groupKey(int index);
+    method public boolean isGroupEnd();
+    method public Object? next();
+    method public void previous();
+    method public void reportUncertainNodeCount();
+    method public int skipEnclosingGroup();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    property public final Object! groupKey;
+    property public final boolean inEmpty;
+    property public final boolean isGroupEnd;
+  }
+
+  public final class SlotTable {
+    ctor public SlotTable(internal Object![] slots);
+    ctor public SlotTable();
+    method public int getSize();
+    method public androidx.compose.SlotReader openReader();
+    method public androidx.compose.SlotWriter openWriter();
+    method public <T> T! read(kotlin.jvm.functions.Function1<? super androidx.compose.SlotReader,? extends T> block);
+    method public <T> T! write(kotlin.jvm.functions.Function1<? super androidx.compose.SlotWriter,? extends T> block);
+    property public final int size;
+    field public static final androidx.compose.SlotTable.Companion! Companion;
+  }
+
+  public static final class SlotTable.Companion {
+    method public Object getEMPTY();
+    property public final Object EMPTY;
+  }
+
+  public final class SlotTableKt {
+    ctor public SlotTableKt();
+  }
+
+  public final class SlotWriter extends androidx.compose.SlotEditor {
+    method public androidx.compose.Anchor anchor(int index = current);
+    method public void beginInsert();
+    method public void close();
+    method public int endGroup();
+    method public void endInsert();
+    method public int endNode();
+    method public java.util.Iterator<java.lang.Object> groupSlots();
+    method public void moveGroup(int offset);
+    method public void previous();
+    method public boolean removeGroup();
+    method public void set(Object? value);
+    method public Object? skip();
+    method public int skipGroup();
+    method public int skipNode();
+    method public void startGroup(Object key);
+    method public void startNode(Object key);
+    method public Object? update(Object? value);
+  }
+
+  public final class SourceLocationKt {
+    ctor public SourceLocationKt();
+    method public static inline int sourceLocation();
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS}) public @interface StableMarker {
+  }
+
+  @androidx.compose.Model public final class State<T> implements androidx.compose.frames.Framed {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public T! getValue();
+    method public operator T! getValue(Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method @androidx.compose.annotations.Hide public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public void setValue(T? value);
+    method public operator void setValue(Object? thisObj, kotlin.reflect.KProperty<?> property, T? next);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public final T! value;
+  }
+
+  public class ThreadLocal<T> extends java.lang.ThreadLocal<T> {
+    ctor public ThreadLocal(kotlin.jvm.functions.Function0<? extends T> initialValue);
+  }
+
+  public final class Trace {
+    method public void beginSection(String name);
+    method public void endSection();
+    field public static final androidx.compose.Trace! INSTANCE;
+  }
+
+  public final class TraceKt {
+    ctor public TraceKt();
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={AnnotationTarget.TYPE, AnnotationTarget.TYPE_PARAMETER}) public @interface UnionType {
+    method public abstract Class<?>[] types();
+  }
+
+  public final class ViewAdapters {
+    ctor public ViewAdapters();
+    method public Object? adapt(Object parent, Object child);
+    method public boolean register(kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+  }
+
+  public final class ViewComposer extends androidx.compose.Composer<java.lang.Object> {
+    ctor public ViewComposer(Object root, android.content.Context context, androidx.compose.Recomposer recomposer, androidx.compose.ViewAdapters? adapters);
+    method public androidx.compose.ViewAdapters? getAdapters();
+    method public android.content.Context getContext();
+    method public Object getRoot();
+  }
+
+  public final class ViewComposerCommonKt {
+    ctor public ViewComposerCommonKt();
+  }
+
+  public final class ViewComposerKt {
+    ctor public ViewComposerKt();
+    method public static androidx.compose.ViewComposition! getComposer();
+    method public static Boolean? registerAdapter(androidx.compose.ViewComposition, kotlin.jvm.functions.Function2<java.lang.Object,java.lang.Object,?> adapter);
+    method public static <T> T! runWithCurrent(androidx.compose.Composer<?>, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  @androidx.compose.EffectsDsl public final class ViewComposition {
+    ctor public ViewComposition(androidx.compose.ViewComposer composer);
+    method public inline void call(Object key, kotlin.jvm.functions.Function1<? super androidx.compose.ViewValidator,java.lang.Boolean> invalid, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public inline <T> void call(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function2<? super androidx.compose.ViewValidator,? super T,java.lang.Boolean> invalid, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T extends android.view.View> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends android.view.ViewGroup> void emit(Object key, kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update);
+    method public inline <T extends androidx.compose.Emittable> void emit(Object key, kotlin.jvm.functions.Function0<? extends T> ctor, kotlin.jvm.functions.Function1<? super androidx.compose.ComposerUpdater<java.lang.Object,T>,kotlin.Unit> update, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+    method public androidx.compose.ScopeUpdateScope? endRestartGroup();
+    method public inline <T> T! expr(Object key, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.ViewComposer getComposer();
+    method public inline Object joinKey(Object left, Object? right);
+    method public void observe(Object key, kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>,kotlin.Unit> block);
+    method public void startRestartGroup(Object key);
+    method public inline operator <V> V! unaryPlus(androidx.compose.Effect<V>);
+  }
+
+  public final class ViewValidator {
+    ctor public ViewValidator(androidx.compose.Composer<?> composer);
+    method public boolean changed(int value);
+    method public <T> boolean changed(T? value);
+    method public <T> boolean changedUnchecked(T? value);
+    method public androidx.compose.Composer<?> getComposer();
+    method public operator boolean plus(boolean, boolean other);
+    method public inline boolean set(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean set(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean setUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline boolean update(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> block);
+    method public inline <reified T> boolean update(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline <T> boolean updateUnchecked(T? value, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public boolean updated(int value);
+    method public <T> boolean updated(T? value);
+  }
+
+}
+
+package androidx.compose.adapters {
+
+  public final class ComposeViewAdapter implements androidx.compose.adapters.ViewAdapter {
+    ctor public ComposeViewAdapter();
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public inline <T extends androidx.compose.adapters.ViewAdapter> T get(int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public java.util.List<androidx.compose.adapters.ViewAdapter> getAdapters();
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public final java.util.List<androidx.compose.adapters.ViewAdapter> adapters;
+    property public int id;
+  }
+
+  public interface ViewAdapter {
+    method public void didInsert(android.view.View view, android.view.ViewGroup parent);
+    method public void didUpdate(android.view.View view, android.view.ViewGroup parent);
+    method public int getId();
+    method public void willInsert(android.view.View view, android.view.ViewGroup parent);
+    property public abstract int id;
+  }
+
+  public final class ViewAdapterKt {
+    ctor public ViewAdapterKt();
+    method public static inline <T extends androidx.compose.adapters.ViewAdapter> T getOrAddAdapter(android.view.View, int id, kotlin.jvm.functions.Function0<? extends T> factory);
+    method public static androidx.compose.adapters.ComposeViewAdapter getViewAdapter(android.view.View);
+  }
+
+}
+
+package androidx.compose.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Hide {
+  }
+
+}
+
+package androidx.compose.frames {
+
+  public abstract class AbstractRecord implements androidx.compose.frames.Record {
+    ctor public AbstractRecord();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public int frameId;
+    property public androidx.compose.frames.Record? next;
+  }
+
+  public final class Frame {
+    method public int getId();
+    method public boolean getReadonly();
+    method public boolean hasPendingChanges();
+    property public final boolean readonly;
+  }
+
+  public final class FrameAborted extends java.lang.RuntimeException {
+    ctor public FrameAborted(androidx.compose.frames.Frame frame);
+    method public androidx.compose.frames.Frame getFrame();
+  }
+
+  public final class FrameContainersKt {
+    ctor public FrameContainersKt();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf();
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T? element);
+    method public static <T> androidx.compose.frames.ModelList<T> modelListOf(T?... elements);
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf();
+    method public static <K, V> androidx.compose.frames.ModelMap<K,V> modelMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+  }
+
+  public final class FrameIdSetKt {
+    ctor public FrameIdSetKt();
+  }
+
+  public interface Framed {
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    property public abstract androidx.compose.frames.Record firstFrameRecord;
+  }
+
+  public final class FramesKt {
+    ctor public FramesKt();
+    method public static kotlin.Unit? _created(androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _readable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static androidx.compose.frames.Record _writable(androidx.compose.frames.Record r, androidx.compose.frames.Framed framed);
+    method public static void abort();
+    method public static void abort(androidx.compose.frames.Frame frame);
+    method public static void abortHandler();
+    method public static void abortHandler(androidx.compose.frames.Frame frame);
+    method public static void commit();
+    method public static void commit(androidx.compose.frames.Frame frame);
+    method public static kotlin.Unit? commitHandler();
+    method public static androidx.compose.frames.Frame currentFrame();
+    method public static boolean getInFrame();
+    method public static void observeAllReads(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> readObserver, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static androidx.compose.frames.Frame open(boolean readOnly = false);
+    method public static androidx.compose.frames.Frame open(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver = null, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver = null);
+    method public static <T extends androidx.compose.frames.Record> T readable(T, androidx.compose.frames.Framed framed);
+    method public static kotlin.jvm.functions.Function0<kotlin.Unit> registerCommitObserver(kotlin.jvm.functions.Function1<? super java.util.Set<?>,kotlin.Unit> observer);
+    method public static void restore(androidx.compose.frames.Frame frame);
+    method public static androidx.compose.frames.Frame suspend();
+    method public static boolean wasModified(Object value);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed);
+    method public static <T extends androidx.compose.frames.Record> T writable(T, androidx.compose.frames.Framed framed, androidx.compose.frames.Frame frame);
+  }
+
+  public final class ModelList<T> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableList java.util.List<T> {
+    ctor public ModelList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public int size;
+  }
+
+  public final class ModelMap<K, V> implements androidx.compose.frames.Framed kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> {
+    ctor public ModelMap();
+    method public void clear();
+    method public boolean containsKey(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.frames.Record getFirstFrameRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependFrameRecord(androidx.compose.frames.Record value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.frames.Record firstFrameRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public interface Record {
+    method public void assign(androidx.compose.frames.Record value);
+    method public androidx.compose.frames.Record create();
+    method public int getFrameId();
+    method public androidx.compose.frames.Record? getNext();
+    method public void setFrameId(int p);
+    method public void setNext(androidx.compose.frames.Record? p);
+    property public abstract int frameId;
+    property public abstract androidx.compose.frames.Record? next;
+  }
+
+}
+
diff --git a/core/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java b/core/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java
index d803f53..eefd127 100644
--- a/core/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java
+++ b/core/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java
@@ -49,7 +49,7 @@
         final TestActivityWithLifecycle firstActivity = mActivityTestRule.getActivity();
 
         // Wait and assert that the Activity is resumed
-        waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+        waitUntilState(firstActivity, Lifecycle.State.RESUMED);
 
         // Now recreate() the activity
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -59,7 +59,7 @@
             }
         });
         // Wait until the original activity is destroyed
-        waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.DESTROYED);
+        waitUntilState(firstActivity, Lifecycle.State.DESTROYED);
 
         // Assert that the recreated Activity is resumed
         final TestActivityWithLifecycle newActivity = mActivityTestRule.getActivity();
@@ -73,7 +73,7 @@
         final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
 
         // Assert that the activity is resumed currently
-        waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+        waitUntilState(firstActivity, Lifecycle.State.RESUMED);
 
         // Start a new Activity, so that the first Activity goes into the background
         final Intent intent = new Intent(firstActivity, TestActivityWithLifecycle.class);
@@ -82,8 +82,8 @@
                 (TestActivityWithLifecycle) instrumentation.startActivitySync(intent);
 
         // Now wait until the new activity is resumed, and the original activity is stopped
-        waitUntilState(fgActivity, mActivityTestRule, Lifecycle.State.RESUMED);
-        waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.CREATED);
+        waitUntilState(fgActivity, Lifecycle.State.RESUMED);
+        waitUntilState(firstActivity, Lifecycle.State.CREATED);
 
         // Now recreate() the stopped activity
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -95,17 +95,17 @@
 
         // Wait and assert that the original activity in the background is destroyed
         // (since it is being recreated)
-        waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.DESTROYED);
+        waitUntilState(firstActivity, Lifecycle.State.DESTROYED);
 
         // Now finish the foreground activity and wait until it is destroyed,
         // allowing the recreated activity to come to the foreground
         fgActivity.finish();
-        waitUntilState(fgActivity, mActivityTestRule, Lifecycle.State.DESTROYED);
+        waitUntilState(fgActivity, Lifecycle.State.DESTROYED);
 
         // Assert that the activity was recreated and is resumed
         final TestActivityWithLifecycle recreatedActivity = mActivityTestRule.getActivity();
         assertNotSame(firstActivity, recreatedActivity);
         // Assert that the recreated Activity is resumed
-        waitUntilState(recreatedActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+        waitUntilState(recreatedActivity, Lifecycle.State.RESUMED);
     }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
index a6428fb..89852add 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
@@ -93,6 +93,7 @@
                     + Integer.toHexString(id) + " fname=" + fname
                     + " existing=" + fragment);
         }
+        FragmentStateManager fragmentStateManager;
         if (fragment == null) {
             fragment = mFragmentManager.getFragmentFactory().instantiate(
                     context.getClassLoader(), fname);
@@ -105,8 +106,8 @@
             fragment.mHost = mFragmentManager.getHost();
             fragment.onInflate(mFragmentManager.getHost().getContext(), attrs,
                     fragment.mSavedFragmentState);
+            fragmentStateManager = mFragmentManager.createOrGetFragmentStateManager(fragment);
             mFragmentManager.addFragment(fragment);
-            mFragmentManager.moveToState(fragment);
 
         } else if (fragment.mInLayout) {
             // A fragment already exists and it is not one we restored from
@@ -124,17 +125,14 @@
             // Give the Fragment the attributes to initialize itself.
             fragment.onInflate(mFragmentManager.getHost().getContext(), attrs,
                     fragment.mSavedFragmentState);
+            fragmentStateManager = mFragmentManager.createOrGetFragmentStateManager(fragment);
         }
 
-        // If we haven't finished entering the CREATED state ourselves yet,
-        // push the inflated child fragment along. This will ensureInflatedFragmentView
-        // at the right phase of the lifecycle so that we will have mView populated
-        // for compliant fragments below.
-        if (mFragmentManager.mCurState < Fragment.CREATED && fragment.mFromLayout) {
-            mFragmentManager.moveToState(fragment, Fragment.CREATED);
-        } else {
-            mFragmentManager.moveToState(fragment);
-        }
+        // The <fragment> tag is the one case where we:
+        // 1) Move the Fragment to CREATED even if the FragmentManager isn't yet CREATED
+        fragmentStateManager.moveToExpectedState();
+        // 2) Create the Fragment's view despite not always moving to ACTIVITY_CREATED
+        fragmentStateManager.ensureInflatedView();
 
         if (fragment.mView == null) {
             throw new IllegalStateException("Fragment " + fname
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
index 50528b3..00189f5 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
@@ -218,7 +218,6 @@
     void moveToExpectedState() {
         int newState;
         while ((newState = computeExpectedState()) != mFragment.mState) {
-            // TODO call ensureInflatedView()
             if (newState > mFragment.mState) {
                 // Moving upward
                 int nextStep = mFragment.mState + 1;
@@ -231,6 +230,7 @@
                         create();
                         break;
                     case Fragment.ACTIVITY_CREATED:
+                        ensureInflatedView();
                         createView();
                         activityCreated();
                         restoreViewState();
diff --git a/gradlew b/gradlew
index 395fc82..6233fe3 100755
--- a/gradlew
+++ b/gradlew
@@ -12,6 +12,7 @@
     mkdir -p "$OUT_DIR"
     OUT_DIR="$(cd $OUT_DIR && pwd)"
     export GRADLE_USER_HOME="$OUT_DIR/.gradle"
+    export TMPDIR=$OUT_DIR
 else
     SCRIPT_PATH="$(cd $(dirname $0) && pwd)"
     CHECKOUT_ROOT="$(cd $SCRIPT_PATH/../.. && pwd)"
@@ -205,8 +206,11 @@
 if [ "$GRADLE_USER_HOME" != "" ]; then
     HOME_SYSTEM_PROPERTY_ARGUMENT="-Duser.home=$GRADLE_USER_HOME"
 fi
+if [ "$TMPDIR" != "" ]; then
+  TMPDIR_ARG="-Djava.io.tmpdir=$TMPDIR"
+fi
 
-if "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT "$@"; then
+if "$JAVACMD" "${JVM_OPTS[@]}" $TMPDIR_ARG -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT $TMPDIR_ARG "$@"; then
   exit 0
 else
   # Print AndroidX-specific help message if build fails
diff --git a/testutils/testutils-runtime/src/main/java/androidx/testutils/LifecycleOwnerUtils.java b/testutils/testutils-runtime/src/main/java/androidx/testutils/LifecycleOwnerUtils.java
index 4acd19e..2653e7d 100644
--- a/testutils/testutils-runtime/src/main/java/androidx/testutils/LifecycleOwnerUtils.java
+++ b/testutils/testutils-runtime/src/main/java/androidx/testutils/LifecycleOwnerUtils.java
@@ -46,26 +46,19 @@
     };
 
     /**
-     * Waits until the the Activity current held the ActivityTestRule has the specified
-     * {@link androidx.lifecycle.Lifecycle.State}. If the owner has not hit that state within a
-     * suitable time period, it asserts that the current state equals the given state.
-     */
-    public static <T extends Activity & LifecycleOwner> void waitUntilState(
-            final @NonNull ActivityTestRule<T> activityRule,
-            final @NonNull Lifecycle.State state) throws Throwable {
-        waitUntilState(activityRule.getActivity(), activityRule, state);
-    }
-
-    /**
      * Waits until the given {@link LifecycleOwner} has the specified
      * {@link androidx.lifecycle.Lifecycle.State}. If the owner has not hit that state within a
      * suitable time period, it asserts that the current state equals the given state.
      */
     public static void waitUntilState(final @NonNull LifecycleOwner owner,
-            final @NonNull ActivityTestRule<?> activityRule,
             final @NonNull Lifecycle.State state) throws Throwable {
+        final Lifecycle.State currentState = owner.getLifecycle().getCurrentState();
+        if (currentState == state) {
+            return;
+        }
+
         final CountDownLatch latch = new CountDownLatch(1);
-        activityRule.runOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 final Lifecycle.State currentState = owner.getLifecycle().getCurrentState();
@@ -78,14 +71,14 @@
                     public void onStateChanged(@NonNull LifecycleOwner provider,
                             @NonNull Lifecycle.Event event) {
                         if (provider.getLifecycle().getCurrentState() == state) {
-                            latch.countDown();
                             provider.getLifecycle().removeObserver(this);
+                            latch.countDown();
                         }
                     }
                 });
             }
         });
-        final boolean latchResult = latch.await(30, TimeUnit.SECONDS);
+        final boolean latchResult = latch.await(15, TimeUnit.SECONDS);
 
         assertThat("Expected " + state + " never happened to " + owner
                         + ". Current state:" + owner.getLifecycle().getCurrentState(),
@@ -93,19 +86,29 @@
                 is(true));
 
         // wait for another loop to ensure all observers are called
-        activityRule.runOnUiThread(DO_NOTHING);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(DO_NOTHING);
     }
 
     /**
      * Waits until the given the current {@link Activity} has been recreated, and
      * the new instance is resumed.
      */
-    @SuppressWarnings("unchecked")
     @NonNull
     public static <T extends Activity & LifecycleOwner> T waitForRecreation(
             @NonNull final ActivityTestRule<T> activityRule
     ) throws Throwable {
-        return waitForRecreation(activityRule.getActivity(), activityRule, null);
+        return waitForRecreation(activityRule.getActivity());
+    }
+
+    /**
+     * Waits until the given the given {@link Activity} has been recreated, and
+     * the new instance is resumed.
+     */
+    @NonNull
+    public static <T extends Activity & LifecycleOwner> T waitForRecreation(
+            @NonNull final T activity
+    ) throws Throwable {
+        return waitForRecreation(activity, null);
     }
 
     /**
@@ -116,39 +119,42 @@
     @NonNull
     public static <T extends Activity & LifecycleOwner> T waitForRecreation(
             @NonNull final T activity,
-            @NonNull final ActivityTestRule<?> activityRule,
             @Nullable final Runnable actionOnUiThread
     ) throws Throwable {
-        Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
-                activity.getClass().getCanonicalName(), null, false);
+        final Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
+                activity.getClass().getName(), null, false);
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         instrumentation.addMonitor(monitor);
 
         if (actionOnUiThread != null) {
-            activityRule.runOnUiThread(actionOnUiThread);
+            instrumentation.runOnMainSync(actionOnUiThread);
         }
 
         T result;
 
         // this guarantee that we will reinstall monitor between notifications about onDestroy
         // and onCreate
-        //noinspection SynchronizationOnLocalVariableOrMethodParameter
-        synchronized (monitor) {
-            do {
-                // The documentation says "Block until an Activity is created
-                // that matches this monitor." This statement is true, but there are some other
-                // true statements like: "Block until an Activity is destroyed" or
-                // "Block until an Activity is resumed"...
-                // this call will release synchronization monitor's monitor
-                result = (T) monitor.waitForActivityWithTimeout(TIMEOUT_MS);
-                if (result == null) {
-                    throw new RuntimeException("Timeout. Activity was not recreated.");
-                }
-            } while (result == activity);
+        // noinspection SynchronizationOnLocalVariableOrMethodParameter
+        try {
+            synchronized (monitor) {
+                do {
+                    // The documentation says "Block until an Activity is created
+                    // that matches this monitor." This statement is true, but there are some other
+                    // true statements like: "Block until an Activity is destroyed" or
+                    // "Block until an Activity is resumed"...
+                    // this call will release synchronization monitor's monitor
+                    result = (T) monitor.waitForActivityWithTimeout(TIMEOUT_MS);
+                    if (result == null) {
+                        throw new RuntimeException("Timeout. Activity was not recreated.");
+                    }
+                } while (result == activity);
+            }
+        } finally {
+            instrumentation.removeMonitor(monitor);
         }
 
         // Finally wait for the recreated Activity to be resumed
-        waitUntilState(result, activityRule, Lifecycle.State.RESUMED);
+        waitUntilState(result, Lifecycle.State.RESUMED);
 
         return result;
     }
diff --git a/ui/ui-core/api/0.1.0-dev04.txt b/ui/ui-core/api/0.1.0-dev04.txt
index b39c0a1..6825a5a 100644
--- a/ui/ui-core/api/0.1.0-dev04.txt
+++ b/ui/ui-core/api/0.1.0-dev04.txt
@@ -1515,12 +1515,6 @@
     property public abstract int width;
   }
 
-  public enum ImageByteFormat {
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat png;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawRgba;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawUnmodified;
-  }
-
   public enum ImageConfig {
     enum_constant public static final androidx.ui.graphics.ImageConfig Alpha8;
     enum_constant public static final androidx.ui.graphics.ImageConfig Argb8888;
@@ -1533,13 +1527,6 @@
     ctor public ImageKt();
   }
 
-  public enum ImageRepeat {
-    enum_constant public static final androidx.ui.graphics.ImageRepeat noRepeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatX;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatY;
-  }
-
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
     method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, androidx.ui.core.Px startX, androidx.ui.core.Px startY, androidx.ui.core.Px endX, androidx.ui.core.Px endY, androidx.ui.graphics.TileMode tileMode);
   }
@@ -2161,43 +2148,6 @@
 
 package androidx.ui.vectormath64 {
 
-  public final class Matrix2 {
-    ctor public Matrix2(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    ctor public Matrix2();
-    ctor public Matrix2(androidx.ui.vectormath64.Matrix2 m);
-    method public androidx.ui.vectormath64.Vector2 component1();
-    method public androidx.ui.vectormath64.Vector2 component2();
-    method public androidx.ui.vectormath64.Matrix2 copy(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    method public operator androidx.ui.vectormath64.Matrix2 dec();
-    method public operator androidx.ui.vectormath64.Matrix2 div(float v);
-    method public operator androidx.ui.vectormath64.Vector2 get(int column);
-    method public operator float get(int column, int row);
-    method public operator androidx.ui.vectormath64.Vector2 get(androidx.ui.vectormath64.MatrixColumn column);
-    method public operator float get(androidx.ui.vectormath64.MatrixColumn column, int row);
-    method public inline java.util.List<java.lang.Float> getM2storage();
-    method public androidx.ui.vectormath64.Vector2 getX();
-    method public androidx.ui.vectormath64.Vector2 getY();
-    method public operator androidx.ui.vectormath64.Matrix2 inc();
-    method public operator androidx.ui.vectormath64.Matrix2 minus(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 plus(float v);
-    method public operator void set(int column, androidx.ui.vectormath64.Vector2 v);
-    method public operator void set(int column, int row, float v);
-    method public void setX(androidx.ui.vectormath64.Vector2 p);
-    method public void setY(androidx.ui.vectormath64.Vector2 p);
-    method public operator androidx.ui.vectormath64.Matrix2 times(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 times(androidx.ui.vectormath64.Matrix2 m);
-    method public operator androidx.ui.vectormath64.Vector2 times(androidx.ui.vectormath64.Vector2 v);
-    method public float[] toFloatArray();
-    method public operator androidx.ui.vectormath64.Matrix2 unaryMinus();
-    property public final inline java.util.List<java.lang.Float> m2storage;
-    field public static final androidx.ui.vectormath64.Matrix2.Companion! Companion;
-  }
-
-  public static final class Matrix2.Companion {
-    method public androidx.ui.vectormath64.Matrix2 identity();
-    method public androidx.ui.vectormath64.Matrix2 of(float... a);
-  }
-
   public final class Matrix3 {
     ctor public Matrix3(androidx.ui.vectormath64.Vector3 x, androidx.ui.vectormath64.Vector3 y, androidx.ui.vectormath64.Vector3 z);
     ctor public Matrix3();
@@ -2360,7 +2310,6 @@
     method public static androidx.ui.vectormath64.Matrix4 scale(androidx.ui.vectormath64.Matrix4 m);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Vector3 t);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Matrix4 m);
-    method public static androidx.ui.vectormath64.Matrix2 transpose(androidx.ui.vectormath64.Matrix2 m);
     method public static androidx.ui.vectormath64.Matrix3 transpose(androidx.ui.vectormath64.Matrix3 m);
     method public static androidx.ui.vectormath64.Matrix4 transpose(androidx.ui.vectormath64.Matrix4 m);
   }
@@ -2368,10 +2317,7 @@
   public final class ScalarKt {
     ctor public ScalarKt();
     method public static inline float degrees(float v);
-    method public static inline float fract(float v);
-    method public static inline float mix(float a, float b, float x);
     method public static inline float radians(float v);
-    method public static inline float sqr(float v);
     field public static final float FOUR_PI = 12.566371f;
     field public static final float HALF_PI = 1.5707964f;
     field public static final float INV_FOUR_PI = 0.07957747f;
@@ -2688,12 +2634,6 @@
     method public static inline operator androidx.ui.vectormath64.Vector2 minus(float, androidx.ui.vectormath64.Vector2 v);
     method public static inline operator androidx.ui.vectormath64.Vector3 minus(float, androidx.ui.vectormath64.Vector3 v);
     method public static inline operator androidx.ui.vectormath64.Vector4 minus(float, androidx.ui.vectormath64.Vector4 v);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, androidx.ui.vectormath64.Vector2 x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, androidx.ui.vectormath64.Vector3 x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, androidx.ui.vectormath64.Vector4 x);
     method public static androidx.ui.vectormath64.Vector2 normalize(androidx.ui.vectormath64.Vector2 v);
     method public static androidx.ui.vectormath64.Vector3 normalize(androidx.ui.vectormath64.Vector3 v);
     method public static androidx.ui.vectormath64.Vector4 normalize(androidx.ui.vectormath64.Vector4 v);
diff --git a/ui/ui-core/api/current.txt b/ui/ui-core/api/current.txt
index b39c0a1..6825a5a 100644
--- a/ui/ui-core/api/current.txt
+++ b/ui/ui-core/api/current.txt
@@ -1515,12 +1515,6 @@
     property public abstract int width;
   }
 
-  public enum ImageByteFormat {
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat png;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawRgba;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawUnmodified;
-  }
-
   public enum ImageConfig {
     enum_constant public static final androidx.ui.graphics.ImageConfig Alpha8;
     enum_constant public static final androidx.ui.graphics.ImageConfig Argb8888;
@@ -1533,13 +1527,6 @@
     ctor public ImageKt();
   }
 
-  public enum ImageRepeat {
-    enum_constant public static final androidx.ui.graphics.ImageRepeat noRepeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatX;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatY;
-  }
-
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
     method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, androidx.ui.core.Px startX, androidx.ui.core.Px startY, androidx.ui.core.Px endX, androidx.ui.core.Px endY, androidx.ui.graphics.TileMode tileMode);
   }
@@ -2161,43 +2148,6 @@
 
 package androidx.ui.vectormath64 {
 
-  public final class Matrix2 {
-    ctor public Matrix2(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    ctor public Matrix2();
-    ctor public Matrix2(androidx.ui.vectormath64.Matrix2 m);
-    method public androidx.ui.vectormath64.Vector2 component1();
-    method public androidx.ui.vectormath64.Vector2 component2();
-    method public androidx.ui.vectormath64.Matrix2 copy(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    method public operator androidx.ui.vectormath64.Matrix2 dec();
-    method public operator androidx.ui.vectormath64.Matrix2 div(float v);
-    method public operator androidx.ui.vectormath64.Vector2 get(int column);
-    method public operator float get(int column, int row);
-    method public operator androidx.ui.vectormath64.Vector2 get(androidx.ui.vectormath64.MatrixColumn column);
-    method public operator float get(androidx.ui.vectormath64.MatrixColumn column, int row);
-    method public inline java.util.List<java.lang.Float> getM2storage();
-    method public androidx.ui.vectormath64.Vector2 getX();
-    method public androidx.ui.vectormath64.Vector2 getY();
-    method public operator androidx.ui.vectormath64.Matrix2 inc();
-    method public operator androidx.ui.vectormath64.Matrix2 minus(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 plus(float v);
-    method public operator void set(int column, androidx.ui.vectormath64.Vector2 v);
-    method public operator void set(int column, int row, float v);
-    method public void setX(androidx.ui.vectormath64.Vector2 p);
-    method public void setY(androidx.ui.vectormath64.Vector2 p);
-    method public operator androidx.ui.vectormath64.Matrix2 times(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 times(androidx.ui.vectormath64.Matrix2 m);
-    method public operator androidx.ui.vectormath64.Vector2 times(androidx.ui.vectormath64.Vector2 v);
-    method public float[] toFloatArray();
-    method public operator androidx.ui.vectormath64.Matrix2 unaryMinus();
-    property public final inline java.util.List<java.lang.Float> m2storage;
-    field public static final androidx.ui.vectormath64.Matrix2.Companion! Companion;
-  }
-
-  public static final class Matrix2.Companion {
-    method public androidx.ui.vectormath64.Matrix2 identity();
-    method public androidx.ui.vectormath64.Matrix2 of(float... a);
-  }
-
   public final class Matrix3 {
     ctor public Matrix3(androidx.ui.vectormath64.Vector3 x, androidx.ui.vectormath64.Vector3 y, androidx.ui.vectormath64.Vector3 z);
     ctor public Matrix3();
@@ -2360,7 +2310,6 @@
     method public static androidx.ui.vectormath64.Matrix4 scale(androidx.ui.vectormath64.Matrix4 m);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Vector3 t);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Matrix4 m);
-    method public static androidx.ui.vectormath64.Matrix2 transpose(androidx.ui.vectormath64.Matrix2 m);
     method public static androidx.ui.vectormath64.Matrix3 transpose(androidx.ui.vectormath64.Matrix3 m);
     method public static androidx.ui.vectormath64.Matrix4 transpose(androidx.ui.vectormath64.Matrix4 m);
   }
@@ -2368,10 +2317,7 @@
   public final class ScalarKt {
     ctor public ScalarKt();
     method public static inline float degrees(float v);
-    method public static inline float fract(float v);
-    method public static inline float mix(float a, float b, float x);
     method public static inline float radians(float v);
-    method public static inline float sqr(float v);
     field public static final float FOUR_PI = 12.566371f;
     field public static final float HALF_PI = 1.5707964f;
     field public static final float INV_FOUR_PI = 0.07957747f;
@@ -2688,12 +2634,6 @@
     method public static inline operator androidx.ui.vectormath64.Vector2 minus(float, androidx.ui.vectormath64.Vector2 v);
     method public static inline operator androidx.ui.vectormath64.Vector3 minus(float, androidx.ui.vectormath64.Vector3 v);
     method public static inline operator androidx.ui.vectormath64.Vector4 minus(float, androidx.ui.vectormath64.Vector4 v);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, androidx.ui.vectormath64.Vector2 x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, androidx.ui.vectormath64.Vector3 x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, androidx.ui.vectormath64.Vector4 x);
     method public static androidx.ui.vectormath64.Vector2 normalize(androidx.ui.vectormath64.Vector2 v);
     method public static androidx.ui.vectormath64.Vector3 normalize(androidx.ui.vectormath64.Vector3 v);
     method public static androidx.ui.vectormath64.Vector4 normalize(androidx.ui.vectormath64.Vector4 v);
diff --git a/ui/ui-core/api/public_plus_experimental_0.1.0-dev04.txt b/ui/ui-core/api/public_plus_experimental_0.1.0-dev04.txt
index b39c0a1..6825a5a 100644
--- a/ui/ui-core/api/public_plus_experimental_0.1.0-dev04.txt
+++ b/ui/ui-core/api/public_plus_experimental_0.1.0-dev04.txt
@@ -1515,12 +1515,6 @@
     property public abstract int width;
   }
 
-  public enum ImageByteFormat {
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat png;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawRgba;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawUnmodified;
-  }
-
   public enum ImageConfig {
     enum_constant public static final androidx.ui.graphics.ImageConfig Alpha8;
     enum_constant public static final androidx.ui.graphics.ImageConfig Argb8888;
@@ -1533,13 +1527,6 @@
     ctor public ImageKt();
   }
 
-  public enum ImageRepeat {
-    enum_constant public static final androidx.ui.graphics.ImageRepeat noRepeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatX;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatY;
-  }
-
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
     method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, androidx.ui.core.Px startX, androidx.ui.core.Px startY, androidx.ui.core.Px endX, androidx.ui.core.Px endY, androidx.ui.graphics.TileMode tileMode);
   }
@@ -2161,43 +2148,6 @@
 
 package androidx.ui.vectormath64 {
 
-  public final class Matrix2 {
-    ctor public Matrix2(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    ctor public Matrix2();
-    ctor public Matrix2(androidx.ui.vectormath64.Matrix2 m);
-    method public androidx.ui.vectormath64.Vector2 component1();
-    method public androidx.ui.vectormath64.Vector2 component2();
-    method public androidx.ui.vectormath64.Matrix2 copy(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    method public operator androidx.ui.vectormath64.Matrix2 dec();
-    method public operator androidx.ui.vectormath64.Matrix2 div(float v);
-    method public operator androidx.ui.vectormath64.Vector2 get(int column);
-    method public operator float get(int column, int row);
-    method public operator androidx.ui.vectormath64.Vector2 get(androidx.ui.vectormath64.MatrixColumn column);
-    method public operator float get(androidx.ui.vectormath64.MatrixColumn column, int row);
-    method public inline java.util.List<java.lang.Float> getM2storage();
-    method public androidx.ui.vectormath64.Vector2 getX();
-    method public androidx.ui.vectormath64.Vector2 getY();
-    method public operator androidx.ui.vectormath64.Matrix2 inc();
-    method public operator androidx.ui.vectormath64.Matrix2 minus(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 plus(float v);
-    method public operator void set(int column, androidx.ui.vectormath64.Vector2 v);
-    method public operator void set(int column, int row, float v);
-    method public void setX(androidx.ui.vectormath64.Vector2 p);
-    method public void setY(androidx.ui.vectormath64.Vector2 p);
-    method public operator androidx.ui.vectormath64.Matrix2 times(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 times(androidx.ui.vectormath64.Matrix2 m);
-    method public operator androidx.ui.vectormath64.Vector2 times(androidx.ui.vectormath64.Vector2 v);
-    method public float[] toFloatArray();
-    method public operator androidx.ui.vectormath64.Matrix2 unaryMinus();
-    property public final inline java.util.List<java.lang.Float> m2storage;
-    field public static final androidx.ui.vectormath64.Matrix2.Companion! Companion;
-  }
-
-  public static final class Matrix2.Companion {
-    method public androidx.ui.vectormath64.Matrix2 identity();
-    method public androidx.ui.vectormath64.Matrix2 of(float... a);
-  }
-
   public final class Matrix3 {
     ctor public Matrix3(androidx.ui.vectormath64.Vector3 x, androidx.ui.vectormath64.Vector3 y, androidx.ui.vectormath64.Vector3 z);
     ctor public Matrix3();
@@ -2360,7 +2310,6 @@
     method public static androidx.ui.vectormath64.Matrix4 scale(androidx.ui.vectormath64.Matrix4 m);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Vector3 t);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Matrix4 m);
-    method public static androidx.ui.vectormath64.Matrix2 transpose(androidx.ui.vectormath64.Matrix2 m);
     method public static androidx.ui.vectormath64.Matrix3 transpose(androidx.ui.vectormath64.Matrix3 m);
     method public static androidx.ui.vectormath64.Matrix4 transpose(androidx.ui.vectormath64.Matrix4 m);
   }
@@ -2368,10 +2317,7 @@
   public final class ScalarKt {
     ctor public ScalarKt();
     method public static inline float degrees(float v);
-    method public static inline float fract(float v);
-    method public static inline float mix(float a, float b, float x);
     method public static inline float radians(float v);
-    method public static inline float sqr(float v);
     field public static final float FOUR_PI = 12.566371f;
     field public static final float HALF_PI = 1.5707964f;
     field public static final float INV_FOUR_PI = 0.07957747f;
@@ -2688,12 +2634,6 @@
     method public static inline operator androidx.ui.vectormath64.Vector2 minus(float, androidx.ui.vectormath64.Vector2 v);
     method public static inline operator androidx.ui.vectormath64.Vector3 minus(float, androidx.ui.vectormath64.Vector3 v);
     method public static inline operator androidx.ui.vectormath64.Vector4 minus(float, androidx.ui.vectormath64.Vector4 v);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, androidx.ui.vectormath64.Vector2 x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, androidx.ui.vectormath64.Vector3 x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, androidx.ui.vectormath64.Vector4 x);
     method public static androidx.ui.vectormath64.Vector2 normalize(androidx.ui.vectormath64.Vector2 v);
     method public static androidx.ui.vectormath64.Vector3 normalize(androidx.ui.vectormath64.Vector3 v);
     method public static androidx.ui.vectormath64.Vector4 normalize(androidx.ui.vectormath64.Vector4 v);
diff --git a/ui/ui-core/api/public_plus_experimental_current.txt b/ui/ui-core/api/public_plus_experimental_current.txt
index b39c0a1..6825a5a 100644
--- a/ui/ui-core/api/public_plus_experimental_current.txt
+++ b/ui/ui-core/api/public_plus_experimental_current.txt
@@ -1515,12 +1515,6 @@
     property public abstract int width;
   }
 
-  public enum ImageByteFormat {
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat png;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawRgba;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawUnmodified;
-  }
-
   public enum ImageConfig {
     enum_constant public static final androidx.ui.graphics.ImageConfig Alpha8;
     enum_constant public static final androidx.ui.graphics.ImageConfig Argb8888;
@@ -1533,13 +1527,6 @@
     ctor public ImageKt();
   }
 
-  public enum ImageRepeat {
-    enum_constant public static final androidx.ui.graphics.ImageRepeat noRepeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatX;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatY;
-  }
-
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
     method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, androidx.ui.core.Px startX, androidx.ui.core.Px startY, androidx.ui.core.Px endX, androidx.ui.core.Px endY, androidx.ui.graphics.TileMode tileMode);
   }
@@ -2161,43 +2148,6 @@
 
 package androidx.ui.vectormath64 {
 
-  public final class Matrix2 {
-    ctor public Matrix2(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    ctor public Matrix2();
-    ctor public Matrix2(androidx.ui.vectormath64.Matrix2 m);
-    method public androidx.ui.vectormath64.Vector2 component1();
-    method public androidx.ui.vectormath64.Vector2 component2();
-    method public androidx.ui.vectormath64.Matrix2 copy(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    method public operator androidx.ui.vectormath64.Matrix2 dec();
-    method public operator androidx.ui.vectormath64.Matrix2 div(float v);
-    method public operator androidx.ui.vectormath64.Vector2 get(int column);
-    method public operator float get(int column, int row);
-    method public operator androidx.ui.vectormath64.Vector2 get(androidx.ui.vectormath64.MatrixColumn column);
-    method public operator float get(androidx.ui.vectormath64.MatrixColumn column, int row);
-    method public inline java.util.List<java.lang.Float> getM2storage();
-    method public androidx.ui.vectormath64.Vector2 getX();
-    method public androidx.ui.vectormath64.Vector2 getY();
-    method public operator androidx.ui.vectormath64.Matrix2 inc();
-    method public operator androidx.ui.vectormath64.Matrix2 minus(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 plus(float v);
-    method public operator void set(int column, androidx.ui.vectormath64.Vector2 v);
-    method public operator void set(int column, int row, float v);
-    method public void setX(androidx.ui.vectormath64.Vector2 p);
-    method public void setY(androidx.ui.vectormath64.Vector2 p);
-    method public operator androidx.ui.vectormath64.Matrix2 times(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 times(androidx.ui.vectormath64.Matrix2 m);
-    method public operator androidx.ui.vectormath64.Vector2 times(androidx.ui.vectormath64.Vector2 v);
-    method public float[] toFloatArray();
-    method public operator androidx.ui.vectormath64.Matrix2 unaryMinus();
-    property public final inline java.util.List<java.lang.Float> m2storage;
-    field public static final androidx.ui.vectormath64.Matrix2.Companion! Companion;
-  }
-
-  public static final class Matrix2.Companion {
-    method public androidx.ui.vectormath64.Matrix2 identity();
-    method public androidx.ui.vectormath64.Matrix2 of(float... a);
-  }
-
   public final class Matrix3 {
     ctor public Matrix3(androidx.ui.vectormath64.Vector3 x, androidx.ui.vectormath64.Vector3 y, androidx.ui.vectormath64.Vector3 z);
     ctor public Matrix3();
@@ -2360,7 +2310,6 @@
     method public static androidx.ui.vectormath64.Matrix4 scale(androidx.ui.vectormath64.Matrix4 m);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Vector3 t);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Matrix4 m);
-    method public static androidx.ui.vectormath64.Matrix2 transpose(androidx.ui.vectormath64.Matrix2 m);
     method public static androidx.ui.vectormath64.Matrix3 transpose(androidx.ui.vectormath64.Matrix3 m);
     method public static androidx.ui.vectormath64.Matrix4 transpose(androidx.ui.vectormath64.Matrix4 m);
   }
@@ -2368,10 +2317,7 @@
   public final class ScalarKt {
     ctor public ScalarKt();
     method public static inline float degrees(float v);
-    method public static inline float fract(float v);
-    method public static inline float mix(float a, float b, float x);
     method public static inline float radians(float v);
-    method public static inline float sqr(float v);
     field public static final float FOUR_PI = 12.566371f;
     field public static final float HALF_PI = 1.5707964f;
     field public static final float INV_FOUR_PI = 0.07957747f;
@@ -2688,12 +2634,6 @@
     method public static inline operator androidx.ui.vectormath64.Vector2 minus(float, androidx.ui.vectormath64.Vector2 v);
     method public static inline operator androidx.ui.vectormath64.Vector3 minus(float, androidx.ui.vectormath64.Vector3 v);
     method public static inline operator androidx.ui.vectormath64.Vector4 minus(float, androidx.ui.vectormath64.Vector4 v);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, androidx.ui.vectormath64.Vector2 x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, androidx.ui.vectormath64.Vector3 x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, androidx.ui.vectormath64.Vector4 x);
     method public static androidx.ui.vectormath64.Vector2 normalize(androidx.ui.vectormath64.Vector2 v);
     method public static androidx.ui.vectormath64.Vector3 normalize(androidx.ui.vectormath64.Vector3 v);
     method public static androidx.ui.vectormath64.Vector4 normalize(androidx.ui.vectormath64.Vector4 v);
diff --git a/ui/ui-core/api/restricted_0.1.0-dev04.txt b/ui/ui-core/api/restricted_0.1.0-dev04.txt
index b39c0a1..6825a5a 100644
--- a/ui/ui-core/api/restricted_0.1.0-dev04.txt
+++ b/ui/ui-core/api/restricted_0.1.0-dev04.txt
@@ -1515,12 +1515,6 @@
     property public abstract int width;
   }
 
-  public enum ImageByteFormat {
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat png;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawRgba;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawUnmodified;
-  }
-
   public enum ImageConfig {
     enum_constant public static final androidx.ui.graphics.ImageConfig Alpha8;
     enum_constant public static final androidx.ui.graphics.ImageConfig Argb8888;
@@ -1533,13 +1527,6 @@
     ctor public ImageKt();
   }
 
-  public enum ImageRepeat {
-    enum_constant public static final androidx.ui.graphics.ImageRepeat noRepeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatX;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatY;
-  }
-
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
     method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, androidx.ui.core.Px startX, androidx.ui.core.Px startY, androidx.ui.core.Px endX, androidx.ui.core.Px endY, androidx.ui.graphics.TileMode tileMode);
   }
@@ -2161,43 +2148,6 @@
 
 package androidx.ui.vectormath64 {
 
-  public final class Matrix2 {
-    ctor public Matrix2(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    ctor public Matrix2();
-    ctor public Matrix2(androidx.ui.vectormath64.Matrix2 m);
-    method public androidx.ui.vectormath64.Vector2 component1();
-    method public androidx.ui.vectormath64.Vector2 component2();
-    method public androidx.ui.vectormath64.Matrix2 copy(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    method public operator androidx.ui.vectormath64.Matrix2 dec();
-    method public operator androidx.ui.vectormath64.Matrix2 div(float v);
-    method public operator androidx.ui.vectormath64.Vector2 get(int column);
-    method public operator float get(int column, int row);
-    method public operator androidx.ui.vectormath64.Vector2 get(androidx.ui.vectormath64.MatrixColumn column);
-    method public operator float get(androidx.ui.vectormath64.MatrixColumn column, int row);
-    method public inline java.util.List<java.lang.Float> getM2storage();
-    method public androidx.ui.vectormath64.Vector2 getX();
-    method public androidx.ui.vectormath64.Vector2 getY();
-    method public operator androidx.ui.vectormath64.Matrix2 inc();
-    method public operator androidx.ui.vectormath64.Matrix2 minus(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 plus(float v);
-    method public operator void set(int column, androidx.ui.vectormath64.Vector2 v);
-    method public operator void set(int column, int row, float v);
-    method public void setX(androidx.ui.vectormath64.Vector2 p);
-    method public void setY(androidx.ui.vectormath64.Vector2 p);
-    method public operator androidx.ui.vectormath64.Matrix2 times(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 times(androidx.ui.vectormath64.Matrix2 m);
-    method public operator androidx.ui.vectormath64.Vector2 times(androidx.ui.vectormath64.Vector2 v);
-    method public float[] toFloatArray();
-    method public operator androidx.ui.vectormath64.Matrix2 unaryMinus();
-    property public final inline java.util.List<java.lang.Float> m2storage;
-    field public static final androidx.ui.vectormath64.Matrix2.Companion! Companion;
-  }
-
-  public static final class Matrix2.Companion {
-    method public androidx.ui.vectormath64.Matrix2 identity();
-    method public androidx.ui.vectormath64.Matrix2 of(float... a);
-  }
-
   public final class Matrix3 {
     ctor public Matrix3(androidx.ui.vectormath64.Vector3 x, androidx.ui.vectormath64.Vector3 y, androidx.ui.vectormath64.Vector3 z);
     ctor public Matrix3();
@@ -2360,7 +2310,6 @@
     method public static androidx.ui.vectormath64.Matrix4 scale(androidx.ui.vectormath64.Matrix4 m);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Vector3 t);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Matrix4 m);
-    method public static androidx.ui.vectormath64.Matrix2 transpose(androidx.ui.vectormath64.Matrix2 m);
     method public static androidx.ui.vectormath64.Matrix3 transpose(androidx.ui.vectormath64.Matrix3 m);
     method public static androidx.ui.vectormath64.Matrix4 transpose(androidx.ui.vectormath64.Matrix4 m);
   }
@@ -2368,10 +2317,7 @@
   public final class ScalarKt {
     ctor public ScalarKt();
     method public static inline float degrees(float v);
-    method public static inline float fract(float v);
-    method public static inline float mix(float a, float b, float x);
     method public static inline float radians(float v);
-    method public static inline float sqr(float v);
     field public static final float FOUR_PI = 12.566371f;
     field public static final float HALF_PI = 1.5707964f;
     field public static final float INV_FOUR_PI = 0.07957747f;
@@ -2688,12 +2634,6 @@
     method public static inline operator androidx.ui.vectormath64.Vector2 minus(float, androidx.ui.vectormath64.Vector2 v);
     method public static inline operator androidx.ui.vectormath64.Vector3 minus(float, androidx.ui.vectormath64.Vector3 v);
     method public static inline operator androidx.ui.vectormath64.Vector4 minus(float, androidx.ui.vectormath64.Vector4 v);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, androidx.ui.vectormath64.Vector2 x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, androidx.ui.vectormath64.Vector3 x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, androidx.ui.vectormath64.Vector4 x);
     method public static androidx.ui.vectormath64.Vector2 normalize(androidx.ui.vectormath64.Vector2 v);
     method public static androidx.ui.vectormath64.Vector3 normalize(androidx.ui.vectormath64.Vector3 v);
     method public static androidx.ui.vectormath64.Vector4 normalize(androidx.ui.vectormath64.Vector4 v);
diff --git a/ui/ui-core/api/restricted_current.txt b/ui/ui-core/api/restricted_current.txt
index b39c0a1..6825a5a 100644
--- a/ui/ui-core/api/restricted_current.txt
+++ b/ui/ui-core/api/restricted_current.txt
@@ -1515,12 +1515,6 @@
     property public abstract int width;
   }
 
-  public enum ImageByteFormat {
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat png;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawRgba;
-    enum_constant public static final androidx.ui.graphics.ImageByteFormat rawUnmodified;
-  }
-
   public enum ImageConfig {
     enum_constant public static final androidx.ui.graphics.ImageConfig Alpha8;
     enum_constant public static final androidx.ui.graphics.ImageConfig Argb8888;
@@ -1533,13 +1527,6 @@
     ctor public ImageKt();
   }
 
-  public enum ImageRepeat {
-    enum_constant public static final androidx.ui.graphics.ImageRepeat noRepeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeat;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatX;
-    enum_constant public static final androidx.ui.graphics.ImageRepeat repeatY;
-  }
-
   public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
     method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, androidx.ui.core.Px startX, androidx.ui.core.Px startY, androidx.ui.core.Px endX, androidx.ui.core.Px endY, androidx.ui.graphics.TileMode tileMode);
   }
@@ -2161,43 +2148,6 @@
 
 package androidx.ui.vectormath64 {
 
-  public final class Matrix2 {
-    ctor public Matrix2(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    ctor public Matrix2();
-    ctor public Matrix2(androidx.ui.vectormath64.Matrix2 m);
-    method public androidx.ui.vectormath64.Vector2 component1();
-    method public androidx.ui.vectormath64.Vector2 component2();
-    method public androidx.ui.vectormath64.Matrix2 copy(androidx.ui.vectormath64.Vector2 x, androidx.ui.vectormath64.Vector2 y);
-    method public operator androidx.ui.vectormath64.Matrix2 dec();
-    method public operator androidx.ui.vectormath64.Matrix2 div(float v);
-    method public operator androidx.ui.vectormath64.Vector2 get(int column);
-    method public operator float get(int column, int row);
-    method public operator androidx.ui.vectormath64.Vector2 get(androidx.ui.vectormath64.MatrixColumn column);
-    method public operator float get(androidx.ui.vectormath64.MatrixColumn column, int row);
-    method public inline java.util.List<java.lang.Float> getM2storage();
-    method public androidx.ui.vectormath64.Vector2 getX();
-    method public androidx.ui.vectormath64.Vector2 getY();
-    method public operator androidx.ui.vectormath64.Matrix2 inc();
-    method public operator androidx.ui.vectormath64.Matrix2 minus(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 plus(float v);
-    method public operator void set(int column, androidx.ui.vectormath64.Vector2 v);
-    method public operator void set(int column, int row, float v);
-    method public void setX(androidx.ui.vectormath64.Vector2 p);
-    method public void setY(androidx.ui.vectormath64.Vector2 p);
-    method public operator androidx.ui.vectormath64.Matrix2 times(float v);
-    method public operator androidx.ui.vectormath64.Matrix2 times(androidx.ui.vectormath64.Matrix2 m);
-    method public operator androidx.ui.vectormath64.Vector2 times(androidx.ui.vectormath64.Vector2 v);
-    method public float[] toFloatArray();
-    method public operator androidx.ui.vectormath64.Matrix2 unaryMinus();
-    property public final inline java.util.List<java.lang.Float> m2storage;
-    field public static final androidx.ui.vectormath64.Matrix2.Companion! Companion;
-  }
-
-  public static final class Matrix2.Companion {
-    method public androidx.ui.vectormath64.Matrix2 identity();
-    method public androidx.ui.vectormath64.Matrix2 of(float... a);
-  }
-
   public final class Matrix3 {
     ctor public Matrix3(androidx.ui.vectormath64.Vector3 x, androidx.ui.vectormath64.Vector3 y, androidx.ui.vectormath64.Vector3 z);
     ctor public Matrix3();
@@ -2360,7 +2310,6 @@
     method public static androidx.ui.vectormath64.Matrix4 scale(androidx.ui.vectormath64.Matrix4 m);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Vector3 t);
     method public static androidx.ui.vectormath64.Matrix4 translation(androidx.ui.vectormath64.Matrix4 m);
-    method public static androidx.ui.vectormath64.Matrix2 transpose(androidx.ui.vectormath64.Matrix2 m);
     method public static androidx.ui.vectormath64.Matrix3 transpose(androidx.ui.vectormath64.Matrix3 m);
     method public static androidx.ui.vectormath64.Matrix4 transpose(androidx.ui.vectormath64.Matrix4 m);
   }
@@ -2368,10 +2317,7 @@
   public final class ScalarKt {
     ctor public ScalarKt();
     method public static inline float degrees(float v);
-    method public static inline float fract(float v);
-    method public static inline float mix(float a, float b, float x);
     method public static inline float radians(float v);
-    method public static inline float sqr(float v);
     field public static final float FOUR_PI = 12.566371f;
     field public static final float HALF_PI = 1.5707964f;
     field public static final float INV_FOUR_PI = 0.07957747f;
@@ -2688,12 +2634,6 @@
     method public static inline operator androidx.ui.vectormath64.Vector2 minus(float, androidx.ui.vectormath64.Vector2 v);
     method public static inline operator androidx.ui.vectormath64.Vector3 minus(float, androidx.ui.vectormath64.Vector3 v);
     method public static inline operator androidx.ui.vectormath64.Vector4 minus(float, androidx.ui.vectormath64.Vector4 v);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector2 mix(androidx.ui.vectormath64.Vector2 a, androidx.ui.vectormath64.Vector2 b, androidx.ui.vectormath64.Vector2 x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector3 mix(androidx.ui.vectormath64.Vector3 a, androidx.ui.vectormath64.Vector3 b, androidx.ui.vectormath64.Vector3 x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, float x);
-    method public static inline androidx.ui.vectormath64.Vector4 mix(androidx.ui.vectormath64.Vector4 a, androidx.ui.vectormath64.Vector4 b, androidx.ui.vectormath64.Vector4 x);
     method public static androidx.ui.vectormath64.Vector2 normalize(androidx.ui.vectormath64.Vector2 v);
     method public static androidx.ui.vectormath64.Vector3 normalize(androidx.ui.vectormath64.Vector3 v);
     method public static androidx.ui.vectormath64.Vector4 normalize(androidx.ui.vectormath64.Vector4 v);
diff --git a/ui/ui-core/src/main/java/androidx/ui/graphics/ImageByteFormat.kt b/ui/ui-core/src/main/java/androidx/ui/graphics/ImageByteFormat.kt
deleted file mode 100644
index 47551be..0000000
--- a/ui/ui-core/src/main/java/androidx/ui/graphics/ImageByteFormat.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2018 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.ui.graphics
-
-/**
- * The format in which image bytes should be returned when using
- * [Image.toByteData].
- */
-enum class ImageByteFormat {
-    /**
-     * Raw RGBA format.
-     *
-     * Unencoded bytes, in RGBA row-primary form, 8 bits per channel.
-     */
-    rawRgba,
-
-    /**
-     * Raw unmodified format.
-     *
-     * Unencoded bytes, in the image's existing format. For example, a grayscale
-     * image may use a single 8-bit channel for each pixel.
-     */
-    rawUnmodified,
-
-    /**
-     * PNG format.
-     *
-     * A loss-less compression format for images. This format is well suited for
-     * images with hard edges, such as screenshots or sprites, and images with
-     * text. Transparency is supported. The PNG format supports images up to
-     * 2,147,483,647 pixels in either dimension, though in practice available
-     * memory provides a more immediate limitation on maximum image size.
-     *
-     * PNG images normally use the `.png` file extension and the `image/png` MIME
-     * type.
-     *
-     * See also:
-     *
-     *  * <https://en.wikipedia.org/wiki/Portable_Network_Graphics>, the Wikipedia page on PNG.
-     *  * <https://tools.ietf.org/rfc/rfc2083.txt>, the PNG standard.
-     */
-    png
-}
\ No newline at end of file
diff --git a/ui/ui-core/src/main/java/androidx/ui/graphics/ImageRepeat.kt b/ui/ui-core/src/main/java/androidx/ui/graphics/ImageRepeat.kt
deleted file mode 100644
index 31f1f01..0000000
--- a/ui/ui-core/src/main/java/androidx/ui/graphics/ImageRepeat.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2018 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.ui.graphics
-
-/** How to paint any portions of a box not covered by an image. */
-enum class ImageRepeat {
-    /** Repeat the image in both the x and y directions until the box is filled. */
-    repeat,
-
-    /** Repeat the image in the x direction until the box is filled horizontally. */
-    repeatX,
-
-    /** Repeat the image in the y direction until the box is filled vertically. */
-    repeatY,
-
-    /** Leave uncovered portions of the box transparent. */
-    noRepeat
-}
\ No newline at end of file
diff --git a/ui/ui-core/src/main/java/androidx/ui/vectormath64/Matrix2.kt b/ui/ui-core/src/main/java/androidx/ui/vectormath64/Matrix2.kt
deleted file mode 100644
index e94f66e..0000000
--- a/ui/ui-core/src/main/java/androidx/ui/vectormath64/Matrix2.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2018 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.ui.vectormath64
-
-data class Matrix2(
-    var x: Vector2 = Vector2(x = 1.0f),
-    var y: Vector2 = Vector2(y = 1.0f)
-) {
-    constructor(m: Matrix2) : this(m.x.copy(), m.y.copy())
-
-    companion object {
-        fun of(vararg a: Float): Matrix2 {
-            require(a.size >= 4)
-            return Matrix2(
-                    Vector2(a[0], a[2]),
-                    Vector2(a[1], a[3])
-            )
-        }
-
-        fun identity() = Matrix2()
-    }
-
-    inline val m2storage: List<Float>
-        get() = x.v2storage + y.v2storage
-
-    operator fun get(column: Int) = when (column) {
-        0 -> x
-        1 -> y
-        else -> throw IllegalArgumentException("column must be in 0..1")
-    }
-    operator fun get(column: Int, row: Int) = get(column)[row]
-
-    operator fun get(column: MatrixColumn) = when (column) {
-        MatrixColumn.X -> x
-        MatrixColumn.Y -> y
-        else -> throw IllegalArgumentException("column must be X or Y")
-    }
-    operator fun get(column: MatrixColumn, row: Int) = get(column)[row]
-
-    operator fun set(column: Int, v: Vector2) {
-        this[column].xy = v
-    }
-    operator fun set(column: Int, row: Int, v: Float) {
-        this[column][row] = v
-    }
-
-    operator fun unaryMinus() = Matrix2(-x, -y)
-    operator fun inc() = Matrix2(this).apply {
-        ++x
-        ++y
-    }
-    operator fun dec() = Matrix2(this).apply {
-        --x
-        --y
-    }
-
-    operator fun plus(v: Float) = Matrix2(x + v, y + v)
-    operator fun minus(v: Float) = Matrix2(x - v, y - v)
-    operator fun times(v: Float) = Matrix2(x * v, y * v)
-    operator fun div(v: Float) = Matrix2(x / v, y / v)
-
-    operator fun times(m: Matrix2): Matrix2 {
-        val t = transpose(this)
-        return Matrix2(
-                Vector2(dot(t.x, m.x), dot(t.y, m.x)),
-                Vector2(dot(t.x, m.y), dot(t.y, m.y))
-        )
-    }
-
-    operator fun times(v: Vector2): Vector2 {
-        val t = transpose(this)
-        return Vector2(dot(t.x, v), dot(t.y, v))
-    }
-
-    fun toFloatArray() = floatArrayOf(
-            x.x, y.x,
-            x.y, y.y
-    )
-
-    override fun toString(): String {
-        return """
-            |${x.x} ${y.x}|
-            |${x.y} ${y.y}|
-            """.trimIndent()
-    }
-}
diff --git a/ui/ui-core/src/main/java/androidx/ui/vectormath64/MatrixExtensions.kt b/ui/ui-core/src/main/java/androidx/ui/vectormath64/MatrixExtensions.kt
index f4631a1..b1feb1c 100644
--- a/ui/ui-core/src/main/java/androidx/ui/vectormath64/MatrixExtensions.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/vectormath64/MatrixExtensions.kt
@@ -19,11 +19,6 @@
 import kotlin.math.sin
 import kotlin.math.tan
 
-fun transpose(m: Matrix2) = Matrix2(
-        Vector2(m.x.x, m.y.x),
-        Vector2(m.x.y, m.y.y)
-)
-
 fun transpose(m: Matrix3) = Matrix3(
         Vector3(m.x.x, m.y.x, m.z.x),
         Vector3(m.x.y, m.y.y, m.z.y),
diff --git a/ui/ui-core/src/main/java/androidx/ui/vectormath64/Scalar.kt b/ui/ui-core/src/main/java/androidx/ui/vectormath64/Scalar.kt
index 1e9c3cb..84e7660 100644
--- a/ui/ui-core/src/main/java/androidx/ui/vectormath64/Scalar.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/vectormath64/Scalar.kt
@@ -25,12 +25,6 @@
 const val INV_TWO_PI = INV_PI * 0.5f
 const val INV_FOUR_PI = INV_PI * 0.25f
 
-inline fun mix(a: Float, b: Float, x: Float) = a * (1.0f - x) + b * x
-
 inline fun degrees(v: Float) = v * (180.0f * INV_PI)
 
 inline fun radians(v: Float) = v * (PI / 180.0f)
-
-inline fun fract(v: Float) = v % 1
-
-inline fun sqr(v: Float) = v * v
diff --git a/ui/ui-core/src/main/java/androidx/ui/vectormath64/VectorExtensions.kt b/ui/ui-core/src/main/java/androidx/ui/vectormath64/VectorExtensions.kt
index 9957019..a5d2b2c 100644
--- a/ui/ui-core/src/main/java/androidx/ui/vectormath64/VectorExtensions.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/vectormath64/VectorExtensions.kt
@@ -39,7 +39,7 @@
 inline fun reflect(i: Vector2, n: Vector2) = i - 2.0f * dot(n, i) * n
 fun refract(i: Vector2, n: Vector2, eta: Float): Vector2 {
     val d = dot(n, i)
-    val k = 1.0f - eta * eta * (1.0f - sqr(d))
+    val k = 1.0f - eta * eta * (1.0f - (d * d))
     return if (k < 0.0f) Vector2(0.0f) else eta * i - (eta * d + sqrt(k)) * n
 }
 
@@ -57,18 +57,6 @@
     )
 }
 
-inline fun mix(a: Vector2, b: Vector2, x: Float): Vector2 {
-    return Vector2(
-            mix(a.x, b.x, x),
-            mix(a.y, b.y, x))
-}
-
-inline fun mix(a: Vector2, b: Vector2, x: Vector2): Vector2 {
-    return Vector2(
-            mix(a.x, b.x, x.x),
-            mix(a.y, b.y, x.y))
-}
-
 inline fun min(v: Vector2) = min(v.x, v.y)
 inline fun min(a: Vector2, b: Vector2) = Vector2(min(a.x, b.x), min(a.y, b.y))
 inline fun max(v: Vector2) = max(v.x, v.y)
@@ -100,7 +88,7 @@
 inline fun reflect(i: Vector3, n: Vector3) = i - 2.0f * dot(n, i) * n
 fun refract(i: Vector3, n: Vector3, eta: Float): Vector3 {
     val d = dot(n, i)
-    val k = 1.0f - eta * eta * (1.0f - sqr(d))
+    val k = 1.0f - eta * eta * (1.0f - (d * d))
     return if (k < 0.0f) Vector3(0.0f) else eta * i - (eta * d + sqrt(k)) * n
 }
 
@@ -120,20 +108,6 @@
     )
 }
 
-inline fun mix(a: Vector3, b: Vector3, x: Float): Vector3 {
-    return Vector3(
-            mix(a.x, b.x, x),
-            mix(a.y, b.y, x),
-            mix(a.z, b.z, x))
-}
-
-inline fun mix(a: Vector3, b: Vector3, x: Vector3): Vector3 {
-    return Vector3(
-            mix(a.x, b.x, x.x),
-            mix(a.y, b.y, x.y),
-            mix(a.z, b.z, x.z))
-}
-
 inline fun min(v: Vector3) = min(v.x, min(v.y, v.z))
 inline fun min(a: Vector3, b: Vector3) = Vector3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z))
 inline fun max(v: Vector3) = max(v.x, max(v.y, v.z))
@@ -177,22 +151,6 @@
     )
 }
 
-inline fun mix(a: Vector4, b: Vector4, x: Float): Vector4 {
-    return Vector4(
-            mix(a.x, b.x, x),
-            mix(a.y, b.y, x),
-            mix(a.z, b.z, x),
-            mix(a.w, b.w, x))
-}
-
-inline fun mix(a: Vector4, b: Vector4, x: Vector4): Vector4 {
-    return Vector4(
-            mix(a.x, b.x, x.x),
-            mix(a.y, b.y, x.y),
-            mix(a.z, b.z, x.z),
-            mix(a.w, b.w, x.w))
-}
-
 inline fun min(v: Vector4) = min(v.x, min(v.y, min(v.z, v.w)))
 inline fun min(a: Vector4, b: Vector4): Vector4 {
     return Vector4(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z), min(a.w, b.w))
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/Selection.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/Selection.kt
index 0b8bacd..242e6cc 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/Selection.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/Selection.kt
@@ -92,7 +92,7 @@
             selection = selection.copy(end = other.end)
         }
 
-        selection = selection.copy(handlesCrossed = this.handlesCrossed || other.handlesCrossed)
+        selection = selection.copy(handlesCrossed = other.handlesCrossed)
 
         return selection
     }
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionTest.kt
index 879900b..4a4a616 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/selection/SelectionTest.kt
@@ -197,6 +197,63 @@
     }
 
     @Test
+    fun selection_handles_crossed_to_not_crossed() {
+        val startOffset1 = 20
+        val endOffset1 = 9
+        val startCoordinates1 = PxPosition(50.px, 50.px)
+        val endCoordinates1 = PxPosition(20.px, 20.px)
+        val layoutCoordinates: LayoutCoordinates = mock()
+        val startAnchor1 = Selection.AnchorInfo(
+            coordinates = startCoordinates1,
+            direction = TextDirection.Ltr,
+            offset = startOffset1,
+            layoutCoordinates = layoutCoordinates
+        )
+        val endAnchor1 = Selection.AnchorInfo(
+            coordinates = endCoordinates1,
+            direction = TextDirection.Ltr,
+            offset = endOffset1,
+            layoutCoordinates = layoutCoordinates
+        )
+        val oldSelection = Selection(
+            start = startAnchor1,
+            end = endAnchor1,
+            handlesCrossed = true
+        )
+        val startOffset2 = 0
+        val endOffset2 = 30
+        val startCoordinates2 = PxPosition(0.px, 20.px)
+        val endCoordinates2 = PxPosition(50.px, 300.px)
+        val startAnchor2 = Selection.AnchorInfo(
+            coordinates = startCoordinates2,
+            direction = TextDirection.Ltr,
+            offset = startOffset2,
+            layoutCoordinates = layoutCoordinates
+        )
+        val endAnchor2 = Selection.AnchorInfo(
+            coordinates = endCoordinates2,
+            direction = TextDirection.Ltr,
+            offset = endOffset2,
+            layoutCoordinates = layoutCoordinates
+        )
+        val newSelection = Selection(
+            start = startAnchor2,
+            end = endAnchor2,
+            handlesCrossed = false
+        )
+
+        val selection = oldSelection.merge(newSelection)
+
+        assertThat(selection.start.offset).isEqualTo(startOffset2)
+        assertThat(selection.end.offset).isEqualTo(endOffset2)
+        assertThat(selection.start.coordinates).isEqualTo(startCoordinates2)
+        assertThat(selection.end.coordinates).isEqualTo(endCoordinates2)
+        assertThat(selection.start.layoutCoordinates).isEqualTo(layoutCoordinates)
+        assertThat(selection.end.layoutCoordinates).isEqualTo(layoutCoordinates)
+        assertThat(selection.handlesCrossed).isFalse()
+    }
+
+    @Test
     fun selection_toTextRange_handles_not_cross() {
         val startOffset = 0
         val endOffset = 6
diff --git a/webkit/integration-tests/testapp/src/main/AndroidManifest.xml b/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
index 845bc22..9e80901 100644
--- a/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/webkit/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -108,5 +108,8 @@
         <activity
             android:name=".WebMessageListenerActivity"
             android:exported="true" />
+        <activity
+            android:name=".WebMessageListenerMaliciousWebsiteActivity"
+            android:exported="true" />
     </application>
 </manifest>
diff --git a/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_demo.js b/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_demo.js
new file mode 100644
index 0000000..67e5a82
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_demo.js
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2019 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.
+ */
+allFramesObject.onmessage = function(event) {
+  document.getElementById('reply_message').innerText = event.data;
+}
+function sendMessage(e) {
+  e.preventDefault();
+  const message = document.getElementById("send_message").value;
+  allFramesObject.postMessage(message);
+}
+function checkForObject(objectName, elementId) {
+  var verb = window.hasOwnProperty(objectName) ? "do" : "don't";
+  var element = document.getElementById(elementId);
+  element.innerText = `I ${verb} have access to ${objectName}`;
+}
+function detectObjects(event) {
+  checkForObject('restrictedObject', 'restricted_object_result');
+  checkForObject('allFramesObject', 'all_frames_object_result');
+}
+window.addEventListener("DOMContentLoaded", detectObjects);
diff --git a/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_genuine.html b/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_genuine.html
new file mode 100644
index 0000000..0d43a5f
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_genuine.html
@@ -0,0 +1,30 @@
+<html>
+<!-- Copyright 2019 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.
+-->
+<head>
+  <script src="https://example.com/androidx_webkit/example/assets/www/web_message_listener_demo.js">
+  </script>
+</head>
+<body>
+  <h1>example.com.</h1>
+  <div id="restricted_object_result" style="color:red">Detecting...</div>
+  <div id="all_frames_object_result" style="color:red">Detecting...</div>
+  <div>
+    <input value="ping!" id="send_message">
+    <button type="button" onclick="sendMessage(event)">Send Message</button>
+    <div id='reply_message'></div>
+  </div>
+</body>
+</html>
diff --git a/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_malicious.html b/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_malicious.html
new file mode 100644
index 0000000..07cd7ce
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/assets/www/web_message_listener_malicious.html
@@ -0,0 +1,34 @@
+<html>
+<!-- Copyright 2019 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.
+-->
+<head>
+  <script src="https://malicious.com/androidx_webkit/example/assets/www/web_message_listener_demo.js">
+  </script>
+</head>
+<body>
+  <h1>malicious.com.</h1>
+  <p>A malicious website may try to iframe a well-meaning website.</p>
+  <div id="restricted_object_result" style="color:red">Detecting...</div>
+  <div id="all_frames_object_result" style="color:red">Detecting...</div>
+  <div>
+    <input value="ping!" id="send_message">
+    <button type="button" onclick="sendMessage(event)">Send Message</button>
+    <div id='reply_message'></div>
+  </div>
+  <iframe src="https://example.com/androidx_webkit/example/assets/www/web_message_listener_genuine.html"
+          height="200" style="margin: 30px">
+  </iframe>
+</body>
+</html>
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/JsJavaInteractionActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/JsJavaInteractionActivity.java
index 5f58f3e..a6ddade 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/JsJavaInteractionActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/JsJavaInteractionActivity.java
@@ -42,6 +42,11 @@
                 new MenuListView.MenuItem(
                         getResources().getString(R.string.web_message_listener_activity_title),
                         new Intent(activityContext, WebMessageListenerActivity.class)),
+                new MenuListView.MenuItem(
+                        getResources().getString(
+                                R.string.web_message_listener_malicious_website_activity_title),
+                        new Intent(
+                                activityContext, WebMessageListenerMaliciousWebsiteActivity.class)),
         };
         listView.setItems(menuItems);
     }
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/WebMessageListenerMaliciousWebsiteActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/WebMessageListenerMaliciousWebsiteActivity.java
new file mode 100644
index 0000000..d23e6f7
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/WebMessageListenerMaliciousWebsiteActivity.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2019 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 com.example.androidx.webkit;
+
+import static androidx.webkit.WebViewAssetLoader.AssetsPathHandler;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.webkit.JsReplyProxy;
+import androidx.webkit.WebMessageCompat;
+import androidx.webkit.WebViewAssetLoader;
+import androidx.webkit.WebViewCompat;
+import androidx.webkit.WebViewFeature;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * An {@link Activity} to show how WebMessageListener deals with malicious websites.
+ */
+@SuppressLint("RestrictedApi")
+public class WebMessageListenerMaliciousWebsiteActivity extends AppCompatActivity {
+    private final Uri mMaliciousUrl = new Uri.Builder()
+                                            .scheme("https")
+                                            .authority("malicious.com")
+                                            .appendPath("androidx_webkit")
+                                            .appendPath("example")
+                                            .appendPath("assets")
+                                            .build();
+
+    private static class MyWebViewClient extends WebViewClient {
+        private final WebViewAssetLoader[] mAssetLoaders;
+
+        MyWebViewClient(WebViewAssetLoader[] loaders) {
+            mAssetLoaders = loaders;
+        }
+
+        @Override
+        @RequiresApi(21)
+        public WebResourceResponse shouldInterceptRequest(
+                WebView view, WebResourceRequest request) {
+            for (WebViewAssetLoader loader : mAssetLoaders) {
+                WebResourceResponse response = loader.shouldInterceptRequest(request.getUrl());
+                if (response != null) {
+                    return response;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        @SuppressWarnings("deprecation") // use the old one for compatibility with all API levels.
+        public WebResourceResponse shouldInterceptRequest(WebView view, String request) {
+            for (WebViewAssetLoader loader : mAssetLoaders) {
+                WebResourceResponse response = loader.shouldInterceptRequest(Uri.parse(request));
+                if (response != null) {
+                    return response;
+                }
+            }
+            return null;
+        }
+    }
+
+    private static class AvailableInAllowedOriginsFrameMessageListener
+            implements WebViewCompat.WebMessageListener {
+        @Override
+        public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
+                boolean isMainFrame, JsReplyProxy replyProxy) {
+            replyProxy.postMessage("Hello");
+        }
+    }
+
+    private static class AvailableInAllFramesMessageListener
+            implements WebViewCompat.WebMessageListener {
+        private final Context mContext;
+        private final List<String> mBadAuthorities;
+
+        AvailableInAllFramesMessageListener(Context context, List<String> badAuthorities) {
+            mContext = context;
+            mBadAuthorities = badAuthorities;
+        }
+
+        @Override
+        public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
+                boolean isMainFrame, JsReplyProxy replyProxy) {
+            for (String badAuthority : mBadAuthorities) {
+                if (sourceOrigin.getAuthority().equals(badAuthority)) {
+                    Toast.makeText(mContext, "Message from known bad website, no response.",
+                                 Toast.LENGTH_SHORT)
+                            .show();
+                    return;
+                }
+            }
+            replyProxy.postMessage("Reply from app for " + message.getData());
+        }
+    }
+
+    @SuppressLint("SetJavascriptEnabled")
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_web_message_listener_malicious_website);
+        setTitle(R.string.web_message_listener_malicious_website_activity_title);
+        WebkitHelpers.appendWebViewVersionToTitle(this);
+
+        if (!WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER)) {
+            WebkitHelpers.showMessageInActivity(WebMessageListenerMaliciousWebsiteActivity.this,
+                    R.string.webkit_api_not_available);
+            return;
+        }
+
+        // Use WebViewAssetLoader to load html page from app's assets.
+        WebViewAssetLoader assetLoaderMalicious =
+                new WebViewAssetLoader.Builder()
+                        .setDomain("malicious.com")
+                        .addPathHandler(mMaliciousUrl.getPath() + "/", new AssetsPathHandler(this))
+                        .build();
+        WebViewAssetLoader assetLoaderGenuine =
+                new WebViewAssetLoader.Builder()
+                        .setDomain("example.com")
+                        .addPathHandler(
+                                "/androidx_webkit/example/assets/", new AssetsPathHandler(this))
+                        .build();
+
+        WebView webView = findViewById(R.id.webview);
+        webView.setWebViewClient(new MyWebViewClient(
+                new WebViewAssetLoader[] {assetLoaderMalicious, assetLoaderGenuine}));
+        webView.getSettings().setJavaScriptEnabled(true);
+
+        // If you only intend to communicate with a limited number of origins, prefer only injecting
+        // the listener in those frames.
+        WebViewCompat.addWebMessageListener(webView, "restrictedObject",
+                Arrays.asList("https://example.com"),
+                new AvailableInAllowedOriginsFrameMessageListener());
+
+        // If you need to communicate with a wider set of origins but are aware of some origins
+        // matching your filter that you need to block communication with, you can check the sending
+        // frame's origin on the Java side in onPostMessage().
+        WebViewCompat.addWebMessageListener(webView, "allFramesObject", Arrays.asList("*"),
+                new AvailableInAllFramesMessageListener(this, Arrays.asList("malicious.com")));
+
+        webView.loadUrl(
+                Uri.withAppendedPath(mMaliciousUrl, "www/web_message_listener_malicious.html")
+                        .toString());
+    }
+}
diff --git a/webkit/integration-tests/testapp/src/main/res/layout/activity_web_message_listener_malicious_website.xml b/webkit/integration-tests/testapp/src/main/res/layout/activity_web_message_listener_malicious_website.xml
new file mode 100644
index 0000000..90b0b8a
--- /dev/null
+++ b/webkit/integration-tests/testapp/src/main/res/layout/activity_web_message_listener_malicious_website.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/activity_web_message_listener"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <WebView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/webview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</LinearLayout>
diff --git a/webkit/integration-tests/testapp/src/main/res/values/strings.xml b/webkit/integration-tests/testapp/src/main/res/values/strings.xml
index d955806..e0cf5b1 100644
--- a/webkit/integration-tests/testapp/src/main/res/values/strings.xml
+++ b/webkit/integration-tests/testapp/src/main/res/values/strings.xml
@@ -72,4 +72,5 @@
     <string name="fullscreen_activity_title">Fullscreen web contents Demo</string>
     <string name="js_java_interaction_activity_title">JavaScript - Java communication</string>
     <string name="web_message_listener_activity_title">WebMessageListener Demo</string>
+    <string name="web_message_listener_malicious_website_activity_title">Malicious Website Demo</string>
 </resources>
