Merge "Remove lateinit in LazyListState" into androidx-main
diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml
index f79fa36..3490ad1 100644
--- a/.github/workflows/presubmit.yml
+++ b/.github/workflows/presubmit.yml
@@ -15,9 +15,9 @@
         id: global-constants
         run: |
           set -x
-          GRADLEW_FLAGS="-Dorg.gradle.internal.http.connectionTimeout=300000 \
-            -Dorg.gradle.internal.http.socketTimeout=300000                  \
-            -Dorg.gradle.internal.repository.max.retries=10                  \
+          GRADLEW_FLAGS="-Dorg.gradle.internal.http.connectionTimeout=60000 \
+            -Dorg.gradle.internal.http.socketTimeout=60000                   \
+            -Dorg.gradle.internal.repository.max.retries=20                  \
             -Dorg.gradle.internal.repository.initial.backoff=500             \
             -Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=512m"                 \
             --stacktrace"
@@ -96,18 +96,35 @@
           set -x
           AFFECTED_FILES=`echo "${{ steps.changed-files.outputs.files_including_removals }}" | sed 's|\([^ ]\+\)|--changedFilePath=\1|g'`
           echo "::set-output name=files::$AFFECTED_FILES"
+      - name: "warm up gradle"
+        id: warm-up-gradle-cache
+        uses: gradle/gradle-command-action@v1
+        env:
+          JAVA_HOME: ${{ steps.setup-java.outputs.path }}
+          JAVA_TOOLS_JAR: ${{ steps.setup-tools-jar.outputs.toolsJar }}
+        with:
+          arguments: tasks -PandroidXUnusedParameter=activity # add project name to cache key
+          build-root-directory: activity
+          configuration-cache-enabled: true
+          dependencies-cache-enabled: true
+          dependencies-cache-key: |
+            **/libs.versions.toml
+          dependencies-cache-exact: false
+          gradle-executable: activity/gradlew
+          wrapper-directory: activity/gradle/wrapper
+          distributions-cache-enabled: true
       - name: "ktlint"
-        uses: gradle/gradle-command-action@v1.4.1
+        uses: gradle/gradle-command-action@v1
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
           arguments: -q :ktlintCheckFile ${{ steps.ktlint-file-args.outputs.ktlint-file-args }} ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: activity
-          configuration-cache-enabled: true
-          dependencies-cache-enabled: true
+          configuration-cache-enabled: false
+          dependencies-cache-enabled: false
           gradle-executable: activity/gradlew
           wrapper-directory: activity/gradle/wrapper
-          wrapper-cache-enabled: true
+          distributions-cache-enabled: false
   build-modules:
     strategy:
       fail-fast: false
@@ -154,21 +171,41 @@
           set -x
           echo "ANDROID_SDK_ROOT=$HOME/Library/Android/sdk" >> $GITHUB_ENV
           echo "DIST_DIR=$HOME/dist" >> $GITHUB_ENV
+      # gradle action loads the dependencies cache only on the first run based on arguments.
+      # to control it, we explicitly invoke it once which makes it load the dependencies cache with the parameters
+      # we control
+      - name: "warm up gradle"
+        id: warm-up-gradle-cache
+        uses: gradle/gradle-command-action@v1
+        env:
+          JAVA_HOME: ${{ steps.setup-java.outputs.path }}
+          JAVA_TOOLS_JAR: ${{ steps.setup-tools-jar.outputs.toolsJar }}
+        with:
+          arguments: tasks -PandroidXUnusedParameter=${{ env.project-root }} # add project name to cache key
+          build-root-directory: ${{ env.project-root }}
+          configuration-cache-enabled: true
+          dependencies-cache-enabled: true
+          dependencies-cache-key: |
+            **/libs.versions.toml
+          dependencies-cache-exact: false
+          gradle-executable: ${{ env.project-root }}/gradlew
+          wrapper-directory: ${{ env.project-root }}/gradle/wrapper
+          distributions-cache-enabled: true
       - name: "./gradlew findAffectedModules"
         id: find-affected-modules
         if: ${{ needs.lint.outputs.affectedFileArgs != '' }}
-        uses: gradle/gradle-command-action@v1.4.1
+        uses: gradle/gradle-command-action@v1
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
           JAVA_TOOLS_JAR: ${{ steps.setup-tools-jar.outputs.toolsJar }}
         with:
           arguments: findAffectedModules ${{ needs.lint.outputs.affectedFileArgs }} ${{ needs.setup.outputs.gradlew_flags }} --outputFilePath=${{ github.workspace }}/affected.txt
           build-root-directory: ${{ env.project-root }}
-          configuration-cache-enabled: true
-          dependencies-cache-enabled: true
+          configuration-cache-enabled: false
+          dependencies-cache-enabled: false
+          distributions-cache-enabled: false
           gradle-executable: ${{ env.project-root }}/gradlew
           wrapper-directory: ${{ env.project-root }}/gradle/wrapper
-          wrapper-cache-enabled: true
       - name: "Parse the output of find affected modules step to see if we should build"
         id: affected-module-count
         run: |
@@ -176,7 +213,7 @@
           AFFECTED_MODULE_COUNT=`grep -c ".*" ${{ github.workspace }}/affected.txt || true`
           echo "::set-output name=count::$AFFECTED_MODULE_COUNT"
       - name: "./gradlew buildOnServer buildTestApks"
-        uses: gradle/gradle-command-action@v1.4.1
+        uses: gradle/gradle-command-action@v1
         if: ${{ steps.affected-module-count.outputs.count > 0 }}
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
@@ -184,11 +221,11 @@
         with:
           arguments: buildOnServer buildTestApks ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
-          configuration-cache-enabled: true
-          dependencies-cache-enabled: true
+          configuration-cache-enabled: false
+          dependencies-cache-enabled: false
+          distributions-cache-enabled: false
           gradle-executable: ${{ env.project-root }}/gradlew
           wrapper-directory: ${{ env.project-root }}/gradle/wrapper
-          wrapper-cache-enabled: true
 
       - name: "Upload build artifacts"
         continue-on-error: true
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 8adc3d2..653a3f8 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -258,6 +258,7 @@
     </codeStyleSettings>
     <codeStyleSettings language="kotlin">
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+      <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
       <option name="WRAP_ON_TYPING" value="1" />
       <indentOptions>
         <option name="CONTINUATION_INDENT_SIZE" value="4" />
diff --git a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
index 9047113..adda0cd 100644
--- a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -612,7 +612,12 @@
     /**
      * {@inheritDoc}
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * activity. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartActivityForResult} object for the {@link ActivityResultContract}.
      */
@@ -626,7 +631,12 @@
     /**
      * {@inheritDoc}
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * activity. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartActivityForResult} object for the {@link ActivityResultContract}.
      */
@@ -640,7 +650,12 @@
     /**
      * {@inheritDoc}
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * activity. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartIntentSenderForResult} object for the
      * {@link ActivityResultContract}.
@@ -658,7 +673,12 @@
     /**
      * {@inheritDoc}
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * activity. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartIntentSenderForResult} object for the
      * {@link ActivityResultContract}.
@@ -675,7 +695,12 @@
     /**
      * {@inheritDoc}
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * activity. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * with the appropriate {@link ActivityResultContract} and handling the result in the
      * {@link ActivityResultCallback#onActivityResult(Object) callback}.
@@ -692,7 +717,12 @@
     /**
      * {@inheritDoc}
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * activity. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)} passing
      * in a {@link RequestMultiplePermissions} object for the {@link ActivityResultContract} and
      * handling the result in the {@link ActivityResultCallback#onActivityResult(Object) callback}.
diff --git a/appcompat/appcompat/api/current.txt b/appcompat/appcompat/api/current.txt
index a4746b7..b560b02 100644
--- a/appcompat/appcompat/api/current.txt
+++ b/appcompat/appcompat/api/current.txt
@@ -907,10 +907,13 @@
     method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
   }
 
-  public class Toolbar extends android.view.ViewGroup {
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
     ctor public Toolbar(android.content.Context);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
     method public void collapseActionView();
     method public void dismissPopupMenus();
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
@@ -944,7 +947,9 @@
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
     method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
     method public boolean isOverflowMenuShowing();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
     method public void setCollapseContentDescription(@StringRes int);
     method public void setCollapseContentDescription(CharSequence?);
     method public void setCollapseIcon(@DrawableRes int);
diff --git a/appcompat/appcompat/api/public_plus_experimental_current.txt b/appcompat/appcompat/api/public_plus_experimental_current.txt
index a4746b7..b560b02 100644
--- a/appcompat/appcompat/api/public_plus_experimental_current.txt
+++ b/appcompat/appcompat/api/public_plus_experimental_current.txt
@@ -907,10 +907,13 @@
     method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
   }
 
-  public class Toolbar extends android.view.ViewGroup {
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
     ctor public Toolbar(android.content.Context);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
     method public void collapseActionView();
     method public void dismissPopupMenus();
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
@@ -944,7 +947,9 @@
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
     method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
     method public boolean isOverflowMenuShowing();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
     method public void setCollapseContentDescription(@StringRes int);
     method public void setCollapseContentDescription(CharSequence?);
     method public void setCollapseIcon(@DrawableRes int);
diff --git a/appcompat/appcompat/api/restricted_current.txt b/appcompat/appcompat/api/restricted_current.txt
index bd7a492..6055b36a 100644
--- a/appcompat/appcompat/api/restricted_current.txt
+++ b/appcompat/appcompat/api/restricted_current.txt
@@ -2036,10 +2036,13 @@
     method public void recycle();
   }
 
-  public class Toolbar extends android.view.ViewGroup {
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
     ctor public Toolbar(android.content.Context);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
     ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean canShowOverflowMenu();
     method public void collapseActionView();
     method public void dismissPopupMenus();
@@ -2075,9 +2078,11 @@
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
     method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
     method public boolean isOverflowMenuShowing();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
     method public void setCollapseContentDescription(@StringRes int);
     method public void setCollapseContentDescription(CharSequence?);
     method public void setCollapseIcon(@DrawableRes int);
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index 962d0ca..fa5e291 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -38,6 +38,7 @@
     androidTestImplementation(libs.espressoCore, excludes.espresso)
     androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1" )
     androidTestImplementation(project(":internal-testutils-appcompat"), {
         exclude group: "androidx.appcompat", module: "appcompat"
         exclude group: "androidx.core", module: "core"
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarMenuHostTest.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarMenuHostTest.kt
new file mode 100644
index 0000000..2a8153a
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarMenuHostTest.kt
@@ -0,0 +1,269 @@
+/*
+ * Copyright 2021 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.widget
+
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import androidx.core.R
+import androidx.core.view.MenuProvider
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.testing.TestLifecycleOwner
+import androidx.test.core.app.ActivityScenario
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class ToolbarMenuHostTest {
+
+    private val context = InstrumentationRegistry.getInstrumentation().context
+    private val menuProvider = object : MenuProvider {
+        override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+            menuInflater.inflate(R.menu.example_menu, menu)
+        }
+
+        override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+            return true
+        }
+    }
+
+    // Ensure original functionality still works
+    @Test
+    fun inflateMenuItemsManually() {
+        val toolbar = Toolbar(context)
+        toolbar.inflateMenu(R.menu.example_menu)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+    }
+
+    // Ensure original functionality still works
+    @Test
+    fun manuallyInflatedMenuItemSelected() {
+        with(ActivityScenario.launch(ToolbarTestActivity::class.java)) {
+            var itemSelectedId: Int? = null
+            val toolbar: Toolbar = withActivity {
+                findViewById(androidx.appcompat.test.R.id.toolbar)
+            }
+
+            withActivity {
+                toolbar.inflateMenu(R.menu.example_menu)
+                toolbar.setOnMenuItemClickListener {
+                    when (it.itemId) {
+                        R.id.item1, R.id.item2 -> {
+                            itemSelectedId = it.itemId
+                            true
+                        }
+                        else -> false
+                    }
+                }
+            }
+
+            toolbar.showOverflowMenu()
+            onView(withText("Item1")).perform(click())
+            assertThat(itemSelectedId).isEqualTo(R.id.item1)
+        }
+    }
+
+    @Test
+    fun providedMenuItemSelected() {
+        with(ActivityScenario.launch(ToolbarTestActivity::class.java)) {
+            var itemSelectedId: Int? = null
+            val toolbar: Toolbar = withActivity {
+                findViewById(androidx.appcompat.test.R.id.toolbar)
+            }
+
+            withActivity {
+                toolbar.addMenuProvider(object : MenuProvider {
+                    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+                        menuInflater.inflate(R.menu.example_menu, menu)
+                    }
+
+                    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+                        return when (menuItem.itemId) {
+                            R.id.item1, R.id.item2 -> {
+                                itemSelectedId = menuItem.itemId
+                                true
+                            }
+                            else -> false
+                        }
+                    }
+                })
+            }
+
+            toolbar.showOverflowMenu()
+            onView(withText("Item1")).perform(click())
+            assertThat(itemSelectedId).isEqualTo(R.id.item1)
+
+            withActivity {
+                toolbar.addMenuProvider(object : MenuProvider {
+                    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+                        menuInflater.inflate(R.menu.example_menu2, menu)
+                    }
+
+                    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+                        return when (menuItem.itemId) {
+                            R.id.item3, R.id.item4 -> {
+                                itemSelectedId = menuItem.itemId
+                                true
+                            }
+                            else -> false
+                        }
+                    }
+                })
+            }
+
+            toolbar.showOverflowMenu()
+            onView(withText("Item3")).perform(click())
+            assertThat(itemSelectedId).isEqualTo(R.id.item3)
+        }
+    }
+
+    @Test
+    fun addMenuProvider() {
+        val toolbar = Toolbar(context)
+        toolbar.addMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+    }
+
+    @Test
+    fun addMenuProvider_withLifecycle() {
+        val toolbar = Toolbar(context)
+        val lifecycleOwner = TestLifecycleOwner(Lifecycle.State.STARTED)
+
+        toolbar.addMenuProvider(menuProvider, lifecycleOwner)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+
+        lifecycleOwner.currentState = Lifecycle.State.DESTROYED
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+    }
+
+    @Test
+    fun addMenuProvider_withLifecycleAndState() {
+        val toolbar = Toolbar(context)
+        val lifecycleOwner = TestLifecycleOwner(Lifecycle.State.CREATED)
+
+        toolbar.addMenuProvider(menuProvider, lifecycleOwner, Lifecycle.State.RESUMED)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+
+        lifecycleOwner.currentState = Lifecycle.State.RESUMED
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+
+        lifecycleOwner.currentState = Lifecycle.State.CREATED
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+    }
+
+    @Test
+    fun removeMenuProvider() {
+        val toolbar = Toolbar(context)
+        toolbar.addMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+
+        toolbar.removeMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+    }
+
+    @Test
+    fun multipleMenuProviders() {
+        val toolbar = Toolbar(context)
+        val menuProvider2 = object : MenuProvider {
+            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+                menuInflater.inflate(R.menu.example_menu2, menu)
+            }
+
+            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+                return true
+            }
+        }
+
+        toolbar.addMenuProvider(menuProvider)
+        toolbar.addMenuProvider(menuProvider2)
+
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNotNull()
+
+        toolbar.removeMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNotNull()
+
+        toolbar.removeMenuProvider(menuProvider2)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNull()
+    }
+
+    @Test
+    fun invalidateMenu_inflateItemsManuallyThenAddProvider() {
+        val toolbar = Toolbar(context)
+        toolbar.inflateMenu(R.menu.example_menu2)
+
+        /** Internal call to [Toolbar.invalidateMenu] from [Toolbar.addMenuProvider] */
+        toolbar.addMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNotNull()
+
+        /** Internal call to [Toolbar.invalidateMenu] from [Toolbar.removeMenuProvider] */
+        toolbar.removeMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNotNull()
+    }
+
+    @Test
+    fun invalidateMenu_addProviderThenInflateItemsManually() {
+        val toolbar = Toolbar(context)
+
+        toolbar.addMenuProvider(menuProvider)
+        toolbar.inflateMenu(R.menu.example_menu2)
+
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNotNull()
+
+        /** Internal call to [Toolbar.invalidateMenu] from [Toolbar.removeMenuProvider] */
+        toolbar.removeMenuProvider(menuProvider)
+        assertThat(toolbar.menu.findItem(R.id.item1)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item2)).isNull()
+        assertThat(toolbar.menu.findItem(R.id.item3)).isNotNull()
+        assertThat(toolbar.menu.findItem(R.id.item4)).isNotNull()
+    }
+}
\ No newline at end of file
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 05ba0c2..9579fd3 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -20,6 +20,7 @@
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 import static androidx.annotation.RestrictTo.Scope.TESTS;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
@@ -44,6 +45,7 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.DrawableRes;
+import androidx.annotation.MainThread;
 import androidx.annotation.MenuRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -62,8 +64,13 @@
 import androidx.appcompat.view.menu.SubMenuBuilder;
 import androidx.core.view.GravityCompat;
 import androidx.core.view.MarginLayoutParamsCompat;
+import androidx.core.view.MenuHost;
+import androidx.core.view.MenuHostHelper;
+import androidx.core.view.MenuProvider;
 import androidx.core.view.ViewCompat;
 import androidx.customview.view.AbsSavedState;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
 import androidx.resourceinspection.annotation.Attribute;
 
 import java.util.ArrayList;
@@ -144,7 +151,7 @@
  * {@link androidx.appcompat.R.attr#titleTextColor}
  * {@link androidx.appcompat.R.attr#menu}
  */
-public class Toolbar extends ViewGroup {
+public class Toolbar extends ViewGroup implements MenuHost {
     private static final String TAG = "Toolbar";
 
     private ActionMenuView mMenuView;
@@ -199,13 +206,18 @@
 
     private final int[] mTempMargins = new int[2];
 
+    final MenuHostHelper mMenuHostHelper = new MenuHostHelper(this::invalidateMenu);
+    private ArrayList<MenuItem> mProvidedMenuItems = new ArrayList<>();
     OnMenuItemClickListener mOnMenuItemClickListener;
 
     private final ActionMenuView.OnMenuItemClickListener mMenuViewItemClickListener =
             new ActionMenuView.OnMenuItemClickListener() {
                 @Override
                 public boolean onMenuItemClick(MenuItem item) {
-                    if (mOnMenuItemClickListener != null) {
+                    boolean consumed = mMenuHostHelper.onMenuItemSelected(item);
+                    if (consumed) {
+                        return true;
+                    } else if (mOnMenuItemClickListener != null) {
                         return mOnMenuItemClickListener.onMenuItemClick(item);
                     }
                     return false;
@@ -2340,6 +2352,68 @@
         return mPopupContext;
     }
 
+    private ArrayList<MenuItem> getCurrentMenuItems() {
+        ArrayList<MenuItem> menuItems = new ArrayList<>();
+
+        Menu menu = getMenu();
+        for (int i = 0; i < menu.size(); i++) {
+            menuItems.add(menu.getItem(i));
+        }
+
+        return menuItems;
+    }
+
+    private void onCreateMenu() {
+        ArrayList<MenuItem> oldMenuItemList = getCurrentMenuItems();
+        mMenuHostHelper.onCreateMenu(getMenu(), getMenuInflater());
+
+        ArrayList<MenuItem> newMenuItemList = getCurrentMenuItems();
+        newMenuItemList.removeAll(oldMenuItemList);
+        mProvidedMenuItems = newMenuItemList;
+    }
+
+    @Override
+    @MainThread
+    public void addMenuProvider(@NonNull MenuProvider provider) {
+        mMenuHostHelper.addMenuProvider(provider);
+    }
+
+    @Override
+    @MainThread
+    public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner) {
+        mMenuHostHelper.addMenuProvider(provider, owner);
+    }
+
+    @Override
+    @MainThread
+    @SuppressLint("LambdaLast")
+    public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner,
+            @NonNull Lifecycle.State state) {
+        mMenuHostHelper.addMenuProvider(provider, owner, state);
+    }
+
+    @Override
+    @MainThread
+    public void removeMenuProvider(@NonNull MenuProvider provider) {
+        mMenuHostHelper.removeMenuProvider(provider);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Only the {@link MenuItem items} in the {@link Menu} that were provided by
+     * {@link MenuProvider}s should be removed and repopulated, leaving all manually
+     * inflated menu items untouched, as they should continue to be managed manually.
+     */
+    @Override
+    @MainThread
+    public void invalidateMenu() {
+        for (MenuItem menuItem : mProvidedMenuItems) {
+            getMenu().removeItem(menuItem.getItemId());
+        }
+        onCreateMenu();
+    }
+
     /**
      * Interface responsible for receiving menu item click events if the items themselves
      * do not have individual item click listeners.
diff --git a/appcompat/appcompat/src/main/res/values-mr/strings.xml b/appcompat/appcompat/src/main/res/values-mr/strings.xml
index e259e30..106fdcd 100644
--- a/appcompat/appcompat/src/main/res/values-mr/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-mr/strings.xml
@@ -21,7 +21,7 @@
     <string name="abc_action_bar_up_description" msgid="8388173803310557296">"वर नेव्‍हिगेट करा"</string>
     <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"आणखी पर्याय"</string>
     <string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"कोलॅप्स करा"</string>
-    <string name="abc_searchview_description_search" msgid="3417662926640357176">"Search"</string>
+    <string name="abc_searchview_description_search" msgid="3417662926640357176">"शोधा"</string>
     <string name="abc_search_hint" msgid="7208076849092622260">"शोधा…"</string>
     <string name="abc_searchview_description_query" msgid="693312494995508443">"शोध क्वेरी"</string>
     <string name="abc_searchview_description_clear" msgid="3741173234950517107">"क्‍वेरी साफ करा"</string>
@@ -33,7 +33,7 @@
     <string name="abc_shareactionprovider_share_with" msgid="8875138169939072951">"यांच्यासोबत शेअर करा"</string>
     <string name="abc_capital_on" msgid="884982626291842264">"सुरू"</string>
     <string name="abc_capital_off" msgid="4215997306490295099">"बंद"</string>
-    <string name="search_menu_title" msgid="6264217191555673260">"Search"</string>
+    <string name="search_menu_title" msgid="6264217191555673260">"शोध"</string>
     <string name="abc_prepend_shortcut_label" msgid="5520303668377388990">"मेनू+"</string>
     <string name="abc_menu_meta_shortcut_label" msgid="4192209724446364286">"Meta+"</string>
     <string name="abc_menu_ctrl_shortcut_label" msgid="2223301931652355242">"Ctrl+"</string>
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/MetricResult.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/MetricResult.kt
index 646e4ae..d9d99bb 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/MetricResult.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/MetricResult.kt
@@ -107,18 +107,18 @@
         return result
     }
 
-    internal companion object {
+    companion object {
         internal fun lerp(a: Double, b: Double, ratio: Double): Double {
             return (a * (1 - ratio) + b * (ratio))
         }
 
-        internal fun getPercentile(data: List<Double>, percentile: Int): Double {
-            val idealIndex = percentile.coerceIn(0, 100) / 100.0 * (data.size - 1)
+        fun getPercentile(sortedData: List<Double>, percentile: Int): Double {
+            val idealIndex = percentile.coerceIn(0, 100) / 100.0 * (sortedData.size - 1)
             val firstIndex = idealIndex.toInt()
             val secondIndex = firstIndex + 1
 
-            val firstValue = data[firstIndex]
-            val secondValue = data.getOrElse(secondIndex) { firstValue }
+            val firstValue = sortedData[firstIndex]
+            val secondValue = sortedData.getOrElse(secondIndex) { firstValue }
             return lerp(firstValue, secondValue, idealIndex - firstIndex)
         }
     }
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt
index 34adfb4..e7412a0 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/perfetto/PerfettoConfig.kt
@@ -133,7 +133,7 @@
 )
 
 /**
- * Global config for perfetto.
+ * Config for perfetto.
  *
  * Eventually, this should be more configurable.
  *
@@ -151,6 +151,7 @@
         ftraceDataSource(atraceApps),
         PROCESS_STATS_DATASOURCE,
         LINUX_SYS_STATS_DATASOURCE,
+        TraceConfig.DataSource(DataSourceConfig("android.surfaceflinger.frametimeline"))
     ),
 )
 
diff --git a/benchmark/benchmark-macro/api/restricted_current.txt b/benchmark/benchmark-macro/api/restricted_current.txt
index a15f30d..ada513d 100644
--- a/benchmark/benchmark-macro/api/restricted_current.txt
+++ b/benchmark/benchmark-macro/api/restricted_current.txt
@@ -36,6 +36,10 @@
     ctor public FrameTimingMetric();
   }
 
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class FrameTimingTraceMetric extends androidx.benchmark.macro.Metric {
+    ctor public FrameTimingTraceMetric();
+  }
+
   public final class IdeSummaryStringKt {
   }
 
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/FrameTimingQueryTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/FrameTimingQueryTest.kt
new file mode 100644
index 0000000..df2b10f
--- /dev/null
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/FrameTimingQueryTest.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2021 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.benchmark.macro.perfetto
+
+import androidx.benchmark.macro.createTempFileFromAsset
+import androidx.benchmark.macro.perfetto.FrameTimingQuery.FrameSubMetric.BasicFrameTime
+import androidx.benchmark.macro.perfetto.FrameTimingQuery.FrameSubMetric.FrameSlackTime
+import androidx.benchmark.macro.perfetto.FrameTimingQuery.FrameSubMetric.FrameTime
+import androidx.benchmark.macro.perfetto.FrameTimingQuery.FrameSubMetric.UiFrameTime
+import androidx.benchmark.perfetto.PerfettoHelper.Companion.isAbiSupported
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import org.junit.Assume.assumeTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+
+@RunWith(AndroidJUnit4::class)
+class FrameTimingQueryTest {
+    @MediumTest
+    @Test
+    fun fixedTrace28() {
+        assumeTrue(isAbiSupported())
+        val traceFile = createTempFileFromAsset("api28_scroll", ".perfetto-trace")
+
+        val frameSubMetrics = FrameTimingQuery.getFrameSubMetrics(
+            absoluteTracePath = traceFile.absolutePath,
+            captureApiLevel = 28,
+            packageName = "androidx.benchmark.integration.macrobenchmark.target"
+        )
+
+        assertEquals(
+            expected = mapOf(
+                BasicFrameTime to listOf(9907605L, 6038595L, 4812136L, 3938490L),
+                UiFrameTime to listOf(3086979L, 2868490L, 2232709L, 1889479L)
+            ),
+            actual = frameSubMetrics.mapValues {
+                it.value.subList(0, 4)
+            }
+        )
+        assertEquals(
+            expected = List(2) { 62 },
+            actual = frameSubMetrics.map { it.value.size },
+            message = "Expect same number of frames for each metric"
+        )
+    }
+
+    @MediumTest
+    @Test
+    fun fixedTrace31() {
+        assumeTrue(isAbiSupported())
+        val traceFile = createTempFileFromAsset("api31_scroll", ".perfetto-trace")
+
+        val frameSubMetrics = FrameTimingQuery.getFrameSubMetrics(
+            absoluteTracePath = traceFile.absolutePath,
+            captureApiLevel = 31,
+            packageName = "androidx.benchmark.integration.macrobenchmark.target"
+        )
+        assertEquals(
+            expected = mapOf(
+                FrameTime to listOf(15292863L, 8800138L, 6474705L, 8199845L),
+                BasicFrameTime to listOf(6881407L, 5648542L, 3830261L, 4343438L),
+                UiFrameTime to listOf(2965052L, 3246407L, 1562188L, 1945469L),
+                FrameSlackTime to listOf(5207137L, 11699862L, 14025295L, 12300155L)
+            ),
+            actual = frameSubMetrics.mapValues {
+                it.value.subList(0, 4)
+            }
+        )
+        assertEquals(
+            expected = List(4) { 96 },
+            actual = frameSubMetrics.map { it.value.size },
+            message = "Expect same number of frames for each metric"
+        )
+    }
+}
\ No newline at end of file
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt
index cf75adf..5bcd11c 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt
@@ -79,7 +79,7 @@
         val traceFile = createTempFileFromAsset("WarmStartup", ".trace")
         assertEquals(
             expected = listOf(
-                PerfettoTraceProcessor.Slice(
+                Slice(
                     name = "activityStart",
                     ts = 4131162160602,
                     dur = 17779012
@@ -89,12 +89,12 @@
         )
         assertEquals(
             expected = listOf(
-                PerfettoTraceProcessor.Slice(
+                Slice(
                     name = "activityStart",
                     ts = 4131162160602,
                     dur = 17779012
                 ),
-                PerfettoTraceProcessor.Slice(
+                Slice(
                     name = "activityResume",
                     ts = 4131180586020,
                     dur = 3398750
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
index 4fcb36f..0027638 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Metric.kt
@@ -16,8 +16,12 @@
 
 package androidx.benchmark.macro
 
+import android.os.Build
 import androidx.annotation.RequiresApi
+import androidx.annotation.RestrictTo
+import androidx.benchmark.MetricResult
 import androidx.benchmark.Shell
+import androidx.benchmark.macro.perfetto.FrameTimingQuery
 import androidx.benchmark.macro.perfetto.PerfettoResultsParser.parseStartupResult
 import androidx.benchmark.macro.perfetto.PerfettoTraceProcessor
 import androidx.test.platform.app.InstrumentationRegistry
@@ -133,6 +137,38 @@
 }
 
 /**
+ * WIP trace-based replacement for [FrameTimingMetric].
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@Suppress("CanSealedSubClassBeObject")
+public class FrameTimingTraceMetric : Metric() {
+    internal override fun configure(packageName: String) {}
+    internal override fun start() {}
+    internal override fun stop() {}
+
+    internal override fun getMetrics(packageName: String, tracePath: String): MetricsWithUiState {
+        val frameTimesMs = FrameTimingQuery.getFrameSubMetrics(
+            absoluteTracePath = tracePath,
+            captureApiLevel = Build.VERSION.SDK_INT,
+            packageName = packageName
+        )[FrameTimingQuery.FrameSubMetric.FrameTime]!!
+            .sorted()
+            .map { it / 1_000_000.0 } // Convert to ms
+
+        fun percentile(percentile: Int) = MetricResult.getPercentile(frameTimesMs, percentile)
+        return MetricsWithUiState(
+            metrics = mapOf(
+                "trace_frameTime50thPercentileMs" to percentile(50),
+                "trace_frameTime90thPercentileMs" to percentile(90),
+                "trace_frameTime95thPercentileMs" to percentile(95),
+                "trace_frameTime99thPercentileMs" to percentile(99),
+                "trace_totalFrameCount" to frameTimesMs.size.toDouble()
+            )
+        )
+    }
+}
+
+/**
  * Captures app startup timing metrics.
  */
 @Suppress("CanSealedSubClassBeObject")
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/FrameTimingQuery.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/FrameTimingQuery.kt
new file mode 100644
index 0000000..111329a
--- /dev/null
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/FrameTimingQuery.kt
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2021 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.benchmark.macro.perfetto
+
+internal object FrameTimingQuery {
+    private fun getFullQuery(processName: String) = """
+        ------ Select all frame-relevant slices from slice table
+        SELECT
+            slice.name as name,
+            slice.ts as ts,
+            slice.dur as dur
+        FROM slice
+            INNER JOIN thread_track on slice.track_id = thread_track.id
+            INNER JOIN thread USING(utid)
+            INNER JOIN process USING(upid)
+        WHERE (
+            ( slice.name LIKE "Choreographer#doFrame%" AND process.pid LIKE thread.tid ) OR
+            ( slice.name LIKE "DrawFrame%" AND thread.name like "RenderThread" )
+        ) AND (process.name LIKE "$processName")
+        ------ Add in actual frame slices (prepended with "actual " to differentiate)
+        UNION
+        SELECT
+            "actual " || actual_frame_timeline_slice.name as name,
+            actual_frame_timeline_slice.ts as ts,
+            actual_frame_timeline_slice.dur as dur
+        FROM actual_frame_timeline_slice
+            INNER JOIN process USING(upid)
+        WHERE
+            process.name LIKE "$processName"
+        ------ Add in expected time slices (prepended with "expected " to differentiate)
+        UNION
+        SELECT
+            "expected " || expected_frame_timeline_slice.name as name,
+            expected_frame_timeline_slice.ts as ts,
+            expected_frame_timeline_slice.dur as dur
+        FROM expected_frame_timeline_slice
+            INNER JOIN process USING(upid)
+        WHERE
+            process.name LIKE "$processName"
+        ORDER BY ts ASC
+    """.trimIndent()
+
+    enum class FrameSubMetric {
+        FrameTime,
+        BasicFrameTime,
+        UiFrameTime,
+        FrameSlackTime;
+
+        fun supportedOnApiLevel(apiLevel: Int): Boolean {
+            return apiLevel >= 31 || this != FrameTime && this != FrameSlackTime
+        }
+    }
+
+    enum class FrameSliceType {
+        Expected,
+        Actual,
+        UiThread,
+        RenderThread
+    }
+
+    /**
+     * Container for frame data.
+     *
+     * Nullable slices are always present on API 31+
+     */
+    private class FrameData(
+        val uiSlice: Slice,
+        val rtSlice: Slice,
+        val expectedSlice: Slice?,
+        val actualSlice: Slice?
+    ) {
+        fun get(subMetric: FrameSubMetric): Long {
+            return when (subMetric) {
+                FrameSubMetric.FrameTime -> actualSlice!!.dur
+                FrameSubMetric.BasicFrameTime -> rtSlice.endTs - uiSlice.ts
+                FrameSubMetric.UiFrameTime -> uiSlice.dur
+                FrameSubMetric.FrameSlackTime -> expectedSlice!!.endTs - actualSlice!!.endTs
+            }
+        }
+        companion object {
+            fun tryCreateBasic(
+                uiSlice: Slice?,
+                rtSlice: Slice?
+            ): FrameData? {
+                return uiSlice?.let {
+                    rtSlice?.let {
+                        FrameData(uiSlice, rtSlice, null, null)
+                    }
+                }
+            }
+
+            fun tryCreate31(
+                uiSlice: Slice?,
+                rtSlice: Slice?,
+                expectedSlice: Slice?,
+                actualSlice: Slice?,
+            ): FrameData? {
+                return if (uiSlice != null &&
+                    rtSlice != null &&
+                    expectedSlice != null &&
+                    actualSlice != null
+                ) {
+                    FrameData(uiSlice, rtSlice, expectedSlice, actualSlice)
+                } else {
+                    null
+                }
+            }
+        }
+    }
+
+    /**
+     * Binary search for a slice matching the specified frameId, or null if not found.
+     */
+    private fun List<Slice>.binarySearchFrameId(frameId: Int): Slice? {
+        val targetIndex = binarySearch { potentialTarget ->
+            potentialTarget.frameId!! - frameId
+        }
+        return if (targetIndex >= 0) {
+            get(targetIndex)
+        } else {
+            null
+        }
+    }
+
+    fun getFrameSubMetrics(
+        absoluteTracePath: String,
+        captureApiLevel: Int,
+        packageName: String,
+    ): Map<FrameSubMetric, List<Long>> {
+        val queryResult = PerfettoTraceProcessor.rawQuery(
+            absoluteTracePath = absoluteTracePath,
+            query = getFullQuery(packageName)
+        )
+        val slices = Slice.parseListFromQueryResult(queryResult).let { list ->
+            list.map { it.copy(ts = it.ts - list.first().ts) }
+        }
+
+        val groupedData = slices
+            .filter { it.dur > 0 } // drop non-terminated slices
+            .groupBy {
+                when {
+                    // note: we use "startsWith" as starting in S, all of these will end
+                    // with frame ID (or GPU completion frame ID)
+                    it.name.startsWith("Choreographer#doFrame") -> FrameSliceType.UiThread
+                    it.name.startsWith("DrawFrame") -> FrameSliceType.RenderThread
+                    it.name.startsWith("actual ") -> FrameSliceType.Actual
+                    it.name.startsWith("expected ") -> FrameSliceType.Expected
+                    else -> throw IllegalStateException("Unexpected slice $it")
+                }
+            }
+
+        val uiSlices = groupedData.getOrElse(FrameSliceType.UiThread) { listOf() }
+        val rtSlices = groupedData.getOrElse(FrameSliceType.RenderThread) { listOf() }
+        val actualSlices = groupedData.getOrElse(FrameSliceType.Actual) { listOf() }
+        val expectedSlices = groupedData.getOrElse(FrameSliceType.Expected) { listOf() }
+
+        if (uiSlices.isEmpty()) {
+            return emptyMap()
+        }
+
+        // check data looks reasonable
+        val newSlicesShouldBeEmpty = captureApiLevel < 31
+        require(actualSlices.isEmpty() == newSlicesShouldBeEmpty)
+        require(expectedSlices.isEmpty() == newSlicesShouldBeEmpty)
+
+        val frameData = if (captureApiLevel >= 31) {
+            // No slice should be missing a frameId
+            require(slices.none { it.frameId == null })
+            rtSlices.mapNotNull { rtSlice ->
+                val frameId = rtSlice.frameId!!
+                FrameData.tryCreate31(
+                    uiSlice = uiSlices.binarySearchFrameId(frameId),
+                    rtSlice = rtSlice,
+                    expectedSlice = expectedSlices.binarySearchFrameId(frameId),
+                    actualSlice = actualSlices.binarySearchFrameId(frameId)
+                )
+            }
+        } else {
+            require(slices.none { it.frameId != null })
+            rtSlices.mapNotNull { rtSlice ->
+                FrameData.tryCreateBasic(
+                    uiSlice = uiSlices.firstOrNull { it.contains(rtSlice.ts) },
+                    rtSlice = rtSlice
+                )
+            }
+        }
+
+        return FrameSubMetric.values()
+            .filter { it.supportedOnApiLevel(captureApiLevel) }
+            .associateWith { subMetric ->
+                frameData.map { frame -> frame.get(subMetric) }
+            }
+    }
+}
\ No newline at end of file
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
index 1c37f26..68803a4c 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
@@ -70,17 +70,6 @@
         return json
     }
 
-    data class Slice(
-        val name: String,
-        val ts: Long,
-        val dur: Long
-    )
-
-    private fun String.unquote(): String {
-        require(this.first() == '"' && this.last() == '"')
-        return this.substring(1, length - 1)
-    }
-
     /**
      * Query a trace for a list of slices - name, timestamp, and duration.
      */
@@ -93,36 +82,20 @@
                 "slice.name = '$it'"
             }
 
-        val queryResult = rawQuery(
-            absoluteTracePath = absoluteTracePath,
-            query = """
+        return Slice.parseListFromQueryResult(
+            queryResult = rawQuery(
+                absoluteTracePath = absoluteTracePath,
+                query = """
                 SELECT slice.name,ts,dur
                 FROM slice
                 JOIN thread_track ON thread_track.id = slice.track_id
                 WHERE $whereClause
             """.trimMargin()
+            )
         )
-        val resultLines = queryResult.split("\n")
-
-        if (resultLines.first() != "\"name\",\"ts\",\"dur\"") {
-            throw IllegalStateException("query failed!")
-        }
-
-        // results are in CSV with a header row, and strings wrapped with quotes
-        return resultLines
-            .filter { it.isNotBlank() } // drop blank lines
-            .drop(1) // drop the header row
-            .map {
-                val columns = it.split(",")
-                Slice(
-                    name = columns[0].unquote(),
-                    ts = columns[1].toLong(),
-                    dur = columns[2].toLong()
-                )
-            }
     }
 
-    private fun rawQuery(
+    internal fun rawQuery(
         absoluteTracePath: String,
         query: String
     ): String {
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/Slice.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/Slice.kt
new file mode 100644
index 0000000..6cb490d
--- /dev/null
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/Slice.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 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.benchmark.macro.perfetto
+
+internal data class Slice(
+    val name: String,
+    val ts: Long,
+    val dur: Long
+) {
+    val endTs: Long = ts + dur
+    val frameId = name.substringAfterLast(" ").toIntOrNull()
+
+    fun contains(targetTs: Long): Boolean {
+        return targetTs >= ts && targetTs <= (ts + dur)
+    }
+
+    companion object {
+        private fun String.unquote(): String {
+            require(this.first() == '"' && this.last() == '"')
+            return this.substring(1, length - 1)
+        }
+
+        fun parseListFromQueryResult(queryResult: String): List<Slice> {
+            val resultLines = queryResult.split("\n").onEach {
+                println("query result line $it")
+            }
+
+            if (resultLines.first() != "\"name\",\"ts\",\"dur\"") {
+                throw IllegalStateException("query failed!")
+            }
+
+            // results are in CSV with a header row, and strings wrapped with quotes
+            return resultLines
+                .filter { it.isNotBlank() } // drop blank lines
+                .drop(1) // drop the header row
+                .map {
+                    val columns = it.split(",")
+                    Slice(
+                        name = columns[0].unquote(),
+                        ts = columns[1].toLong(),
+                        dur = columns[2].toLong()
+                    )
+                }
+        }
+    }
+}
\ No newline at end of file
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt
index d82ed03e..605f409 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt
@@ -20,6 +20,7 @@
 import android.graphics.Point
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.FrameTimingMetric
+import androidx.benchmark.macro.FrameTimingTraceMetric
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -52,7 +53,7 @@
     fun start() {
         benchmarkRule.measureRepeated(
             packageName = PACKAGE_NAME,
-            metrics = listOf(FrameTimingMetric()),
+            metrics = listOf(FrameTimingMetric(), FrameTimingTraceMetric()),
             compilationMode = compilationMode,
             iterations = 10,
             setupBlock = {
@@ -64,7 +65,7 @@
             val recycler = device.findObject(By.res(PACKAGE_NAME, RESOURCE_ID))
             // Setting a gesture margin is important otherwise gesture nav is triggered.
             recycler.setGestureMargin(device.displayWidth / 5)
-            for (i in 1..10) {
+            repeat(10) {
                 // From center we scroll 2/3 of it which is 1/3 of the screen.
                 recycler.drag(Point(0, recycler.visibleCenter.y / 3))
                 device.waitForIdle()
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
index 4c378cd..97bdbb9 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
@@ -123,6 +123,11 @@
  */
 const val KMP_GITHUB_BUILD = "androidx.github.build"
 
+/**
+ * If true, include mac targets when building KMP
+ */
+const val KMP_ENABLE_MAC = "androidx.kmp.mac.enabled"
+
 val ALL_ANDROIDX_PROPERTIES = setOf(
     ALL_WARNINGS_AS_ERRORS,
     ALTERNATIVE_PROJECT_URL,
@@ -145,7 +150,8 @@
     PLAYGROUND_SNAPSHOT_BUILD_ID,
     PLAYGROUND_METALAVA_BUILD_ID,
     PLAYGROUND_DOKKA_BUILD_ID,
-    KMP_GITHUB_BUILD
+    KMP_GITHUB_BUILD,
+    KMP_ENABLE_MAC
 )
 
 /**
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
index a3f1cba..79a48de 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -20,7 +20,7 @@
  * The list of versions codes of all the libraries in this project.
  */
 object LibraryVersions {
-    val ACTIVITY = Version("1.4.0-alpha02")
+    val ACTIVITY = Version("1.4.0-alpha03")
     val ADS_IDENTIFIER = Version("1.0.0-alpha05")
     val ANNOTATION = Version("1.3.0-alpha01")
     val ANNOTATION_EXPERIMENTAL = Version("1.2.0-alpha01")
@@ -31,7 +31,7 @@
     val AUTOFILL = Version("1.2.0-beta02")
     val BENCHMARK = Version("1.1.0-alpha08")
     val BIOMETRIC = Version("1.2.0-alpha03")
-    val BROWSER = Version("1.4.0-alpha01")
+    val BROWSER = Version("1.4.0-alpha02")
     val BUILDSRC_TESTS = Version("1.0.0-alpha01")
     val CAMERA = Version("1.1.0-alpha09")
     val CAMERA_EXTENSIONS = Version("1.0.0-alpha29")
@@ -44,13 +44,14 @@
     val COLLECTION2 = Version("1.2.0-alpha02")
     val CONTENTPAGER = Version("1.1.0-alpha01")
     val COMPOSE_MATERIAL3 = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha01")
-    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha04")
+    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha05")
     val COORDINATORLAYOUT = Version("1.2.0-alpha01")
-    val CORE = Version("1.7.0-alpha03")
+    val CORE = Version("1.7.0-beta02")
     val CORE_ANIMATION = Version("1.0.0-alpha03")
     val CORE_ANIMATION_TESTING = Version("1.0.0-alpha03")
     val CORE_APPDIGEST = Version("1.0.0-alpha01")
     val CORE_GOOGLE_SHORTCUTS = Version("1.1.0-alpha02")
+    val CORE_REMOTEVIEWS = Version("1.0.0-alpha01")
     val CORE_ROLE = Version("1.1.0-alpha02")
     val CORE_SPLASHSCREEN = Version("1.0.0-alpha01")
     val CURSORADAPTER = Version("1.1.0-alpha01")
@@ -62,10 +63,10 @@
     val DYNAMICANIMATION = Version("1.1.0-alpha04")
     val DYNAMICANIMATION_KTX = Version("1.0.0-alpha04")
     val EMOJI = Version("1.2.0-alpha03")
-    val EMOJI2 = Version("1.0.0-alpha03")
+    val EMOJI2 = Version("1.0.0-beta02")
     val ENTERPRISE = Version("1.1.0-rc01")
     val EXIFINTERFACE = Version("1.4.0-alpha01")
-    val FRAGMENT = Version("1.4.0-alpha09")
+    val FRAGMENT = Version("1.4.0-alpha10")
     val FUTURES = Version("1.2.0-alpha01")
     val GLANCE = Version("1.0.0-alpha01")
     val GRIDLAYOUT = Version("1.1.0-alpha01")
@@ -82,26 +83,26 @@
     val LEANBACK_TAB = Version("1.1.0-beta01")
     val LEGACY = Version("1.1.0-alpha01")
     val LOCALBROADCASTMANAGER = Version("1.1.0-alpha02")
-    val LIFECYCLE = Version("2.4.0-beta01")
+    val LIFECYCLE = Version("2.4.0-rc01")
     val LIFECYCLE_VIEWMODEL_COMPOSE = Version("1.0.0-alpha08")
     val LIFECYCLE_EXTENSIONS = Version("2.2.0")
     val LOADER = Version("1.2.0-alpha01")
     val MEDIA = Version("1.5.0-alpha01")
     val MEDIA2 = Version("1.3.0-alpha01")
     val MEDIAROUTER = Version("1.3.0-alpha01")
-    val NAVIGATION = Version("2.4.0-alpha09")
-    val PAGING = Version("3.1.0-alpha04")
-    val PAGING_COMPOSE = Version("1.0.0-alpha13")
+    val NAVIGATION = Version("2.4.0-alpha10")
+    val PAGING = Version("3.1.0-alpha05")
+    val PAGING_COMPOSE = Version("1.0.0-alpha14")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-beta01")
     val PERCENTLAYOUT = Version("1.1.0-alpha01")
     val PREFERENCE = Version("1.2.0-alpha01")
-    val PROFILEINSTALLER = Version("1.1.0-alpha05")
+    val PROFILEINSTALLER = Version("1.1.0-alpha06")
     val RECOMMENDATION = Version("1.1.0-alpha01")
-    val RECYCLERVIEW = Version("1.3.0-alpha01")
+    val RECYCLERVIEW = Version("1.3.0-alpha02")
     val RECYCLERVIEW_SELECTION = Version("1.2.0-alpha02")
     val REMOTECALLBACK = Version("1.0.0-alpha02")
-    val RESOURCEINSPECTION = Version("1.0.0-beta01")
+    val RESOURCEINSPECTION = Version("1.0.0-beta02")
     val ROOM = Version("2.4.0-alpha05")
     val SAVEDSTATE = Version("1.2.0-alpha01")
     val SECURITY = Version("1.1.0-alpha04")
@@ -129,27 +130,27 @@
     val VECTORDRAWABLE_ANIMATED = Version("1.2.0-alpha01")
     val VECTORDRAWABLE_SEEKABLE = Version("1.0.0-alpha03")
     val VERSIONED_PARCELABLE = Version("1.2.0-alpha01")
-    val VIEWPAGER = Version("1.1.0-alpha01")
+    val VIEWPAGER = Version("1.1.0-alpha02")
     val VIEWPAGER2 = Version("1.1.0-beta02")
     val WEAR = Version("1.3.0-alpha01")
-    val WEAR_COMPLICATIONS_DATA = Version("1.0.0-alpha22")
-    val WEAR_COMPLICATIONS_DATA_SOURCE = Version("1.0.0-alpha22")
-    val WEAR_COMPLICATIONS_DATA_SOURCE_KTX = Version("1.0.0-alpha22")
-    val WEAR_COMPOSE = Version("1.0.0-alpha06")
-    val WEAR_INPUT = Version("1.2.0-alpha01")
+    val WEAR_COMPLICATIONS_DATA = Version("1.0.0-alpha23")
+    val WEAR_COMPLICATIONS_DATA_SOURCE = Version("1.0.0-alpha23")
+    val WEAR_COMPLICATIONS_DATA_SOURCE_KTX = Version("1.0.0-alpha23")
+    val WEAR_COMPOSE = Version("1.0.0-alpha07")
+    val WEAR_INPUT = Version("1.2.0-alpha02")
     val WEAR_INPUT_TESTING = WEAR_INPUT
     val WEAR_ONGOING = Version("1.1.0-alpha01")
-    val WEAR_PHONE_INTERACTIONS = Version("1.1.0-alpha01")
+    val WEAR_PHONE_INTERACTIONS = Version("1.1.0-alpha02")
     val WEAR_REMOTE_INTERACTIONS = Version("1.1.0-alpha01")
     val WEAR_TILES = Version("1.0.0-alpha12")
-    val WEAR_WATCHFACE = Version("1.0.0-alpha22")
-    val WEAR_WATCHFACE_CLIENT = Version("1.0.0-alpha22")
+    val WEAR_WATCHFACE = Version("1.0.0-alpha23")
+    val WEAR_WATCHFACE_CLIENT = Version("1.0.0-alpha23")
     val WEAR_WATCHFACE_CLIENT_GUAVA = WEAR_WATCHFACE_CLIENT
-    val WEAR_WATCHFACE_COMPLICATIONS_RENDERING = Version("1.0.0-alpha22")
-    val WEAR_WATCHFACE_DATA = Version("1.0.0-alpha22")
-    val WEAR_WATCHFACE_EDITOR = Version("1.0.0-alpha22")
+    val WEAR_WATCHFACE_COMPLICATIONS_RENDERING = Version("1.0.0-alpha23")
+    val WEAR_WATCHFACE_DATA = Version("1.0.0-alpha23")
+    val WEAR_WATCHFACE_EDITOR = Version("1.0.0-alpha23")
     val WEAR_WATCHFACE_EDITOR_GUAVA = WEAR_WATCHFACE_EDITOR
-    val WEAR_WATCHFACE_STYLE = Version("1.0.0-alpha22")
+    val WEAR_WATCHFACE_STYLE = Version("1.0.0-alpha23")
     val WEBKIT = Version("1.5.0-alpha01")
     val WINDOW = Version("1.0.0-beta03")
     val WINDOW_EXTENSIONS = Version("1.0.0-alpha01")
diff --git a/busytown/androidx_incremental.sh b/busytown/androidx_incremental.sh
index c6e659b..d11eb1e 100755
--- a/busytown/androidx_incremental.sh
+++ b/busytown/androidx_incremental.sh
@@ -47,7 +47,11 @@
 else
   zipKotlinMetadata
   echo build failed
-  EXIT_VALUE=1
+  if echo "$BUILD_NUMBER" | grep "P"; then
+    echo androidx_incremental ignoring presubmit failure
+  else
+    EXIT_VALUE=1
+  fi
 fi
 
 # Parse performance profile reports (generated with the --profile option above) and re-export the metrics in an easily machine-readable format for tracking
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java
index 5719703..d2684cb 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java
@@ -15,10 +15,14 @@
  */
 package androidx.camera.camera2.impl;
 
+import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureResult;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.camera.camera2.internal.Camera2CameraCaptureFailure;
 import androidx.camera.camera2.internal.Camera2CameraCaptureResult;
+import androidx.camera.core.impl.CameraCaptureFailure;
 import androidx.camera.core.impl.CameraCaptureResult;
 
 /**
@@ -40,5 +44,20 @@
         }
     }
 
+    /**
+     * Converts {@link CameraCaptureFailure} to camera2 {@link CaptureFailure}.
+     *
+     * @return The CaptureFailure instance or {@code null} if there is no underlying CaptureFailure.
+     */
+    @Nullable
+    public static CaptureFailure getCaptureFailure(
+            @NonNull CameraCaptureFailure cameraCaptureFailure) {
+        if (cameraCaptureFailure instanceof Camera2CameraCaptureFailure) {
+            return ((Camera2CameraCaptureFailure) cameraCaptureFailure).getCaptureFailure();
+        } else {
+            return null;
+        }
+    }
+
     private Camera2CameraCaptureResultConverter() {}
 }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverterTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverterTest.java
index e072247..60d064b 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverterTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverterTest.java
@@ -18,10 +18,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureResult;
 import android.os.Build;
 
+import androidx.camera.camera2.internal.Camera2CameraCaptureFailure;
 import androidx.camera.camera2.internal.Camera2CameraCaptureResult;
+import androidx.camera.core.impl.CameraCaptureFailure;
 import androidx.camera.core.impl.CameraCaptureResult;
 import androidx.camera.core.impl.TagBundle;
 
@@ -59,4 +62,28 @@
 
         assertThat(captureResult).isNull();
     }
+
+    @Test
+    public void canRetrieveCaptureFailure() {
+        CaptureFailure captureFailure = Mockito.mock(CaptureFailure.class);
+        CameraCaptureFailure cameraCaptureFailure =
+                new Camera2CameraCaptureFailure(CameraCaptureFailure.Reason.ERROR, captureFailure);
+
+        CaptureFailure retrievedCaptureResult =
+                Camera2CameraCaptureResultConverter.getCaptureFailure(
+                cameraCaptureFailure);
+
+        assertThat(retrievedCaptureResult).isSameInstanceAs(captureFailure);
+    }
+
+    @Test
+    public void retrieveNullIfNotCamera2CameraCaptureFailure() {
+        CameraCaptureFailure cameraCaptureFailure =
+                new CameraCaptureFailure(CameraCaptureFailure.Reason.ERROR);
+
+        CaptureFailure captureFailure = Camera2CameraCaptureResultConverter.getCaptureFailure(
+                cameraCaptureFailure);
+
+        assertThat(captureFailure).isNull();
+    }
 }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
index c4c3dc9..bbd6f61 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
@@ -31,12 +31,15 @@
 import android.util.Size;
 
 import androidx.annotation.NonNull;
+import androidx.camera.core.impl.CameraCaptureCallback;
+import androidx.camera.core.impl.CameraCaptureMetaData;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.ImageCaptureConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.fakes.FakeCamera;
+import androidx.camera.testing.fakes.FakeCameraCaptureResult;
 import androidx.camera.testing.fakes.FakeCameraControl;
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager;
 import androidx.camera.testing.fakes.FakeImageInfo;
@@ -62,6 +65,8 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
@@ -192,18 +197,56 @@
                 ImageCapture.ERROR_CAPTURE_FAILED);
     }
 
-    // TODO(b/149336664): add a test to verify jpeg quality is 100 when CaptureMode is MAX_QUALITY.
-    @SuppressWarnings("unchecked")
     @Test
-    public void captureWithMinLatency_jpegQualityIs95() throws InterruptedException {
+    public void captureWithMinLatency_jpegQualityIs95() {
+        List<CaptureConfig> captureConfigs =
+                captureWithCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY);
+        assertThat(hasJpegQuality(captureConfigs, 95)).isTrue();
+    }
+
+    @Test
+    public void captureWithMaxQuality_jpegQualityIs100() {
+        List<CaptureConfig> captureConfigs =
+                captureWithCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY);
+        assertThat(hasJpegQuality(captureConfigs, 100)).isTrue();
+    }
+
+    @NonNull
+    private List<CaptureConfig> captureWithCaptureMode(
+            @ImageCapture.CaptureMode int captureMode) {
         // Arrange.
-        ImageCapture imageCapture = createImageCapture();
+        ImageCapture imageCapture = new ImageCapture.Builder()
+                .setCaptureMode(captureMode)
+                .build();
+
         mInstrumentation.runOnMainSync(() -> {
             try {
                 mCameraUseCaseAdapter.addUseCases(Collections.singleton(imageCapture));
             } catch (CameraUseCaseAdapter.CameraException ignore) {
             }
         });
+
+        ScheduledExecutorService repeatingScheduledExecutorService = null;
+
+        // Sets repeating capture result to the imageCapture's session config repeating capture
+        // callbacks to make ImageCapture#preTakePicture can be completed when capture mode is
+        // set as CAPTURE_MODE_MAXIMIZE_QUALITY.
+        if (captureMode == ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY) {
+            FakeCameraCaptureResult fakeCameraCaptureResult = new FakeCameraCaptureResult();
+            fakeCameraCaptureResult.setAfState(CameraCaptureMetaData.AfState.LOCKED_FOCUSED);
+            fakeCameraCaptureResult.setAeState(CameraCaptureMetaData.AeState.CONVERGED);
+            fakeCameraCaptureResult.setAwbState(CameraCaptureMetaData.AwbState.CONVERGED);
+
+            repeatingScheduledExecutorService = Executors.newScheduledThreadPool(1);
+
+            repeatingScheduledExecutorService.scheduleAtFixedRate(() -> {
+                for (CameraCaptureCallback callback :
+                        imageCapture.getSessionConfig().getRepeatingCameraCaptureCallbacks()) {
+                    callback.onCaptureCompleted(fakeCameraCaptureResult);
+                }
+            }, 0, 50, TimeUnit.MILLISECONDS);
+        }
+
         FakeCameraControl fakeCameraControl =
                 ((FakeCameraControl) mCameraUseCaseAdapter.getCameraControl());
         FakeCameraControl.OnNewCaptureRequestListener mockCaptureRequestListener =
@@ -216,11 +259,18 @@
                         mock(ImageCapture.OnImageCapturedCallback.class)));
 
         // Assert.
+        @SuppressWarnings("unchecked")
         ArgumentCaptor<List<CaptureConfig>> argumentCaptor =
                 ArgumentCaptor.forClass(List.class);
         verify(mockCaptureRequestListener,
                 timeout(1000).times(1)).onNewCaptureRequests(argumentCaptor.capture());
-        assertThat(hasJpegQuality(argumentCaptor.getValue(), (byte) 95)).isTrue();
+
+        List<CaptureConfig> captureConfigs = argumentCaptor.getValue();
+        if (repeatingScheduledExecutorService != null) {
+            repeatingScheduledExecutorService.shutdown();
+        }
+
+        return captureConfigs;
     }
 
     @Test
@@ -379,7 +429,7 @@
         assertThat(resolutionInfo.getCropRect()).isEqualTo(new Rect(0, 60, 640, 420));
     }
 
-    private boolean hasJpegQuality(List<CaptureConfig> captureConfigs, byte jpegQuality) {
+    private boolean hasJpegQuality(List<CaptureConfig> captureConfigs, int jpegQuality) {
         for (CaptureConfig captureConfig : captureConfigs) {
             if (jpegQuality == captureConfig.getImplementationOptions().retrieveOption(
                     CaptureConfig.OPTION_JPEG_QUALITY)) {
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
index 926aa30..4389db1 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
@@ -30,6 +30,7 @@
 import androidx.annotation.NonNull;
 import androidx.camera.core.impl.DeferrableSurface;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+import androidx.camera.testing.GarbageCollectionUtil;
 import androidx.camera.testing.fakes.FakeCamera;
 import androidx.core.content.ContextCompat;
 import androidx.core.util.Consumer;
@@ -58,27 +59,9 @@
             SurfaceRequest.TransformationInfo.of(new Rect(), 0, Surface.ROTATION_0);
     private static final Consumer<SurfaceRequest.Result> NO_OP_RESULT_LISTENER = ignored -> {
     };
-    private static final long FINALIZE_TIMEOUT_MILLIS = 200L;
-    private static final int NUM_GC_ITERATIONS = 10;
     private static final Surface MOCK_SURFACE = mock(Surface.class);
     private final List<SurfaceRequest> mSurfaceRequests = new ArrayList<>();
 
-    private static void runFinalization() throws TimeoutException, InterruptedException {
-        ReferenceQueue<Object> finalizeAwaitQueue = new ReferenceQueue<>();
-        PhantomReference<Object> finalizeSignal;
-        // Ensure finalization occurs multiple times
-        for (int i = 0; i < NUM_GC_ITERATIONS; ++i) {
-            finalizeSignal = new PhantomReference<>(new Object(), finalizeAwaitQueue);
-            Runtime.getRuntime().gc();
-            Runtime.getRuntime().runFinalization();
-            if (finalizeAwaitQueue.remove(FINALIZE_TIMEOUT_MILLIS) == null) {
-                throw new TimeoutException(
-                        "Finalization failed on iteration " + (i + 1) + " of " + NUM_GC_ITERATIONS);
-            }
-            finalizeSignal.clear();
-        }
-    }
-
     @After
     public void tearDown() {
         // Ensure all requests complete
@@ -264,7 +247,7 @@
             // Null out the original reference to the SurfaceRequest. DeferrableSurface should be
             // the only reference remaining.
             request = null;
-            runFinalization();
+            GarbageCollectionUtil.runFinalization();
             boolean requestFinalized = (referenceQueue.poll() != null);
 
             // Assert.
@@ -295,7 +278,7 @@
             // Null out the original reference to the DeferrableSurface. SurfaceRequest should be
             // the only reference remaining.
             deferrableSurface = null;
-            runFinalization();
+            GarbageCollectionUtil.runFinalization();
             boolean deferrableSurfaceFinalized = (referenceQueue.poll() != null);
 
             // Assert.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
index c432361..7915f33 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
@@ -37,6 +37,7 @@
 import androidx.camera.extensions.impl.advanced.BokehAdvancedExtenderImpl;
 import androidx.camera.extensions.impl.advanced.HdrAdvancedExtenderImpl;
 import androidx.camera.extensions.impl.advanced.NightAdvancedExtenderImpl;
+import androidx.camera.extensions.internal.sessionprocessor.AdvancedSessionProcessor;
 import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
@@ -144,7 +145,7 @@
     @Override
     public SessionProcessor createSessionProcessor(@NonNull Context context) {
         Preconditions.checkNotNull(mCameraId, "VendorExtender#init() must be called first");
-        //TODO: To be implemented in later CLs.
-        return null;
+        return new AdvancedSessionProcessor(
+                mAdvancedExtenderImpl.createSessionProcessor(), context);
     }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java
new file mode 100644
index 0000000..b4a33c9
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java
@@ -0,0 +1,464 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.content.Context;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
+import android.media.Image;
+import android.util.Size;
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.camera2.impl.Camera2CameraCaptureResultConverter;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
+import androidx.camera.camera2.interop.CaptureRequestOptions;
+import androidx.camera.core.impl.CameraCaptureFailure;
+import androidx.camera.core.impl.CameraCaptureResult;
+import androidx.camera.core.impl.Config;
+import androidx.camera.core.impl.OutputSurface;
+import androidx.camera.core.impl.RequestProcessor;
+import androidx.camera.core.impl.SessionProcessor;
+import androidx.camera.extensions.impl.advanced.Camera2OutputConfigImpl;
+import androidx.camera.extensions.impl.advanced.Camera2SessionConfigImpl;
+import androidx.camera.extensions.impl.advanced.ImageProcessorImpl;
+import androidx.camera.extensions.impl.advanced.ImageReferenceImpl;
+import androidx.camera.extensions.impl.advanced.OutputSurfaceImpl;
+import androidx.camera.extensions.impl.advanced.RequestProcessorImpl;
+import androidx.camera.extensions.impl.advanced.SessionProcessorImpl;
+import androidx.core.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A {@link SessionProcessor} based on OEMs' {@link SessionProcessorImpl}.
+ */
+public class AdvancedSessionProcessor extends SessionProcessorBase {
+    private final SessionProcessorImpl mImpl;
+    private final Context mContext;
+    public AdvancedSessionProcessor(@NonNull SessionProcessorImpl impl, @NonNull Context context) {
+        mImpl = impl;
+        mContext = context;
+    }
+
+    @NonNull
+    @Override
+    protected Camera2SessionConfig initSessionInternal(
+            @NonNull String cameraId,
+            @NonNull Map<String, CameraCharacteristics> cameraCharacteristicsMap,
+            @NonNull OutputSurface previewSurfaceConfig,
+            @NonNull OutputSurface imageCaptureSurfaceConfig,
+            @Nullable OutputSurface imageAnalysisSurfaceConfig) {
+        Camera2SessionConfigImpl sessionConfigImpl =
+                mImpl.initSession(
+                        cameraId,
+                        cameraCharacteristicsMap,
+                        mContext,
+                        new OutputSurfaceImplAdapter(previewSurfaceConfig),
+                        new OutputSurfaceImplAdapter(imageCaptureSurfaceConfig),
+                        imageAnalysisSurfaceConfig == null
+                                ? null : new OutputSurfaceImplAdapter(imageAnalysisSurfaceConfig));
+
+        // Convert Camera2SessionConfigImpl(implemented in OEM) into Camera2SessionConfig
+        return convertToCamera2SessionConfig(sessionConfigImpl);
+    }
+
+    private Camera2SessionConfig convertToCamera2SessionConfig(
+            @NonNull Camera2SessionConfigImpl sessionConfigImpl) {
+        Camera2SessionConfigBuilder camera2SessionConfigBuilder = new Camera2SessionConfigBuilder();
+        for (Camera2OutputConfigImpl outputConfigImpl : sessionConfigImpl.getOutputConfigs()) {
+            Camera2OutputConfigBuilder outputConfigBuilder =
+                    Camera2OutputConfigBuilder.fromImpl(outputConfigImpl);
+            camera2SessionConfigBuilder.addOutputConfig(outputConfigBuilder.build());
+        }
+
+        for (CaptureRequest.Key<?> key : sessionConfigImpl.getSessionParameters().keySet()) {
+            @SuppressWarnings("unchecked")
+            CaptureRequest.Key<Object> objKey = (CaptureRequest.Key<Object>) key;
+            camera2SessionConfigBuilder.addSessionParameter(objKey,
+                    sessionConfigImpl.getSessionParameters().get(objKey));
+        }
+        camera2SessionConfigBuilder
+                .setSessionTemplateId(sessionConfigImpl.getSessionTemplateId());
+        return camera2SessionConfigBuilder.build();
+    }
+
+    @Override
+    protected void deInitSessionInternal() {
+        mImpl.deInitSession();
+    }
+
+    @Override
+    public void setParameters(
+            @NonNull Config parameters) {
+        HashMap<CaptureRequest.Key<?>, Object> map = new HashMap<>();
+
+        CaptureRequestOptions options =
+                CaptureRequestOptions.Builder.from(parameters).build();
+
+        for (Config.Option<?> option : options.listOptions()) {
+            @SuppressWarnings("unchecked")
+            CaptureRequest.Key<Object> key = (CaptureRequest.Key<Object>) option.getToken();
+            map.put(key, options.retrieveOption(option));
+        }
+        mImpl.setParameters(map);
+    }
+
+    @Override
+    public void onCaptureSessionStart(
+            @NonNull RequestProcessor requestProcessor) {
+        mImpl.onCaptureSessionStart(new RequestProcessorImplAdapter(requestProcessor));
+    }
+
+    @Override
+    public void onCaptureSessionEnd() {
+        mImpl.onCaptureSessionEnd();
+    }
+
+    @Override
+    public int startCapture(
+            @NonNull SessionProcessor.CaptureCallback callback) {
+        return mImpl.startCapture(new SessionProcessorImplCaptureCallbackAdapter(callback));
+    }
+
+    @Override
+    public int startRepeating(@NonNull SessionProcessor.CaptureCallback callback) {
+        return mImpl.startRepeating(new SessionProcessorImplCaptureCallbackAdapter(callback));
+    }
+
+    @Override
+    public void stopRepeating() {
+        mImpl.stopRepeating();
+    }
+
+    @Override
+    public void abortCapture(int captureSequenceId) {
+        mImpl.abortCapture(captureSequenceId);
+    }
+
+    /**
+     * Adapter to transform a {@link OutputSurface} to a {@link OutputSurfaceImpl}.
+     */
+    private static class OutputSurfaceImplAdapter implements OutputSurfaceImpl {
+        private final OutputSurface mOutputSurface;
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        OutputSurfaceImplAdapter(OutputSurface outputSurface) {
+            mOutputSurface = outputSurface;
+        }
+        @NonNull
+        @Override
+        public Surface getSurface() {
+            return mOutputSurface.getSurface();
+        }
+
+        @NonNull
+        @Override
+        public Size getSize() {
+            return mOutputSurface.getSize();
+        }
+
+        @Override
+        public int getImageFormat() {
+            return mOutputSurface.getImageFormat();
+        }
+    }
+
+    /**
+     * Adapter to transform a {@link RequestProcessor} to {@link RequestProcessorImpl}.
+     */
+    private class RequestProcessorImplAdapter implements RequestProcessorImpl {
+        private final RequestProcessor mRequestProcessor;
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        RequestProcessorImplAdapter(@NonNull RequestProcessor requestProcessor) {
+            mRequestProcessor = requestProcessor;
+        }
+
+        @Override
+        public void setImageProcessor(int outputConfigId,
+                @NonNull ImageProcessorImpl imageProcessorImpl) {
+            AdvancedSessionProcessor.this.setImageProcessor(outputConfigId,
+                    new ImageProcessorAdapter(imageProcessorImpl));
+        }
+
+        @Override
+        public int submit(
+                @NonNull RequestProcessorImpl.Request request, @NonNull Callback callback) {
+            return mRequestProcessor.submit(new RequestAdapter(request),
+                    new CallbackAdapter(callback));
+        }
+
+        @Override
+        public int submit(
+                @NonNull List<RequestProcessorImpl.Request> requests, @NonNull Callback callback) {
+            ArrayList<RequestProcessor.Request> outRequests = new ArrayList<>();
+            for (RequestProcessorImpl.Request request : requests) {
+                outRequests.add(new RequestAdapter(request));
+            }
+            return mRequestProcessor.submit(outRequests, new CallbackAdapter(callback));
+        }
+
+        @Override
+        public int setRepeating(
+                @NonNull RequestProcessorImpl.Request request, @NonNull Callback callback) {
+            return mRequestProcessor.setRepeating(new RequestAdapter(request),
+                    new CallbackAdapter(callback));
+        }
+
+        @Override
+        public void abortCaptures() {
+            mRequestProcessor.abortCaptures();
+        }
+
+        @Override
+        public void stopRepeating() {
+            mRequestProcessor.stopRepeating();
+        }
+    }
+
+    /**
+     * Adapter to transform a {@link RequestProcessorImpl.Request} to a
+     * {@link RequestProcessor.Request}.
+     */
+    private static class RequestAdapter implements RequestProcessor.Request {
+        private final RequestProcessorImpl.Request mImplRequest;
+        private final List<Integer> mTargetOutputConfigIds;
+        private final Config mParameters;
+        private final int mTemplateId;
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        RequestAdapter(@NonNull RequestProcessorImpl.Request implRequest) {
+            mImplRequest = implRequest;
+
+            List<Integer> targetOutputConfigIds = new ArrayList<>();
+            for (Integer outputConfigId : implRequest.getTargetOutputConfigIds()) {
+                targetOutputConfigIds.add(outputConfigId);
+            }
+            mTargetOutputConfigIds = targetOutputConfigIds;
+
+            Camera2ImplConfig.Builder camera2ConfigBuilder = new Camera2ImplConfig.Builder();
+            for (CaptureRequest.Key<?> key : implRequest.getParameters().keySet()) {
+                @SuppressWarnings("unchecked")
+                CaptureRequest.Key<Object> objKey = (CaptureRequest.Key<Object>) key;
+                camera2ConfigBuilder.setCaptureRequestOption(objKey,
+                        implRequest.getParameters().get(objKey));
+            }
+            mParameters = camera2ConfigBuilder.build();
+
+            mTemplateId = implRequest.getTemplateId();
+        }
+
+        @NonNull
+        @Override
+        public List<Integer> getTargetOutputConfigIds() {
+            return mTargetOutputConfigIds;
+        }
+
+        @NonNull
+        @Override
+        public Config getParameters() {
+            return mParameters;
+        }
+
+        @Override
+        public int getTemplateId() {
+            return mTemplateId;
+        }
+
+        @Nullable
+        public RequestProcessorImpl.Request getImplRequest() {
+            return mImplRequest;
+        }
+    }
+
+    /**
+     * Adapter to transform a {@link ImageProcessorImpl} to {@link ImageProcessor}.
+     */
+    private static class ImageProcessorAdapter implements ImageProcessor {
+        private final ImageProcessorImpl mImpl;
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        ImageProcessorAdapter(ImageProcessorImpl impl) {
+            mImpl = impl;
+        }
+
+        @Override
+        public void onNextImageAvailable(int outputStreamId, long timestampNs,
+                @NonNull ImageReference imageReference, @Nullable String physicalCameraId) {
+            mImpl.onNextImageAvailable(outputStreamId, timestampNs,
+                    new ImageReferenceImplAdapter(imageReference), physicalCameraId);
+        }
+    }
+
+    /**
+     * Adapter to transform a {@link ImageReference} to a {@link ImageReferenceImpl}.
+     */
+    private static class ImageReferenceImplAdapter implements ImageReferenceImpl {
+        private final ImageReference mImageReference;
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        ImageReferenceImplAdapter(ImageReference imageReference) {
+            mImageReference = imageReference;
+        }
+
+        @Override
+        public boolean increment() {
+            return mImageReference.increment();
+        }
+
+        @Override
+        public boolean decrement() {
+            return mImageReference.decrement();
+        }
+
+        @Nullable
+        @Override
+        public Image get() {
+            return mImageReference.get();
+        }
+    }
+
+    /**
+     * Adapter to transform a {@link RequestProcessorImpl.Callback} to a
+     * {@link RequestProcessor.Callback}.
+     */
+    private static class CallbackAdapter implements RequestProcessor.Callback {
+        private final RequestProcessorImpl.Callback mCallback;
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        CallbackAdapter(RequestProcessorImpl.Callback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void onCaptureStarted(
+                @NonNull RequestProcessor.Request request,
+                long frameNumber, long timestamp) {
+            mCallback.onCaptureStarted(getImplRequest(request), frameNumber,
+                    timestamp);
+        }
+
+        @Override
+        public void onCaptureProgressed(
+                @NonNull RequestProcessor.Request request,
+                @NonNull CameraCaptureResult cameraCaptureResult) {
+            CaptureResult captureResult =
+                    Camera2CameraCaptureResultConverter.getCaptureResult(cameraCaptureResult);
+            Preconditions.checkArgument(captureResult != null,
+                    "Cannot get CaptureResult from the cameraCaptureResult ");
+            mCallback.onCaptureProgressed(getImplRequest(request), captureResult);
+        }
+
+        @Override
+        public void onCaptureCompleted(
+                @NonNull RequestProcessor.Request request,
+                @Nullable CameraCaptureResult cameraCaptureResult) {
+            CaptureResult captureResult =
+                    Camera2CameraCaptureResultConverter.getCaptureResult(cameraCaptureResult);
+            Preconditions.checkArgument(captureResult instanceof TotalCaptureResult,
+                    "CaptureResult in cameraCaptureResult is not a TotalCaptureResult");
+            mCallback.onCaptureCompleted(getImplRequest(request),
+                    (TotalCaptureResult) captureResult);
+        }
+
+        @Override
+        public void onCaptureFailed(
+                @NonNull RequestProcessor.Request request,
+                @Nullable CameraCaptureFailure cameraCaptureFailure) {
+            CaptureFailure captureFailure =
+                    Camera2CameraCaptureResultConverter.getCaptureFailure(cameraCaptureFailure);
+            Preconditions.checkArgument(captureFailure != null,
+                    "CameraCaptureFailure does not contain CaptureFailure.");
+            mCallback.onCaptureFailed(getImplRequest(request), captureFailure);
+        }
+
+        @Override
+        public void onCaptureBufferLost(
+                @NonNull RequestProcessor.Request request,
+                long frameNumber, int outputStreamId) {
+            mCallback.onCaptureBufferLost(getImplRequest(request), frameNumber, outputStreamId);
+        }
+
+        @Override
+        public void onCaptureSequenceCompleted(
+                int sequenceId, long frameNumber) {
+            mCallback.onCaptureSequenceCompleted(sequenceId, frameNumber);
+        }
+
+        @Override
+        public void onCaptureSequenceAborted(int sequenceId) {
+            mCallback.onCaptureSequenceAborted(sequenceId);
+        }
+
+        private RequestProcessorImpl.Request getImplRequest(
+                RequestProcessor.Request request) {
+            Preconditions.checkArgument(request instanceof RequestAdapter);
+
+            RequestAdapter requestProcessorRequest = (RequestAdapter) request;
+            return requestProcessorRequest.getImplRequest();
+        }
+    }
+
+    /**
+     * Adapter to transform a {@link SessionProcessor.CaptureCallback} to a
+     * {@link SessionProcessorImpl.CaptureCallback}.
+     */
+    private static class SessionProcessorImplCaptureCallbackAdapter implements
+            SessionProcessorImpl.CaptureCallback {
+        private final SessionProcessor.CaptureCallback mCaptureCallback;
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        SessionProcessorImplCaptureCallbackAdapter(
+                @NonNull SessionProcessor.CaptureCallback callback) {
+            mCaptureCallback = callback;
+        }
+
+        @Override
+        public void onCaptureStarted(
+                int captureSequenceId,
+                long timestamp) {
+            mCaptureCallback.onCaptureStarted(captureSequenceId, timestamp);
+        }
+
+        @Override
+        public void onCaptureProcessStarted(
+                int captureSequenceId) {
+            mCaptureCallback.onCaptureProcessStarted(captureSequenceId);
+        }
+
+        @Override
+        public void onCaptureFailed(int captureSequenceId) {
+            mCaptureCallback.onCaptureFailed(captureSequenceId);
+        }
+
+        @Override
+        public void onCaptureSequenceCompleted(int captureSequenceId) {
+            mCaptureCallback.onCaptureSequenceCompleted(captureSequenceId);
+        }
+
+        @Override
+        public void onCaptureSequenceAborted(int captureSequenceId) {
+            mCaptureCallback.onCaptureSequenceAborted(captureSequenceId);
+        }
+    }
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java
new file mode 100644
index 0000000..712026f
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.List;
+
+/**
+ * A config representing a {@link android.hardware.camera2.params.OutputConfiguration} where
+ * Surface will be created by the information in this config.
+ */
+interface Camera2OutputConfig {
+    /**
+     * Gets the id of this output config. The id can be used to identify the stream in vendor
+     * implementations.
+     */
+    int getId();
+
+    /**
+     * Gets the surface group id. Vendor can use the surface group id to share memory between
+     * Surfaces.
+     */
+    int getSurfaceGroupId();
+
+    /**
+     * Gets the physical camera id. Returns null if not specified.
+     */
+    @Nullable
+    String getPhysicalCameraId();
+
+    /**
+     * If non-null, enable surface sharing and add the surfaces constructed by the returned
+     * Camera2OutputConfigs.
+     */
+    @NonNull
+    List<Camera2OutputConfig> getSurfaceSharingOutputConfigs();
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java
new file mode 100644
index 0000000..5bd3240
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.util.Size;
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.extensions.impl.advanced.Camera2OutputConfigImpl;
+import androidx.camera.extensions.impl.advanced.ImageReaderOutputConfigImpl;
+import androidx.camera.extensions.impl.advanced.MultiResolutionImageReaderOutputConfigImpl;
+import androidx.camera.extensions.impl.advanced.SurfaceOutputConfigImpl;
+
+import com.google.auto.value.AutoValue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * A builder for building {@link Camera2OutputConfig}.
+ */
+class Camera2OutputConfigBuilder {
+    private static AtomicInteger sLastId = new AtomicInteger(0);
+    private OutputConfig mOutputConfig;
+    private int mSurfaceGroupId;
+    private String mPhysicalCameraId;
+    private List<Camera2OutputConfig> mSurfaceSharingConfigs;
+
+    private Camera2OutputConfigBuilder(OutputConfig outputConfig) {
+        mOutputConfig = outputConfig;
+    }
+
+    private int getNextId() {
+        return sLastId.getAndIncrement();
+    }
+
+    /**
+     * Create a {@link Camera2OutputConfig} from the {@link Camera2OutputConfigImpl}.
+     */
+    @NonNull
+    static Camera2OutputConfigBuilder fromImpl(@NonNull Camera2OutputConfigImpl impl) {
+        OutputConfig outputConfig = null;
+        if (impl instanceof SurfaceOutputConfigImpl) {
+            SurfaceOutputConfigImpl surfaceImpl = (SurfaceOutputConfigImpl) impl;
+            outputConfig = SurfaceConfig.create(surfaceImpl.getSurface());
+        } else if (impl instanceof ImageReaderOutputConfigImpl) {
+            ImageReaderOutputConfigImpl imageReaderImpl = (ImageReaderOutputConfigImpl) impl;
+            outputConfig = ImageReaderConfig.create(imageReaderImpl.getSize(),
+                    imageReaderImpl.getImageFormat(), imageReaderImpl.getMaxImages());
+        } else if (impl instanceof MultiResolutionImageReaderOutputConfigImpl) {
+            MultiResolutionImageReaderOutputConfigImpl multiResolutionImageReaderImpl =
+                    (MultiResolutionImageReaderOutputConfigImpl) impl;
+            outputConfig = MultiResolutionImageReaderConfig.create(
+                    multiResolutionImageReaderImpl.getImageFormat(),
+                    multiResolutionImageReaderImpl.getMaxImages());
+        }
+
+        outputConfig.setPhysicalCameraId(impl.getPhysicalCameraId());
+        outputConfig.setSurfaceGroup(impl.getSurfaceGroupId());
+        if (impl.getSurfaceSharingOutputConfigs() != null) {
+            ArrayList<Camera2OutputConfig> surfaceSharingConfigs = new ArrayList<>();
+            for (Camera2OutputConfigImpl surfaceSharingOutputConfig :
+                    impl.getSurfaceSharingOutputConfigs()) {
+                Camera2OutputConfigBuilder subBuilder =
+                        Camera2OutputConfigBuilder.fromImpl(surfaceSharingOutputConfig);
+                surfaceSharingConfigs.add(subBuilder.build());
+            }
+            outputConfig.setSurfaceSharingConfigs(surfaceSharingConfigs);
+        }
+
+        return new Camera2OutputConfigBuilder(outputConfig);
+    }
+
+    /**
+     * Creates a {@link Camera2OutputConfig} that represents a {@link android.media.ImageReader}
+     * with the given parameters.
+     */
+    @NonNull
+    static Camera2OutputConfigBuilder newImageReaderConfig(
+            @NonNull Size size, int imageFormat, int maxImages) {
+        return new Camera2OutputConfigBuilder(
+                 ImageReaderConfig.create(size, imageFormat, maxImages));
+    }
+
+    /**
+     * Creates a {@link Camera2OutputConfig} that represents a MultiResolutionImageReader with the
+     * given parameters.
+     */
+    @NonNull
+    static Camera2OutputConfigBuilder newMultiResolutionImageReaderConfig(
+            int imageFormat, int maxImages) {
+        return new Camera2OutputConfigBuilder(
+                MultiResolutionImageReaderConfig.create(imageFormat, maxImages));
+    }
+
+    /**
+     * Creates a {@link Camera2OutputConfig} that contains the Surface directly.
+     */
+    @NonNull
+    static Camera2OutputConfigBuilder newSurfaceConfig(@NonNull Surface surface) {
+        return new Camera2OutputConfigBuilder(SurfaceConfig.create(surface));
+    }
+
+    /**
+     * Adds a {@link Camera2SessionConfig} to be shared with current config.
+     */
+    @NonNull
+    Camera2OutputConfigBuilder addSurfaceSharingOutputConfig(
+            @NonNull Camera2OutputConfig camera2OutputConfig) {
+        if (mSurfaceSharingConfigs == null) {
+            mSurfaceSharingConfigs = new ArrayList<>();
+        }
+
+        mSurfaceSharingConfigs.add(camera2OutputConfig);
+        return this;
+    }
+
+    /**
+     * Sets a physical camera id.
+     */
+    @NonNull
+    Camera2OutputConfigBuilder setPhysicalCameraId(@NonNull String physicalCameraId) {
+        mPhysicalCameraId = physicalCameraId;
+        return this;
+    }
+
+    /**
+     * Sets surface group id.
+     */
+    @NonNull
+    Camera2OutputConfigBuilder setSurfaceGroupId(int surfaceGroupId) {
+        mSurfaceGroupId = surfaceGroupId;
+        return this;
+    }
+
+    /**
+     * Build a {@link Camera2OutputConfig} instance.
+     */
+    @NonNull
+    Camera2OutputConfig build() {
+        mOutputConfig.setId(getNextId());
+        mOutputConfig.setPhysicalCameraId(mPhysicalCameraId);
+        mOutputConfig.setSurfaceGroup(mSurfaceGroupId);
+        if (mSurfaceSharingConfigs != null) {
+            mOutputConfig.setSurfaceSharingConfigs(mSurfaceSharingConfigs);
+        }
+        return mOutputConfig;
+    }
+
+    private static class OutputConfig implements Camera2OutputConfig {
+        private int mId;
+        private int mSurfaceGroup;
+        private String mPhysicalCameraId;
+        private List<Camera2OutputConfig> mSurfaceSharingConfigs;
+
+        OutputConfig() {
+            mId = -1;
+            mSurfaceGroup = 0;
+            mPhysicalCameraId = null;
+            mSurfaceSharingConfigs = Collections.emptyList();
+        }
+
+        @Override
+        public int getId() {
+            return mId;
+        }
+
+        @Override
+        public int getSurfaceGroupId() {
+            return mSurfaceGroup;
+        }
+
+        @Override
+        @Nullable
+        public String getPhysicalCameraId() {
+            return mPhysicalCameraId;
+        }
+
+        @Override
+        @NonNull
+        public List<Camera2OutputConfig> getSurfaceSharingOutputConfigs() {
+            return mSurfaceSharingConfigs;
+        }
+
+        public void setId(int id) {
+            mId = id;
+        }
+
+        public void setSurfaceGroup(int surfaceGroup) {
+            mSurfaceGroup = surfaceGroup;
+        }
+
+        public void setPhysicalCameraId(@Nullable String physicalCameraId) {
+            mPhysicalCameraId = physicalCameraId;
+        }
+
+        public void setSurfaceSharingConfigs(
+                @NonNull List<Camera2OutputConfig> surfaceSharingConfigs) {
+            mSurfaceSharingConfigs = surfaceSharingConfigs;
+        }
+    }
+
+    @AutoValue
+    abstract static class SurfaceConfig extends OutputConfig implements SurfaceOutputConfig {
+        static SurfaceConfig create(@NonNull Surface surface) {
+            return new AutoValue_Camera2OutputConfigBuilder_SurfaceConfig(surface);
+        }
+
+        @Override
+        @NonNull
+        public abstract Surface getSurface();
+    }
+
+    @AutoValue
+    abstract static class ImageReaderConfig extends OutputConfig implements
+            ImageReaderOutputConfig {
+        static ImageReaderConfig create(@NonNull Size size, int imageFormat,
+                int maxImages) {
+            return new AutoValue_Camera2OutputConfigBuilder_ImageReaderConfig(
+                    size, imageFormat, maxImages);
+        }
+
+        @Override
+        @NonNull
+        public abstract Size getSize();
+
+        @Override
+        public abstract int getImageFormat();
+
+        @Override
+        public abstract int getMaxImages();
+    }
+
+    @AutoValue
+    abstract static class MultiResolutionImageReaderConfig extends OutputConfig implements
+            MultiResolutionImageReaderOutputConfig {
+        static MultiResolutionImageReaderConfig create(int imageFormat, int maxImages) {
+            return new AutoValue_Camera2OutputConfigBuilder_MultiResolutionImageReaderConfig(
+                    imageFormat, maxImages);
+        }
+
+        @Override
+        public abstract int getImageFormat();
+
+        @Override
+        public abstract int getMaxImages();
+    }
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java
new file mode 100644
index 0000000..c077ee1
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.hardware.camera2.CaptureRequest;
+
+import androidx.annotation.NonNull;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A config representing a {@link android.hardware.camera2.params.SessionConfiguration}
+ */
+interface Camera2SessionConfig {
+    /**
+     * Returns all the {@link Camera2OutputConfig}s that will be used to create
+     * {@link android.hardware.camera2.params.OutputConfiguration}.
+     */
+    @NonNull
+    List<Camera2OutputConfig> getOutputConfigs();
+
+    /**
+     * Gets all the parameters to create the session parameters with.
+     */
+    @NonNull
+    Map<CaptureRequest.Key<?>, Object> getSessionParameters();
+
+    /**
+     * Gets the template id used for creating {@link CaptureRequest}s to be passed in
+     * {@link android.hardware.camera2.params.SessionConfiguration#setSessionParameters}.
+     */
+    int getSessionTemplateId();
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java
new file mode 100644
index 0000000..c178bee
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.extensions.impl.advanced.Camera2SessionConfigImpl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A builder implementation to build the {@link Camera2SessionConfig} instance.
+ */
+class Camera2SessionConfigBuilder {
+    private int mSessionTemplateId = CameraDevice.TEMPLATE_PREVIEW;
+    private Map<CaptureRequest.Key<?>, Object> mSessionParameters = new HashMap<>();
+    private List<Camera2OutputConfig> mCamera2OutputConfigs = new ArrayList<>();
+
+    Camera2SessionConfigBuilder() {
+    }
+
+    /**
+     * Adds a output config.
+     */
+    @NonNull
+    Camera2SessionConfigBuilder addOutputConfig(
+            @NonNull Camera2OutputConfig outputConfig) {
+        mCamera2OutputConfigs.add(outputConfig);
+        return this;
+    }
+
+    /**
+     * Sets session parameters.
+     */
+    @NonNull
+    <T> Camera2SessionConfigBuilder addSessionParameter(
+            @NonNull CaptureRequest.Key<T> key, @Nullable T value) {
+        mSessionParameters.put(key, value);
+        return this;
+    }
+
+    /**
+     * Sets the template id for session parameters request.
+     */
+    @NonNull
+    Camera2SessionConfigBuilder setSessionTemplateId(int templateId) {
+        mSessionTemplateId = templateId;
+        return this;
+    }
+
+    /**
+     * Gets the session template id.
+     */
+    int getSessionTemplateId() {
+        return mSessionTemplateId;
+    }
+
+    /**
+     * Gets the session parameters.
+     */
+    @NonNull
+    Map<CaptureRequest.Key<?>, Object> getSessionParameters() {
+        return mSessionParameters;
+    }
+
+    /**
+     * Gets all the output configs.
+     */
+    @NonNull
+    List<Camera2OutputConfig> getCamera2OutputConfigs() {
+        return mCamera2OutputConfigs;
+    }
+
+    /**
+     * Builds a {@link Camera2SessionConfigImpl} instance.
+     */
+    @NonNull
+    Camera2SessionConfig build() {
+        return new SessionConfigImpl(mSessionTemplateId, mSessionParameters, mCamera2OutputConfigs);
+    }
+
+    private static class SessionConfigImpl implements Camera2SessionConfig {
+        private final int mSessionTemplateId;
+        private final Map<CaptureRequest.Key<?>, Object> mSessionParameters;
+        private final List<Camera2OutputConfig> mCamera2OutputConfigs;
+
+        SessionConfigImpl(int sessionTemplateId,
+                Map<CaptureRequest.Key<?>, Object> sessionParameters,
+                List<Camera2OutputConfig> camera2OutputConfigs) {
+            mSessionTemplateId = sessionTemplateId;
+            mSessionParameters = sessionParameters;
+            mCamera2OutputConfigs = camera2OutputConfigs;
+        }
+
+        @Override
+        @NonNull
+        public List<Camera2OutputConfig> getOutputConfigs() {
+            return mCamera2OutputConfigs;
+        }
+
+        @Override
+        @NonNull
+        public Map<CaptureRequest.Key<?>, Object> getSessionParameters() {
+            return mSessionParameters;
+        }
+
+        @Override
+        public int getSessionTemplateId() {
+            return mSessionTemplateId;
+        }
+    }
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java
new file mode 100644
index 0000000..fac650f
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * An interface to receive and process the upcoming next available Image.
+ */
+public interface ImageProcessor {
+    /**
+     * The reference count will be decremented when this method returns. If an extension wants
+     * to hold onto the image, it should increment the reference count in this method and
+     * decrement it when the image is no longer needed.
+     *
+     * <p>If OEM is not closing(decrement) the image fast enough, the imageReference passed
+     * in this method might contain null image meaning that the Image was closed to prevent
+     * preview from stalling.
+     */
+    void onNextImageAvailable(
+            int outputStreamId,
+            long timestampNs,
+            @NonNull ImageReference imageReference,
+            @Nullable String physicalCameraId);
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java
new file mode 100644
index 0000000..98f4249
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.util.Size;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Surface will be created by constructing an ImageReader.
+ */
+public interface ImageReaderOutputConfig extends Camera2OutputConfig {
+    /**
+     * Returns the size of the surface.
+     */
+    @NonNull
+    Size getSize();
+
+    /**
+     * Gets the image format of the surface.
+     */
+    int getImageFormat();
+
+    /**
+     * Gets the capacity for the image reader.
+     */
+    int getMaxImages();
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java
new file mode 100644
index 0000000..43d866f
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.media.Image;
+
+import androidx.annotation.Nullable;
+
+/**
+ * An Image reference container that enables the Image sharing between Camera2/CameraX and OEM
+ * using reference counting. The wrapped Image will be closed once the reference count
+ * reaches 0.
+ *
+ * <p>Implemented by Camera2/CameraX.
+ */
+public interface ImageReference {
+    /**
+     * Increment the reference count. Returns true if the value was incremented.
+     * (returns false if the reference count has already reached zero.)
+     */
+    boolean increment();
+
+    /**
+     * Decrement the reference count. Image will be closed if reference count reaches 0.
+     * Returns true if the value was decremented (returns false if the reference count has
+     * already reached zero)
+     */
+    boolean decrement();
+
+    /**
+     * Return the Android image. This object MUST not be closed directly.
+     * Returns null when the reference count is zero.
+     */
+    @Nullable
+    Image get();
+}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java
similarity index 60%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java
index f7ebdc2..21fd271 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java
@@ -14,15 +14,19 @@
  * limitations under the License.
  */
 
-package androidx.fragment.app.strictmode;
+package androidx.camera.extensions.internal.sessionprocessor;
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
+/**
+ * Surface will be created by constructing a MultiResolutionImageReader.
+ */
+public interface MultiResolutionImageReaderOutputConfig extends Camera2OutputConfig {
+    /**
+     * Gets the image format of the surface.
+     */
+    int getImageFormat();
 
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
+    /**
+     * Gets the capacity for the image reader.
+     */
+    int getMaxImages();
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java
new file mode 100644
index 0000000..1ec8a84
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.media.Image;
+import android.media.ImageReader;
+import android.os.Handler;
+import android.os.HandlerThread;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.OptIn;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
+import androidx.camera.camera2.interop.Camera2CameraInfo;
+import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
+import androidx.camera.core.CameraInfo;
+import androidx.camera.core.CameraXThreads;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.DeferrableSurface;
+import androidx.camera.core.impl.OutputSurface;
+import androidx.camera.core.impl.SessionConfig;
+import androidx.camera.core.impl.SessionProcessor;
+import androidx.camera.core.impl.SessionProcessorSurface;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Base class for SessionProcessor implementation. It is responsible for creating image readers and
+ * maintaining the {@link ImageProcessor} associated with the image reader.
+ */
+abstract class SessionProcessorBase implements SessionProcessor {
+    private static final String TAG = "SessionProcessorBase";
+    @NonNull
+    @GuardedBy("mLock")
+    private Map<Integer, ImageReader> mImageReaderMap = new HashMap<>();
+    @Nullable
+    private HandlerThread mImageReaderHandlerThread;
+    @GuardedBy("mLock")
+    private List<DeferrableSurface> mSurfacesList = new ArrayList<>();
+    private final Object mLock = new Object();
+    private String mCameraId;
+
+    @NonNull
+    @Override
+    @OptIn(markerClass = ExperimentalCamera2Interop.class)
+    public final SessionConfig initSession(@NonNull CameraInfo cameraInfo,
+            @NonNull OutputSurface previewSurfaceConfig,
+            @NonNull OutputSurface imageCaptureSurfaceConfig,
+            @Nullable OutputSurface imageAnalysisSurfaceConfig) {
+        Camera2CameraInfo camera2CameraInfo = Camera2CameraInfo.from(cameraInfo);
+        Camera2SessionConfig camera2SessionConfig = initSessionInternal(
+                camera2CameraInfo.getCameraId(),
+                camera2CameraInfo.getCameraCharacteristicsMap(),
+                previewSurfaceConfig,
+                imageCaptureSurfaceConfig,
+                imageAnalysisSurfaceConfig
+        );
+
+        // TODO: Adding support for group id, surface sharing and physicalCameraId in SessionConfig
+        synchronized (mLock) {
+            for (Camera2OutputConfig outputConfig : camera2SessionConfig.getOutputConfigs()) {
+                if (outputConfig instanceof SurfaceOutputConfig) {
+                    SurfaceOutputConfig surfaceOutputConfig = (SurfaceOutputConfig) outputConfig;
+                    SessionProcessorSurface surface =
+                            new SessionProcessorSurface(surfaceOutputConfig.getSurface(),
+                                    outputConfig.getId());
+                    mSurfacesList.add(surface);
+                } else if (outputConfig instanceof ImageReaderOutputConfig) {
+                    ImageReaderOutputConfig imageReaderOutputConfig =
+                            (ImageReaderOutputConfig) outputConfig;
+
+                    ImageReader imageReader =
+                            ImageReader.newInstance(imageReaderOutputConfig.getSize().getWidth(),
+                                    imageReaderOutputConfig.getSize().getHeight(),
+                                    imageReaderOutputConfig.getImageFormat(),
+                                    imageReaderOutputConfig.getMaxImages());
+                    mImageReaderMap.put(outputConfig.getId(), imageReader);
+                    SessionProcessorSurface surface =
+                            new SessionProcessorSurface(imageReader.getSurface(),
+                                    outputConfig.getId());
+                    surface.getTerminationFuture().addListener(() -> {
+                        imageReader.close();
+                    }, CameraXExecutors.directExecutor());
+                    mSurfacesList.add(surface);
+                } else if (outputConfig instanceof MultiResolutionImageReaderOutputConfig) {
+                    // TODO: Support MultiResolutionImageReader
+                    throw new UnsupportedOperationException(
+                            "MultiResolutionImageReader not supported");
+                }
+            }
+        }
+
+        SessionConfig.Builder sessionConfigBuilder = new SessionConfig.Builder();
+        synchronized (mLock) {
+            for (DeferrableSurface surface : mSurfacesList) {
+                sessionConfigBuilder.addSurface(surface);
+            }
+        }
+
+        Camera2ImplConfig.Builder camera2ConfigurationBuilder = new Camera2ImplConfig.Builder();
+        for (CaptureRequest.Key<?> key : camera2SessionConfig.getSessionParameters().keySet()) {
+            @SuppressWarnings("unchecked")
+            CaptureRequest.Key<Object> objKey = (CaptureRequest.Key<Object>) key;
+            Object value = camera2SessionConfig.getSessionParameters().get(objKey);
+            camera2ConfigurationBuilder.setCaptureRequestOption(objKey, value);
+        }
+        sessionConfigBuilder.setImplementationOptions(camera2ConfigurationBuilder.build());
+        sessionConfigBuilder.setTemplateType(camera2SessionConfig.getSessionTemplateId());
+
+        mImageReaderHandlerThread = new HandlerThread(
+                CameraXThreads.TAG + "extensions_image_reader");
+        mImageReaderHandlerThread.start();
+
+        mCameraId = camera2CameraInfo.getCameraId();
+        Logger.d(TAG, "initSession: cameraId=" + mCameraId);
+        return sessionConfigBuilder.build();
+    }
+
+    @NonNull
+    protected abstract Camera2SessionConfig initSessionInternal(
+            @NonNull String cameraId,
+            @NonNull Map<String, CameraCharacteristics> cameraCharacteristicsMap,
+            @NonNull OutputSurface previewSurfaceConfig,
+            @NonNull OutputSurface imageCaptureSurfaceConfig,
+            @Nullable OutputSurface imageAnalysisSurfaceConfig);
+
+
+    protected void setImageProcessor(int outputConfigId,
+            @NonNull ImageProcessor imageProcessor) {
+        ImageReader imageReader;
+        synchronized (mLock) {
+            imageReader = mImageReaderMap.get(outputConfigId);
+        }
+
+        if (imageReader != null) {
+            imageReader.setOnImageAvailableListener(reader -> {
+                try {
+                    Image image = reader.acquireNextImage();
+                    ImageReference imageReference = new ImageRefHolder(image);
+                    imageProcessor.onNextImageAvailable(outputConfigId, image.getTimestamp(),
+                            imageReference, null);
+                } catch (IllegalStateException e) {
+                    Logger.e(TAG, "Failed to acquire next image.", e);
+                }
+            }, new Handler(mImageReaderHandlerThread.getLooper()));
+        }
+    }
+
+    @Override
+    public final void deInitSession() {
+        Logger.e(TAG, "deInitSession: cameraId=" + mCameraId);
+
+        deInitSessionInternal();
+
+        synchronized (mLock) {
+            for (DeferrableSurface deferrableSurface : mSurfacesList) {
+                deferrableSurface.close();
+            }
+            mSurfacesList.clear();
+
+            mImageReaderMap.clear();
+        }
+
+        if (mImageReaderHandlerThread != null) {
+            mImageReaderHandlerThread.quitSafely();
+            mImageReaderHandlerThread = null;
+        }
+    }
+
+    protected abstract void deInitSessionInternal();
+
+    private static class ImageRefHolder implements ImageReference {
+        private int mRefCount;
+        private Image mImage;
+        private final Object mImageLock = new Object();
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        ImageRefHolder(@NonNull Image image) {
+            mRefCount = 1;
+            mImage = image;
+        }
+
+        @Override
+        public boolean increment() {
+            synchronized (mImageLock) {
+                if (mRefCount <= 0) {
+                    return false;
+                }
+                mRefCount++;
+            }
+            return true;
+        }
+
+        @Override
+        public boolean decrement() {
+            synchronized (mImageLock) {
+                if (mRefCount <= 0) {
+                    return false;
+                }
+                mRefCount--;
+                if (mRefCount <= 0) {
+                    mImage.close();
+                }
+            }
+            return true;
+        }
+
+        @Nullable
+        @Override
+        public Image get() {
+            return mImage;
+        }
+    }
+}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java
similarity index 63%
rename from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
rename to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java
index f7ebdc2..15f494b 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java
@@ -14,15 +14,19 @@
  * limitations under the License.
  */
 
-package androidx.fragment.app.strictmode;
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import android.view.Surface;
 
 import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
 
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
+/**
+ * Use Surface directly to create the OutputConfiguration.
+ */
+public interface SurfaceOutputConfig extends Camera2OutputConfig {
+    /**
+     * Get the {@link Surface}. It'll return a valid surface only when type is TYPE_SURFACE.
+     */
+    @NonNull
+    Surface getSurface();
 }
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseCapabilitiesResponse.aidl b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/package-info.java
similarity index 72%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseCapabilitiesResponse.aidl
copy to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/package-info.java
index 2641359..b62b600 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseCapabilitiesResponse.aidl
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright 2021 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.
@@ -14,7 +14,11 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
 
-/** @hide */
-parcelable AutoExerciseCapabilitiesResponse;
\ No newline at end of file
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.extensions.internal.sessionprocessor;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilderTest.kt b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilderTest.kt
new file mode 100644
index 0000000..c574d2a
--- /dev/null
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilderTest.kt
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor
+
+import android.graphics.ImageFormat
+import android.os.Build
+import android.util.Size
+import android.view.Surface
+import androidx.camera.extensions.impl.advanced.ImageReaderOutputConfigImpl
+import androidx.camera.extensions.impl.advanced.MultiResolutionImageReaderOutputConfigImpl
+import androidx.camera.extensions.impl.advanced.SurfaceOutputConfigImpl
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.`when`
+import org.mockito.Mockito.mock
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+private const val PHYSICAL_CAMERA_ID = "3"
+private const val SURFACE_GROUP_ID = 1
+private const val IMAGE_FORMAT = ImageFormat.YUV_420_888
+private const val MAX_IMAGES = 2
+private val SIZE = Size(640, 480)
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class Camera2OutputConfigBuilderTest {
+    @Test
+    fun canBuildFromImpl_imageReaderOutputConfigImpl() {
+        // Arrange
+        val outConfigImpl = mock(ImageReaderOutputConfigImpl::class.java)
+        `when`(outConfigImpl.size).thenReturn(SIZE)
+        `when`(outConfigImpl.imageFormat).thenReturn(IMAGE_FORMAT)
+        `when`(outConfigImpl.maxImages).thenReturn(MAX_IMAGES)
+
+        // Act
+        val builder = Camera2OutputConfigBuilder.fromImpl(outConfigImpl)
+        builder.setPhysicalCameraId(PHYSICAL_CAMERA_ID)
+        builder.setSurfaceGroupId(SURFACE_GROUP_ID)
+
+        // Assert
+        val camera2OutputConfig = builder.build() as ImageReaderOutputConfig
+        assertThat(camera2OutputConfig.physicalCameraId).isEqualTo(PHYSICAL_CAMERA_ID)
+        assertThat(camera2OutputConfig.surfaceGroupId).isEqualTo(SURFACE_GROUP_ID)
+        assertThat(camera2OutputConfig.size).isEqualTo(SIZE)
+        assertThat(camera2OutputConfig.imageFormat).isEqualTo(IMAGE_FORMAT)
+        assertThat(camera2OutputConfig.maxImages).isEqualTo(MAX_IMAGES)
+    }
+
+    @Test
+    fun canBuildFromImpl_surfaceOutputConfigImpl() {
+        // Arrange
+        val outConfigImpl = mock(SurfaceOutputConfigImpl::class.java)
+        val surface = mock(Surface::class.java)
+        `when`(outConfigImpl.surface).thenReturn(surface)
+
+        // Act
+        val builder = Camera2OutputConfigBuilder.fromImpl(outConfigImpl)
+        builder.setPhysicalCameraId(PHYSICAL_CAMERA_ID)
+        builder.setSurfaceGroupId(SURFACE_GROUP_ID)
+
+        // Assert
+        val camera2OutputConfig = builder.build() as SurfaceOutputConfig
+        assertThat(camera2OutputConfig.physicalCameraId).isEqualTo(PHYSICAL_CAMERA_ID)
+        assertThat(camera2OutputConfig.surfaceGroupId).isEqualTo(SURFACE_GROUP_ID)
+        assertThat(camera2OutputConfig.surface).isEqualTo(surface)
+    }
+
+    @Test
+    fun canBuildFromImpl_MultiResolutionImageReaderOutputConfigImpl() {
+        // Arrange
+        val outConfigImpl = mock(MultiResolutionImageReaderOutputConfigImpl::class.java)
+        `when`(outConfigImpl.imageFormat).thenReturn(IMAGE_FORMAT)
+        `when`(outConfigImpl.maxImages).thenReturn(MAX_IMAGES)
+
+        // Act
+        val builder = Camera2OutputConfigBuilder.fromImpl(outConfigImpl)
+        builder.setPhysicalCameraId(PHYSICAL_CAMERA_ID)
+        builder.setSurfaceGroupId(SURFACE_GROUP_ID)
+
+        // Assert
+        val camera2OutputConfig = builder.build() as MultiResolutionImageReaderOutputConfig
+        assertThat(camera2OutputConfig.physicalCameraId).isEqualTo(PHYSICAL_CAMERA_ID)
+        assertThat(camera2OutputConfig.surfaceGroupId).isEqualTo(SURFACE_GROUP_ID)
+        assertThat(camera2OutputConfig.imageFormat).isEqualTo(IMAGE_FORMAT)
+        assertThat(camera2OutputConfig.maxImages).isEqualTo(MAX_IMAGES)
+    }
+
+    @Test
+    fun canBuildFromImageReaderOutputConfig() {
+        // Act
+        val builder = Camera2OutputConfigBuilder
+            .newImageReaderConfig(SIZE, IMAGE_FORMAT, MAX_IMAGES)
+        builder.setPhysicalCameraId(PHYSICAL_CAMERA_ID)
+        builder.setSurfaceGroupId(SURFACE_GROUP_ID)
+
+        // Assert
+        val camera2OutputConfig = builder.build() as ImageReaderOutputConfig
+        assertThat(camera2OutputConfig.physicalCameraId).isEqualTo(PHYSICAL_CAMERA_ID)
+        assertThat(camera2OutputConfig.surfaceGroupId).isEqualTo(SURFACE_GROUP_ID)
+        assertThat(camera2OutputConfig.size).isEqualTo(SIZE)
+        assertThat(camera2OutputConfig.imageFormat).isEqualTo(IMAGE_FORMAT)
+        assertThat(camera2OutputConfig.maxImages).isEqualTo(MAX_IMAGES)
+    }
+
+    @Test
+    fun canBuildFromSurfaceOutputConfig() {
+        // Arrange
+        val surface = mock(Surface::class.java)
+
+        // Act
+        val builder = Camera2OutputConfigBuilder.newSurfaceConfig(surface)
+        builder.setPhysicalCameraId(PHYSICAL_CAMERA_ID)
+        builder.setSurfaceGroupId(SURFACE_GROUP_ID)
+
+        // Assert
+        val camera2OutputConfig = builder.build() as SurfaceOutputConfig
+        assertThat(camera2OutputConfig.physicalCameraId).isEqualTo(PHYSICAL_CAMERA_ID)
+        assertThat(camera2OutputConfig.surfaceGroupId).isEqualTo(SURFACE_GROUP_ID)
+        assertThat(camera2OutputConfig.surface).isEqualTo(surface)
+    }
+
+    @Test
+    fun canBuildFromMultiResolutionImageReaderOutputConfig() {
+        // Act
+        val builder = Camera2OutputConfigBuilder
+            .newMultiResolutionImageReaderConfig(IMAGE_FORMAT, MAX_IMAGES)
+        builder.setPhysicalCameraId(PHYSICAL_CAMERA_ID)
+        builder.setSurfaceGroupId(SURFACE_GROUP_ID)
+
+        // Assert
+        val camera2OutputConfig = builder.build() as MultiResolutionImageReaderOutputConfig
+        assertThat(camera2OutputConfig.physicalCameraId).isEqualTo(PHYSICAL_CAMERA_ID)
+        assertThat(camera2OutputConfig.surfaceGroupId).isEqualTo(SURFACE_GROUP_ID)
+        assertThat(camera2OutputConfig.imageFormat).isEqualTo(IMAGE_FORMAT)
+        assertThat(camera2OutputConfig.maxImages).isEqualTo(MAX_IMAGES)
+    }
+
+    @Test
+    fun canAddSurfaceSharing() {
+        // Arrange
+        val surface = mock(Surface::class.java)
+        val builder = Camera2OutputConfigBuilder
+            .newImageReaderConfig(SIZE, IMAGE_FORMAT, MAX_IMAGES)
+        val outputConfig1 = Camera2OutputConfigBuilder.newSurfaceConfig(surface).build()
+        val outputConfig2 = Camera2OutputConfigBuilder
+            .newImageReaderConfig(SIZE, IMAGE_FORMAT, MAX_IMAGES).build()
+
+        // Act
+        builder.addSurfaceSharingOutputConfig(outputConfig1)
+        builder.addSurfaceSharingOutputConfig(outputConfig2)
+        val outputConfig = builder.build()
+
+        // Assert
+        assertThat(outputConfig.surfaceSharingOutputConfigs)
+            .containsExactly(outputConfig1, outputConfig2)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilderTest.kt b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilderTest.kt
new file mode 100644
index 0000000..4b878b1
--- /dev/null
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilderTest.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.extensions.internal.sessionprocessor
+
+import android.hardware.camera2.CameraDevice
+import android.hardware.camera2.CaptureRequest
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class Camera2SessionConfigBuilderTest {
+    @Test
+    fun canAddOutputConfig() {
+        // Arrange
+        val builder = Camera2SessionConfigBuilder()
+        val outputConfig1 = mock(Camera2OutputConfig::class.java)
+        val outputConfig2 = mock(Camera2OutputConfig::class.java)
+
+        // Act
+        builder.addOutputConfig(outputConfig1)
+        builder.addOutputConfig(outputConfig2)
+
+        // Assert
+        val sessionConfig = builder.build()
+        assertThat(sessionConfig.outputConfigs).containsExactly(outputConfig1, outputConfig2)
+    }
+
+    @Test
+    fun canSetTemplateId() {
+        // Arrange
+        val builder = Camera2SessionConfigBuilder()
+
+        // Act
+        builder.sessionTemplateId = CameraDevice.TEMPLATE_VIDEO_SNAPSHOT
+
+        // Assert
+        val sessionConfig = builder.build()
+        assertThat(sessionConfig.sessionTemplateId).isEqualTo(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT)
+    }
+
+    @Test
+    fun canSetSessionParameters() {
+        // Arrange
+        val builder = Camera2SessionConfigBuilder()
+
+        // Act
+        builder.addSessionParameter(
+            CaptureRequest.CONTROL_AWB_MODE,
+            CaptureRequest.CONTROL_AWB_MODE_OFF
+        )
+        builder.addSessionParameter(
+            CaptureRequest.CONTROL_AF_MODE,
+            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO
+        )
+
+        // Assert
+        val sessionConfig = builder.build()
+        assertThat(sessionConfig.sessionParameters[CaptureRequest.CONTROL_AWB_MODE])
+            .isEqualTo(CaptureRequest.CONTROL_AWB_MODE_OFF)
+        assertThat(sessionConfig.sessionParameters[CaptureRequest.CONTROL_AF_MODE])
+            .isEqualTo(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java
new file mode 100644
index 0000000..8b2797d
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.testing;
+
+import java.lang.ref.PhantomReference;
+import java.lang.ref.ReferenceQueue;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Utility class for tests containing methods related to garbage collection.
+ */
+public final class GarbageCollectionUtil {
+
+    private static final long FINALIZE_TIMEOUT_MILLIS = 200L;
+    private static final int NUM_GC_ITERATIONS = 10;
+
+    /**
+     * Causes garbage collection and ensures finalization has run before returning.
+     */
+    public static void runFinalization() throws TimeoutException, InterruptedException {
+        ReferenceQueue<Object> finalizeAwaitQueue = new ReferenceQueue<>();
+        PhantomReference<Object> finalizeSignal;
+        // Ensure finalization occurs multiple times
+        for (int i = 0; i < NUM_GC_ITERATIONS; ++i) {
+            finalizeSignal = new PhantomReference<>(new Object(), finalizeAwaitQueue);
+            Runtime.getRuntime().gc();
+            Runtime.getRuntime().runFinalization();
+            if (finalizeAwaitQueue.remove(FINALIZE_TIMEOUT_MILLIS) == null) {
+                throw new TimeoutException(
+                        "Finalization failed on iteration " + (i + 1) + " of " + NUM_GC_ITERATIONS);
+            }
+            finalizeSignal.clear();
+        }
+    }
+
+    // Ensure this utility class can't be instantiated
+    private GarbageCollectionUtil() {
+    }
+}
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
index 93c3a8e..3b4791e 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
@@ -42,8 +42,7 @@
         val savedFile = File.createTempFile("CameraX", ".tmp")
         savedFile.deleteOnExit()
 
-        val fileOutputOptions = FileOutputOptions.builder()
-            .setFile(savedFile)
+        val fileOutputOptions = FileOutputOptions.Builder(savedFile)
             .setFileSizeLimit(FILE_SIZE_LIMIT)
             .build()
 
@@ -65,12 +64,10 @@
             put(MediaStore.Video.Media.DISPLAY_NAME, fileName)
         }
 
-        val mediaStoreOutputOptions = MediaStoreOutputOptions.builder()
-            .setContentResolver(contentResolver)
-            .setFileSizeLimit(FILE_SIZE_LIMIT)
-            .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
-            .setContentValues(contentValues)
-            .build()
+        val mediaStoreOutputOptions = MediaStoreOutputOptions.Builder(
+            contentResolver,
+            MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+        ).setContentValues(contentValues).setFileSizeLimit(FILE_SIZE_LIMIT).build()
 
         assertThat(mediaStoreOutputOptions.contentResolver).isEqualTo(contentResolver)
         assertThat(mediaStoreOutputOptions.collection).isEqualTo(
@@ -89,8 +86,7 @@
             savedFile,
             ParcelFileDescriptor.MODE_READ_WRITE
         ).use { pfd ->
-            val fdOutputOptions = FileDescriptorOutputOptions.builder()
-                .setParcelFileDescriptor(pfd)
+            val fdOutputOptions = FileDescriptorOutputOptions.Builder(pfd)
                 .setFileSizeLimit(FILE_SIZE_LIMIT)
                 .build()
 
@@ -106,9 +102,7 @@
     fun file_builderContainsCorrectDefaults() {
         val savedFile = File.createTempFile("CameraX", ".tmp")
         savedFile.deleteOnExit()
-        val fileOutputOptions = FileOutputOptions.builder()
-            .setFile(savedFile)
-            .build()
+        val fileOutputOptions = FileOutputOptions.Builder(savedFile).build()
 
         assertThat(fileOutputOptions.fileSizeLimit).isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
         savedFile.delete()
@@ -118,19 +112,14 @@
     fun mediaStore_builderContainsCorrectDefaults() {
         val context: Context = ApplicationProvider.getApplicationContext()
         val contentResolver: ContentResolver = context.contentResolver
-        val fileName = "OutputOptionTest"
-        val contentValues = ContentValues().apply {
-            put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
-            put(MediaStore.Video.Media.TITLE, fileName)
-            put(MediaStore.Video.Media.DISPLAY_NAME, fileName)
-        }
 
-        val mediaStoreOutputOptions = MediaStoreOutputOptions.builder()
-            .setContentResolver(contentResolver)
-            .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
-            .setContentValues(contentValues)
-            .build()
+        val mediaStoreOutputOptions = MediaStoreOutputOptions.Builder(
+            contentResolver,
+            MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+        ).build()
 
+        assertThat(mediaStoreOutputOptions.contentValues)
+            .isEqualTo(MediaStoreOutputOptions.EMPTY_CONTENT_VALUES)
         assertThat(mediaStoreOutputOptions.fileSizeLimit)
             .isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
     }
@@ -142,9 +131,7 @@
             savedFile,
             ParcelFileDescriptor.MODE_READ_WRITE
         ).use { pfd ->
-            val fdOutputOptions = FileDescriptorOutputOptions.builder()
-                .setParcelFileDescriptor(pfd)
-                .build()
+            val fdOutputOptions = FileDescriptorOutputOptions.Builder(pfd).build()
 
             assertThat(fdOutputOptions.fileSizeLimit).isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
         }
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
index 1e416ca..c8cd073 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
@@ -39,6 +39,7 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.AudioUtil
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.GarbageCollectionUtil
 import androidx.camera.testing.SurfaceTextureProvider
 import androidx.camera.video.VideoRecordEvent.Finalize.ERROR_FILE_SIZE_LIMIT_REACHED
 import androidx.camera.video.VideoRecordEvent.Finalize.ERROR_SOURCE_INACTIVE
@@ -178,15 +179,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -199,7 +196,14 @@
         inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
             .accept(any(VideoRecordEvent.Finalize::class.java))
 
-        checkFileHasAudioAndVideo(Uri.fromFile(file))
+        val uri = Uri.fromFile(file)
+        checkFileHasAudioAndVideo(uri)
+
+        // Check the output Uri from the finalize event match the Uri from the given file.
+        val captor = ArgumentCaptor.forClass(VideoRecordEvent::class.java)
+        verify(videoRecordEventListener, atLeastOnce()).accept(captor.capture())
+        val finalize = captor.value as VideoRecordEvent.Finalize
+        assertThat(finalize.outputResults.outputUri).isEqualTo(uri)
 
         file.delete()
     }
@@ -215,27 +219,24 @@
             put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
         }
 
-        val outputOptions = MediaStoreOutputOptions.builder()
-            .setContentResolver(contentResolver)
-            .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
-            .setContentValues(contentValues)
-            .build()
+        val outputOptions = MediaStoreOutputOptions.Builder(
+            contentResolver,
+            MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+        ).setContentValues(contentValues).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
         var uri: Uri = Uri.EMPTY
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor()
-        ) {
-            if (it is VideoRecordEvent.Status) {
-                statusSemaphore.release()
+        val activeRecording = recorder.prepareRecording(outputOptions)
+            .withEventListener(CameraXExecutors.directExecutor()) {
+                if (it is VideoRecordEvent.Status) {
+                    statusSemaphore.release()
+                }
+                if (it is VideoRecordEvent.Finalize) {
+                    uri = it.outputResults.outputUri
+                    finalizeSemaphore.release()
+                }
             }
-            if (it is VideoRecordEvent.Finalize) {
-                uri = it.outputResults.outputUri
-                finalizeSemaphore.release()
-            }
-        }.withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+            .withAudioEnabled()
+            .start()
 
         assertThat(statusSemaphore.tryAcquire(5, 15000L, TimeUnit.MILLISECONDS)).isTrue()
 
@@ -261,17 +262,11 @@
             file,
             ParcelFileDescriptor.MODE_READ_WRITE
         ).use { pfd ->
-            val outputOptions = FileDescriptorOutputOptions.builder()
-                .setParcelFileDescriptor(pfd)
-                .build()
-
-            val pendingRecording = recorder.prepareRecording(outputOptions)
-            pendingRecording.withEventListener(
-                CameraXExecutors.directExecutor(),
-                videoRecordEventListener
-            ).withAudioEnabled()
-
-            val activeRecording = pendingRecording.start()
+            val activeRecording = recorder
+                .prepareRecording(FileDescriptorOutputOptions.Builder(pfd).build())
+                .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+                .withAudioEnabled()
+                .start()
 
             val inOrder = inOrder(videoRecordEventListener)
             inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -299,12 +294,8 @@
             file,
             ParcelFileDescriptor.MODE_READ_WRITE
         ).use { pfd ->
-            val outputOptions = FileDescriptorOutputOptions.builder()
-                .setParcelFileDescriptor(pfd)
-                .build()
-
             assertThrows(IllegalStateException::class.java) {
-                recorder.prepareRecording(outputOptions)
+                recorder.prepareRecording(FileDescriptorOutputOptions.Builder(pfd).build())
             }
         }
 
@@ -317,15 +308,11 @@
         invokeSurfaceRequest()
 
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         activeRecording.pause()
 
@@ -353,23 +340,95 @@
     }
 
     @Test
+    fun canStartRecordingPaused_whenRecorderInitializing() {
+        clearInvocations(videoRecordEventListener)
+
+        val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
+
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
+
+        activeRecording.pause()
+
+        // Only invoke surface request after pause() has been called
+        invokeSurfaceRequest()
+
+        val inOrder = inOrder(videoRecordEventListener)
+
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Start::class.java))
+
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Pause::class.java))
+
+        activeRecording.stopSafely()
+
+        file.delete()
+    }
+
+    // TODO:(b/187266265): Encoder surface cannot be reused on API level < 23 on some devices
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    fun canStartNextRecordingPausedAfterFirstRecordingFinalized() {
+        clearInvocations(videoRecordEventListener)
+        invokeSurfaceRequest()
+
+        val file1 = File.createTempFile("CameraX1", ".tmp").apply { deleteOnExit() }
+        val file2 = File.createTempFile("CameraX2", ".tmp").apply { deleteOnExit() }
+
+        // Start and stop a recording to ensure recorder is idling
+        val inOrder = inOrder(videoRecordEventListener)
+        val activeRecording1 = recorder.prepareRecording(FileOutputOptions.Builder(file1).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
+
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Start::class.java))
+
+        inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
+            .accept(any(VideoRecordEvent.Status::class.java))
+
+        activeRecording1.stopSafely()
+
+        inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
+            .accept(any(VideoRecordEvent.Finalize::class.java))
+
+        // First recording is now finalized. Try starting second recording paused.
+        val activeRecording2 = recorder.prepareRecording(FileOutputOptions.Builder(file2).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
+
+        activeRecording2.pause()
+
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Start::class.java))
+
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Pause::class.java))
+
+        activeRecording2.stopSafely()
+
+        file1.delete()
+        file2.delete()
+    }
+
+    @Test
     fun canReceiveRecordingStats() {
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
 
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
-
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
 
         val inOrder = inOrder(videoRecordEventListener)
-
         // Start
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         inOrder.verify(videoRecordEventListener, timeout(1000L))
             .accept(any(VideoRecordEvent.Start::class.java))
@@ -433,35 +492,16 @@
     @Test
     fun setFileSizeLimit() {
         val fileSizeLimit = 500L * 1024L // 500 KB
+        runFileSizeLimitTest(fileSizeLimit)
+    }
 
-        invokeSurfaceRequest()
-        val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder()
-            .setFile(file)
-            .setFileSizeLimit(fileSizeLimit)
-            .build()
-
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).start()
-
-        verify(
-            videoRecordEventListener,
-            timeout(60000L)
-        ).accept(any(VideoRecordEvent.Finalize::class.java))
-
-        val captor = ArgumentCaptor.forClass(VideoRecordEvent::class.java)
-        verify(videoRecordEventListener, atLeastOnce()).accept(captor.capture())
-
-        assertThat(captor.value.eventType).isEqualTo(VideoRecordEvent.EVENT_TYPE_FINALIZE)
-        val finalize = captor.value as VideoRecordEvent.Finalize
-        assertThat(finalize.error).isEqualTo(ERROR_FILE_SIZE_LIMIT_REACHED)
-        assertThat(file.length()).isGreaterThan(0)
-        assertThat(file.length()).isLessThan(fileSizeLimit)
-
-        file.delete()
+    // Sets the file size limit to 1 byte, which will be lower than the initial data sent from
+    // the encoder. This will ensure that the recording will be finalized even if it has no data
+    // written to it.
+    @Test
+    fun setFileSizeLimitLowerThanInitialDataSize() {
+        val fileSizeLimit = 1L // 1 byte
+        runFileSizeLimitTest(fileSizeLimit)
     }
 
     @Test
@@ -469,29 +509,34 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
-
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
 
         @Suppress("UNCHECKED_CAST")
         val streamStateObserver =
             mock(Observable.Observer::class.java) as Observable.Observer<VideoOutput.StreamState>
+        val inOrder = inOrder(streamStateObserver)
         recorder.streamState.addObserver(CameraXExecutors.directExecutor(), streamStateObserver)
 
-        val activeRecording = pendingRecording.start()
+        // Recorder should start in INACTIVE stream state before any recordings
+        inOrder.verify(streamStateObserver, timeout(1000L)).onNewData(
+            eq(VideoOutput.StreamState.INACTIVE)
+        )
 
-        val inOrder = inOrder(streamStateObserver)
-        inOrder.verify(streamStateObserver, timeout(1000L))
-            .onNewData(eq(VideoOutput.StreamState.ACTIVE))
-
-        verify(videoRecordEventListener, timeout(15000L).atLeast(5))
-            .accept(any(VideoRecordEvent.Status::class.java))
+        // Start
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
+        // Starting recording should move Recorder to ACTIVE stream state
+        inOrder.verify(streamStateObserver, timeout(1000L)).onNewData(
+            eq(VideoOutput.StreamState.ACTIVE)
+        )
 
         activeRecording.stopSafely()
 
-        inOrder.verify(streamStateObserver, timeout(FINALIZE_TIMEOUT))
-            .onNewData(eq(VideoOutput.StreamState.INACTIVE))
+        // Stopping recording should eventually move to INACTIVE stream state
+        inOrder.verify(streamStateObserver, timeout(FINALIZE_TIMEOUT)).onNewData(
+            eq(VideoOutput.StreamState.INACTIVE)
+        )
 
         file.delete()
     }
@@ -500,16 +545,16 @@
     fun start_throwsExceptionWhenActive() {
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
+        val outputOptions = FileOutputOptions.Builder(file).build()
 
-        val pendingRecording1 = recorder.prepareRecording(outputOptions)
-        pendingRecording1.start()
+        val activeRecording = recorder.prepareRecording(outputOptions).start()
 
-        val pendingRecording2 = recorder.prepareRecording(outputOptions)
+        val pendingRecording = recorder.prepareRecording(outputOptions)
         assertThrows(java.lang.IllegalStateException::class.java) {
-            pendingRecording2.start()
+            pendingRecording.start()
         }
 
+        activeRecording.close()
         file.delete()
     }
 
@@ -517,15 +562,11 @@
     fun start_beforeSurfaceRequested() {
         clearInvocations(videoRecordEventListener)
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         invokeSurfaceRequest()
 
@@ -547,17 +588,13 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
-
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
 
         recorder.onSourceStateChanged(VideoOutput.SourceState.INACTIVE)
 
-        pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
             .accept(any(VideoRecordEvent.Finalize::class.java))
@@ -567,27 +604,20 @@
         val finalize = captor.value as VideoRecordEvent.Finalize
         assertThat(finalize.error).isEqualTo(ERROR_SOURCE_INACTIVE)
 
+        activeRecording.close()
         file.delete()
     }
 
     @Test
     fun pause_beforeSurfaceRequested() {
-        // Skip for b/192995523
-        assumeFalse(
-            "MediaMuxer fails to stop if there's no data provided.",
-            Build.DEVICE.equals("sailfish", true)
-        )
         clearInvocations(videoRecordEventListener)
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
-        val activeRecording = pendingRecording.start()
         activeRecording.pause()
 
         invokeSurfaceRequest()
@@ -610,15 +640,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -651,15 +677,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -680,15 +702,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -714,15 +732,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -742,15 +756,12 @@
     fun stop_beforeSurfaceRequested() {
         clearInvocations(videoRecordEventListener)
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
-        val activeRecording = pendingRecording.start()
         activeRecording.pause()
         activeRecording.stopSafely()
 
@@ -766,17 +777,14 @@
     fun stop_fromAutoCloseable() {
         clearInvocations(videoRecordEventListener)
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
-
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        )
 
         val inOrder = inOrder(videoRecordEventListener)
         // Recording will be stopped by AutoCloseable.close() upon exiting use{} block
-        pendingRecording.start().use {
+        val pendingRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+        pendingRecording.withEventListener(
+            CameraXExecutors.directExecutor(),
+            videoRecordEventListener
+        ).start().use {
             invokeSurfaceRequest()
             inOrder.verify(videoRecordEventListener, timeout(1000L))
                 .accept(any(VideoRecordEvent.Start::class.java))
@@ -795,15 +803,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -818,6 +822,42 @@
         inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
             .accept(any(VideoRecordEvent.Finalize::class.java))
 
+        activeRecording.stop()
+        file.delete()
+    }
+
+    @Suppress("UNUSED_VALUE", "ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
+    @Test
+    fun stop_whenActiveRecordingIsGarbageCollected() {
+        clearInvocations(videoRecordEventListener)
+        val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
+
+        val inOrder = inOrder(videoRecordEventListener)
+        var activeRecording: ActiveRecording? = recorder
+            .prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
+
+        // First ensure the recording gets some status events
+        invokeSurfaceRequest()
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Start::class.java))
+        inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
+            .accept(any(VideoRecordEvent.Status::class.java))
+
+        // Remove reference to active recording and run GC. The recording should be stopped once
+        // the ActiveRecording's finalizer runs.
+        activeRecording = null
+        GarbageCollectionUtil.runFinalization()
+
+        // Ensure the event listener gets a finalize event. Note: the word "finalize" is very
+        // overloaded here. This event means the recording has finished, but does not relate to the
+        // finalizer that runs during garbage collection. However, that is what causes the
+        // recording to finish.
+        inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
+            .accept(any(VideoRecordEvent.Finalize::class.java))
+
         file.delete()
     }
 
@@ -826,15 +866,11 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        ).withAudioEnabled()
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -884,15 +920,10 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
 
-        val pendingRecording = recorder.prepareRecording(outputOptions)
-        pendingRecording.withEventListener(
-            CameraXExecutors.directExecutor(),
-            videoRecordEventListener
-        )
-
-        val activeRecording = pendingRecording.start()
+        val activeRecording = recorder.prepareRecording(FileOutputOptions.Builder(file).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .start()
 
         val inOrder = inOrder(videoRecordEventListener)
         inOrder.verify(videoRecordEventListener, timeout(1000L))
@@ -900,6 +931,14 @@
         inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
             .accept(any(VideoRecordEvent.Status::class.java))
 
+        // Check the audio information reports state as disabled.
+        val captor = ArgumentCaptor.forClass(VideoRecordEvent::class.java)
+        verify(videoRecordEventListener, atLeastOnce()).accept(captor.capture())
+        assertThat(captor.value.eventType).isEqualTo(VideoRecordEvent.EVENT_TYPE_STATUS)
+        val status = captor.value as VideoRecordEvent.Status
+        assertThat(status.recordingStats.audioStats.audioState)
+            .isEqualTo(AudioStats.AUDIO_STATE_DISABLED)
+
         activeRecording.stopSafely()
 
         verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
@@ -911,6 +950,66 @@
         file.delete()
     }
 
+    @Test
+    fun cannotStartMultiplePendingRecordingsWhileInitializing() {
+        val file1 = File.createTempFile("CameraX1", ".tmp").apply { deleteOnExit() }
+        val file2 = File.createTempFile("CameraX2", ".tmp").apply { deleteOnExit() }
+        try {
+            // We explicitly do not invoke the surface request so the recorder is initializing.
+            recorder.prepareRecording(FileOutputOptions.Builder(file1).build()).start().use {
+                assertThrows<IllegalStateException> {
+                    recorder.prepareRecording(FileOutputOptions.Builder(file2).build()).start()
+                }
+            }
+        } finally {
+            file1.delete()
+            file2.delete()
+        }
+    }
+
+    // TODO:(b/187266265): Encoder surface cannot be reused on API level < 23 on some devices
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    fun nextRecordingCanBeStartedAfterLastRecordingStopped() {
+        clearInvocations(videoRecordEventListener)
+        invokeSurfaceRequest()
+        val file1 = File.createTempFile("CameraX1", ".tmp").apply { deleteOnExit() }
+        val file2 = File.createTempFile("CameraX2", ".tmp").apply { deleteOnExit() }
+
+        val inOrder = inOrder(videoRecordEventListener)
+        try {
+            recorder.prepareRecording(FileOutputOptions.Builder(file1).build())
+                .withEventListener(
+                    CameraXExecutors.directExecutor(),
+                    videoRecordEventListener
+                ).start().use {
+                    inOrder.verify(videoRecordEventListener, timeout(1000L))
+                        .accept(any(VideoRecordEvent.Start::class.java))
+                    inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
+                        .accept(any(VideoRecordEvent.Status::class.java))
+                }
+
+            recorder.prepareRecording(FileOutputOptions.Builder(file2).build())
+                .withEventListener(
+                    CameraXExecutors.directExecutor(),
+                    videoRecordEventListener
+                ).start().use {
+                    inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
+                        .accept(any(VideoRecordEvent.Finalize::class.java))
+                    inOrder.verify(videoRecordEventListener, timeout(1000L))
+                        .accept(any(VideoRecordEvent.Start::class.java))
+                    inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
+                        .accept(any(VideoRecordEvent.Status::class.java))
+                }
+
+            verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
+                .accept(any(VideoRecordEvent.Finalize::class.java))
+        } finally {
+            file1.delete()
+            file2.delete()
+        }
+    }
+
     private fun invokeSurfaceRequest() {
         instrumentation.runOnMainSync {
             preview.setSurfaceProvider { request: SurfaceRequest ->
@@ -972,4 +1071,33 @@
             invokeSurfaceRequest()
         }
     }
+
+    private fun runFileSizeLimitTest(fileSizeLimit: Long) {
+        invokeSurfaceRequest()
+        val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
+        val outputOptions = FileOutputOptions.Builder(file)
+            .setFileSizeLimit(fileSizeLimit)
+            .build()
+
+        val activeRecording = recorder
+            .prepareRecording(outputOptions)
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .start()
+
+        verify(
+            videoRecordEventListener,
+            timeout(60000L)
+        ).accept(any(VideoRecordEvent.Finalize::class.java))
+
+        val captor = ArgumentCaptor.forClass(VideoRecordEvent::class.java)
+        verify(videoRecordEventListener, atLeastOnce()).accept(captor.capture())
+
+        assertThat(captor.value.eventType).isEqualTo(VideoRecordEvent.EVENT_TYPE_FINALIZE)
+        val finalize = captor.value as VideoRecordEvent.Finalize
+        assertThat(finalize.error).isEqualTo(ERROR_FILE_SIZE_LIMIT_REACHED)
+        assertThat(file.length()).isLessThan(fileSizeLimit)
+
+        activeRecording.close()
+        file.delete()
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
index 44e6bcf..792cb06 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
@@ -31,7 +31,6 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.GLUtil
-import androidx.camera.video.QualitySelector.QUALITY_HIGHEST
 import androidx.camera.video.QualitySelector.QUALITY_LOWEST
 import androidx.camera.video.VideoOutput.StreamState
 import androidx.test.core.app.ApplicationProvider
@@ -137,10 +136,7 @@
         assumeFalse(Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29)
 
         // Arrange.
-        val qualityList = QualitySelector.getSupportedQualities(cameraInfo) + arrayOf(
-            QUALITY_HIGHEST,
-            QUALITY_LOWEST
-        )
+        val qualityList = QualitySelector.getSupportedQualities(cameraInfo)
         qualityList.forEach loop@{ quality ->
             val targetResolution = QualitySelector.getResolution(cameraInfo, quality)
             val videoOutput = TestVideoOutput(
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureIntegrationTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureIntegrationTest.kt
deleted file mode 100644
index 30c17ba..0000000
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureIntegrationTest.kt
+++ /dev/null
@@ -1,712 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.camera.video
-
-import android.Manifest
-import android.content.ContentResolver
-import android.content.ContentValues
-import android.content.Context
-import android.graphics.SurfaceTexture
-import android.media.MediaMetadataRetriever
-import android.media.MediaRecorder
-import android.net.Uri
-import android.os.Build
-import android.os.ParcelFileDescriptor
-import android.provider.MediaStore
-import android.util.Size
-import androidx.annotation.NonNull
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.core.AspectRatio
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
-import androidx.camera.core.ImageAnalysis
-import androidx.camera.core.ImageCapture
-import androidx.camera.core.ImageProxy
-import androidx.camera.core.Logger
-import androidx.camera.core.Preview
-import androidx.camera.core.Preview.SurfaceProvider
-import androidx.camera.core.UseCase
-import androidx.camera.core.VideoCapture
-import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.core.internal.CameraUseCaseAdapter.CameraException
-import androidx.camera.testing.AudioUtil
-import androidx.camera.testing.CameraUtil
-import androidx.camera.testing.SurfaceTextureProvider
-import androidx.camera.testing.SurfaceTextureProvider.SurfaceTextureCallback
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.rule.GrantPermissionRule
-import com.google.common.truth.Truth.assertThat
-import org.junit.After
-import org.junit.Assume.assumeFalse
-import org.junit.Assume.assumeTrue
-import org.junit.Before
-import org.junit.Ignore
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-import org.mockito.ArgumentCaptor
-import org.mockito.Mockito
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.verify
-import java.io.File
-import java.io.FileDescriptor
-import java.io.IOException
-import java.util.ArrayList
-import java.util.Collections
-import java.util.concurrent.ExecutionException
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.TimeoutException
-import kotlin.math.abs
-
-@LargeTest
-@RunWith(Parameterized::class)
-class VideoCaptureIntegrationTest(
-    private var cameraSelector: CameraSelector
-) {
-    companion object {
-        private const val TAG = "VideoCaptureIntegrationTest"
-
-        @JvmStatic
-        @Parameterized.Parameters
-        fun data(): Collection<Array<Any>> {
-            return listOf(
-                arrayOf(CameraSelector.DEFAULT_BACK_CAMERA),
-                arrayOf(CameraSelector.DEFAULT_FRONT_CAMERA),
-            )
-        }
-    }
-
-    private val instrumentation = InstrumentationRegistry.getInstrumentation()
-    private val context: Context = ApplicationProvider.getApplicationContext()
-
-    @get:Rule
-    val cameraRule = CameraUtil.grantCameraPermissionAndPreTest()
-
-    @get:Rule
-    val runtimePermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
-        Manifest.permission.WRITE_EXTERNAL_STORAGE,
-        Manifest.permission.RECORD_AUDIO
-    )
-
-    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
-    private lateinit var contentResolver: ContentResolver
-    private lateinit var videoUseCase: VideoCapture
-    private lateinit var callback: VideoCapture.OnVideoSavedCallback
-    private lateinit var outputFileResultsArgumentCaptor:
-        ArgumentCaptor<VideoCapture.OutputFileResults>
-
-    @Before
-    fun setUp() {
-        // TODO(b/168175357): Fix VideoCaptureTest problems on CuttleFish API 29
-        assumeFalse(
-            "Cuttlefish has MediaCodec dequeueInput/Output buffer fails issue. Unable to test.",
-            Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29
-        )
-
-        // TODO(b/168187087): Video: Unable to record Video on Pixel 1 API 26,27 when only
-        // VideoCapture is bound
-        // On API 28 the muxer started lately just after receive the stop command, that will cause a
-        // failure.
-        assumeFalse(
-            "Pixel running API 26 has CameraDevice.onError when set repeating request",
-            Build.DEVICE == "sailfish" &&
-                (
-                    Build.VERSION.SDK_INT == 26 || Build.VERSION.SDK_INT == 27 || Build.VERSION
-                        .SDK_INT == 28
-                    )
-        )
-        assumeTrue(AudioUtil.canStartAudioRecord(MediaRecorder.AudioSource.CAMCORDER))
-
-        CameraX.initialize(context, Camera2Config.defaultConfig())
-        assumeTrue(
-            CameraUtil.hasCameraWithLensFacing(
-                cameraSelector.lensFacing!!
-            )
-        )
-        cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
-        contentResolver = context.contentResolver
-        callback = Mockito.mock(
-            VideoCapture.OnVideoSavedCallback::class.java
-        )
-        outputFileResultsArgumentCaptor = ArgumentCaptor.forClass(
-            VideoCapture.OutputFileResults::class.java
-        )
-    }
-
-    @After
-    @Throws(InterruptedException::class, ExecutionException::class, TimeoutException::class)
-    fun tearDown() {
-        instrumentation.runOnMainSync {
-            if (this::cameraUseCaseAdapter.isInitialized) {
-                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
-            }
-        }
-        CameraX.shutdown()[10000, TimeUnit.MILLISECONDS]
-    }
-
-    @Test(timeout = 60000)
-    fun canRecordingThreeVideosToFilesInARow() {
-        // Arrange.
-        videoUseCase = VideoCapture.Builder().build()
-
-        instrumentation.runOnMainSync {
-            try {
-                cameraUseCaseAdapter.addUseCases(setOf(videoUseCase))
-            } catch (e: CameraException) {
-                e.printStackTrace()
-            }
-        }
-
-        // Act.
-        // Recording 1st video
-        val savedFirstFile = File.createTempFile("CameraX00", ".tmp")
-        savedFirstFile.deleteOnExit()
-        startRecordingWithUriAndVerifyCallback(savedFirstFile)
-
-        // Recording 2nd video
-        val savedSecondFile = File.createTempFile("CameraX01", ".tmp")
-        savedSecondFile.deleteOnExit()
-        startRecordingWithUriAndVerifyCallback(savedSecondFile)
-
-        // Recording 3rd video
-        val savedThirdFile = File.createTempFile("CameraX02", ".tmp")
-        savedThirdFile.deleteOnExit()
-        startRecordingWithUriAndVerifyCallback(savedThirdFile)
-
-        val firstUri = Uri.fromFile(savedFirstFile)
-        val secondUri = Uri.fromFile(savedSecondFile)
-        val thirdUri = Uri.fromFile(savedThirdFile)
-
-        verifyRecordingResult(firstUri)
-        verifyRecordingResult(secondUri)
-        verifyRecordingResult(thirdUri)
-    }
-
-    @Ignore
-    @Test
-    fun canRecordingToFileAndStopImmediately() {
-        // Arrange.
-        videoUseCase = VideoCapture.Builder().build()
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        instrumentation.runOnMainSync {
-            try {
-                cameraUseCaseAdapter.addUseCases(setOf(videoUseCase))
-            } catch (e: CameraException) {
-                e.printStackTrace()
-            }
-        }
-
-        // Start recording
-        videoUseCase.startRecording(
-            VideoCapture.OutputFileOptions.Builder(savedFile).build(),
-            CameraXExecutors.mainThreadExecutor(), callback
-        )
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verify(callback, Mockito.timeout(2000))
-            .onVideoSaved(outputFileResultsArgumentCaptor.capture())
-        val savedUri = outputFileResultsArgumentCaptor.value.savedUri
-        assertThat(savedUri).isNotNull()
-        assertThat(Uri.fromFile(savedFile)).isEqualTo(savedUri)
-        verifyRecordingResult(savedUri!!)
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun canRecordingWithAspectRatio4By3() {
-        // Arrange.
-        videoUseCase = VideoCapture.Builder()
-            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
-            .build()
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        instrumentation.runOnMainSync {
-            try {
-                cameraUseCaseAdapter.addUseCases(setOf(videoUseCase))
-            } catch (e: CameraException) {
-                e.printStackTrace()
-            }
-        }
-
-        // Start recording
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-
-        // Assert.
-        verifyOnSavedCallback()
-
-        val mediaRetriever = MediaMetadataRetriever()
-        mediaRetriever.setDataSource(context, Uri.fromFile(savedFile))
-        val height =
-            mediaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!
-                .toInt().toFloat()
-        val width =
-            mediaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!
-                .toInt().toFloat()
-        Logger.i(TAG, "width: $width height:$height")
-        // Checks the aspect ration with a tolerance, because some devices have mod16 resolution.
-        assertThat(abs((width / height) - 4.0f / 3.0f) < 0.01).isTrue()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun canRecordingWithAspectRatio16By9() {
-        // Arrange.
-        videoUseCase = VideoCapture.Builder()
-            .setTargetAspectRatio(AspectRatio.RATIO_16_9)
-            .build()
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        instrumentation.runOnMainSync {
-            try {
-                cameraUseCaseAdapter.addUseCases(setOf(videoUseCase))
-            } catch (e: CameraException) {
-                e.printStackTrace()
-            }
-        }
-
-        // Start recording
-        startRecordingWithFile(savedFile)
-        videoUseCase.stopRecording()
-
-        // Assert.
-        verifyOnSavedCallback()
-
-        val mediaRetriever = MediaMetadataRetriever()
-        mediaRetriever.setDataSource(context, Uri.fromFile(savedFile))
-        val height =
-            mediaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!
-                .toInt().toFloat()
-        val width =
-            mediaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!
-                .toInt().toFloat()
-        Logger.i(TAG, "width: $width height:$height")
-        // Checks the aspect ration with a tolerance, because some devices have mod16 resolution.
-        assertThat(abs((width / height) - 16.0f / 9.0f) < 0.03).isTrue()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun recordingWithPreview() {
-        // Arrange.
-        val preview: Preview = Preview.Builder().build()
-        // Sets surface provider to preview
-        instrumentation.runOnMainSync {
-            preview.setSurfaceProvider(
-                getSurfaceProvider()
-            )
-        }
-
-        videoUseCase = VideoCapture.Builder().build()
-
-        assumeTrue(checkUseCasesCombinationSupported(videoUseCase, preview))
-
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        addUseCaseToCamera(preview, videoUseCase)
-
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verifyOnSavedCallback()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun recordingWithImageCapture() {
-        // Arrange.
-        val imageCapture: ImageCapture = ImageCapture.Builder().build()
-        videoUseCase = VideoCapture.Builder().build()
-
-        assumeTrue(checkUseCasesCombinationSupported(videoUseCase, imageCapture))
-
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        addUseCaseToCamera(imageCapture, videoUseCase)
-
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verifyOnSavedCallback()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun recordingWithImageAnalysis() {
-        // Arrange.
-        val analysis = ImageAnalysis.Builder().build()
-
-        // Make ImageAnalysis active.
-        analysis.setAnalyzer(
-            CameraXExecutors.mainThreadExecutor(),
-            { obj: ImageProxy -> obj.close() }
-        )
-
-        videoUseCase = VideoCapture.Builder().build()
-
-        assumeTrue(checkUseCasesCombinationSupported(videoUseCase, analysis))
-
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        addUseCaseToCamera(analysis, videoUseCase)
-
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verifyOnSavedCallback()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun recordingWithPreviewAndImageAnalysis() {
-        // Arrange.
-        val preview = Preview.Builder().build()
-        // Sets surface provider to preview
-        instrumentation.runOnMainSync {
-            preview.setSurfaceProvider(
-                getSurfaceProvider()
-            )
-        }
-
-        val analysis = ImageAnalysis.Builder().build()
-        // Make ImageAnalysis active.
-        analysis.setAnalyzer(
-            CameraXExecutors.mainThreadExecutor(),
-            { obj: ImageProxy -> obj.close() }
-        )
-
-        videoUseCase = VideoCapture.Builder().build()
-
-        assumeTrue(checkUseCasesCombinationSupported(videoUseCase, preview, analysis))
-
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        addUseCaseToCamera(preview, analysis, videoUseCase)
-
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verifyOnSavedCallback()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun recordingWithPreviewAndImageCapture() {
-        // Arrange.
-        val preview = Preview.Builder().build()
-        // Sets surface provider to preview
-        instrumentation.runOnMainSync {
-            preview.setSurfaceProvider(
-                getSurfaceProvider()
-            )
-        }
-
-        val imageCapture = ImageCapture.Builder().build()
-
-        videoUseCase = VideoCapture.Builder().build()
-
-        assumeTrue(checkUseCasesCombinationSupported(videoUseCase, preview, imageCapture))
-
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        addUseCaseToCamera(preview, imageCapture, videoUseCase)
-
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verifyOnSavedCallback()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun recordingWithImageAnalysisAndImageCapture() {
-        // Arrange.
-        val imageCapture = ImageCapture.Builder().build()
-        val analysis = ImageAnalysis.Builder().build()
-        // Make ImageAnalysis active.
-        analysis.setAnalyzer(
-            CameraXExecutors.mainThreadExecutor(),
-            { obj: ImageProxy -> obj.close() }
-        )
-
-        videoUseCase = VideoCapture.Builder().build()
-
-        assumeTrue(checkUseCasesCombinationSupported(videoUseCase, analysis, imageCapture))
-
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        addUseCaseToCamera(analysis, imageCapture, videoUseCase)
-
-        startRecordingWithFile(savedFile)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verifyOnSavedCallback()
-        verifyRecordingResult(Uri.fromFile(savedFile))
-    }
-
-    @Test(timeout = 30000)
-    @Throws(IOException::class)
-    fun unbind_shouldStopRecording() {
-        val file = File.createTempFile("CameraX", "tmp")
-        file.deleteOnExit()
-
-        // Arrange.
-        videoUseCase = VideoCapture.Builder().build()
-        addUseCaseToCamera(videoUseCase)
-
-        startRecordingWithFile(file)
-
-        instrumentation.runOnMainSync {
-            cameraUseCaseAdapter.removeUseCases(
-                cameraUseCaseAdapter.useCases
-            )
-        }
-
-        verify(callback, Mockito.timeout(2000))
-            .onVideoSaved(outputFileResultsArgumentCaptor.capture())
-        verifyRecordingResult(Uri.fromFile(file))
-    }
-
-    @Test(timeout = 30000)
-    @SdkSuppress(minSdkVersion = 26)
-    fun startRecordingWithUri_whenAPILevelLargerThan26() {
-        val useCase = VideoCapture.Builder().build()
-
-        instrumentation.runOnMainSync {
-            cameraUseCaseAdapter.addUseCases(Collections.singleton<UseCase>(useCase))
-        }
-
-        val callback = Mockito.mock(VideoCapture.OnVideoSavedCallback::class.java)
-        useCase.startRecording(
-            getNewVideoOutputFileOptions(contentResolver),
-            CameraXExecutors.mainThreadExecutor(),
-            callback
-        )
-
-        recordingUntilKeyFrameArrived(useCase)
-        useCase.stopRecording()
-
-        // Assert: Wait for the signal that the image has been saved.
-        val outputFileResultsArgumentCaptor =
-            ArgumentCaptor.forClass(
-                VideoCapture.OutputFileResults::class.java
-            )
-        verify(
-            callback,
-            Mockito.timeout(10000)
-        ).onVideoSaved(outputFileResultsArgumentCaptor.capture())
-
-        // get file path to remove it
-        val saveLocationUri =
-            outputFileResultsArgumentCaptor.value.savedUri
-        assertThat(saveLocationUri).isNotNull()
-        verifyRecordingResult(saveLocationUri!!)
-
-        // Remove temp test file
-        contentResolver.delete(saveLocationUri, null, null)
-    }
-
-    @Test(timeout = 30000)
-    @SdkSuppress(minSdkVersion = 26)
-    fun startRecordingWithFileDescriptor_whenAPILevelLargerThan26() {
-        // Arrange.
-        videoUseCase = VideoCapture.Builder()
-            .build()
-        val savedFile = File.createTempFile("CameraX", ".tmp")
-        savedFile.deleteOnExit()
-
-        // It's needed to have a variable here to hold the parcel file descriptor reference which
-        // returned from ParcelFileDescriptor.open(), the returned parcel descriptor reference might
-        // be garbage collected unexpectedly. That will caused an "invalid file descriptor" issue.
-        val pfd: ParcelFileDescriptor = ParcelFileDescriptor.open(
-            savedFile,
-            ParcelFileDescriptor.MODE_READ_WRITE
-        )
-        val fd: FileDescriptor = pfd.fileDescriptor
-
-        instrumentation.runOnMainSync {
-            try {
-                cameraUseCaseAdapter.addUseCases(setOf(videoUseCase))
-            } catch (e: CameraException) {
-                e.printStackTrace()
-            }
-        }
-
-        // Start recording
-        videoUseCase.startRecording(
-            VideoCapture.OutputFileOptions.Builder(fd).build(),
-            CameraXExecutors.mainThreadExecutor(), callback
-        )
-
-        recordingUntilKeyFrameArrived(videoUseCase)
-        videoUseCase.stopRecording()
-
-        // Assert.
-        verify(callback, Mockito.timeout(2000))
-            .onVideoSaved(outputFileResultsArgumentCaptor.capture())
-        verifyRecordingResult(Uri.fromFile(savedFile))
-        pfd.close()
-    }
-
-    /** Return a VideoOutputFileOption which is used to save a video.  */
-    private fun getNewVideoOutputFileOptions(
-        resolver: ContentResolver
-    ): VideoCapture.OutputFileOptions {
-        val videoFileName = "video_" + System.currentTimeMillis()
-        val contentValues = ContentValues().apply {
-            put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
-            put(MediaStore.Video.Media.TITLE, videoFileName)
-            put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName)
-        }
-
-        return VideoCapture.OutputFileOptions.Builder(
-            resolver,
-            MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues
-        ).build()
-    }
-
-    private fun startRecordingWithUriAndVerifyCallback(file: File?) {
-        // callback need to reset since it is called multiple in same test.
-        reset(callback)
-        startRecordingWithFile(file)
-
-        videoUseCase.stopRecording()
-        // Assert.
-        verify(callback, Mockito.timeout(2000))
-            .onVideoSaved(outputFileResultsArgumentCaptor.capture())
-    }
-
-    private fun addUseCaseToCamera(@NonNull vararg useCases: UseCase) {
-        val caseList: MutableList<UseCase> = ArrayList()
-        for (case in useCases) {
-            caseList.add(case)
-        }
-
-        instrumentation.runOnMainSync {
-            try {
-                cameraUseCaseAdapter.addUseCases(caseList)
-            } catch (e: CameraException) {
-                e.printStackTrace()
-            }
-        }
-    }
-
-    private fun checkUseCasesCombinationSupported(@NonNull vararg useCases: UseCase): Boolean {
-        val useCaseList: MutableList<UseCase> = ArrayList()
-        for (case in useCases) {
-            useCaseList.add(case)
-        }
-
-        try {
-            cameraUseCaseAdapter.checkAttachUseCases(useCaseList)
-        } catch (e: CameraException) {
-            // This use combination is not supported on this device, abort this test.
-            Logger.i(TAG, "This combination is not supported: $useCaseList .")
-            return false
-        }
-        return true
-    }
-
-    private fun startRecordingWithFile(file: File?) {
-        // Start recording
-        videoUseCase.startRecording(
-            VideoCapture.OutputFileOptions.Builder(file!!).build(),
-            CameraXExecutors.mainThreadExecutor(), callback
-        )
-
-        recordingUntilKeyFrameArrived(videoUseCase)
-    }
-
-    private fun verifyOnSavedCallback() {
-        verify(callback, Mockito.timeout(2000))
-            .onVideoSaved(outputFileResultsArgumentCaptor.capture())
-
-        val savedUri = outputFileResultsArgumentCaptor.value.savedUri
-        assertThat(savedUri).isNotNull()
-    }
-
-    private fun getSurfaceProvider(): SurfaceProvider {
-        return SurfaceTextureProvider.createSurfaceTextureProvider(object : SurfaceTextureCallback {
-            override fun onSurfaceTextureReady(surfaceTexture: SurfaceTexture, resolution: Size) {
-                // No-op
-            }
-
-            override fun onSafeToRelease(surfaceTexture: SurfaceTexture) {
-                surfaceTexture.release()
-            }
-        })
-    }
-
-    private fun verifyRecordingResult(uri: Uri) {
-        val mediaRetriever = MediaMetadataRetriever()
-        mediaRetriever.apply {
-            setDataSource(context, uri)
-            val hasAudio = extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO)
-            val hasVideo = extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO)
-
-            assertThat(hasAudio).isEqualTo("yes")
-            assertThat(hasVideo).isEqualTo("yes")
-        }
-    }
-
-    private fun recordingUntilKeyFrameArrived(videoCapture: VideoCapture) {
-        Logger.i(TAG, "recordingUntilKeyFrameArrived begins: " + System.nanoTime() / 1000)
-
-        while (true) {
-            if (videoCapture.mIsFirstVideoKeyFrameWrite.get() && videoCapture
-                .mIsFirstAudioSampleWrite.get()
-            ) {
-                Logger.i(
-                    TAG,
-                    "Video Key Frame and audio frame Arrived: " + System.nanoTime() / 1000
-                )
-                break
-            }
-            Thread.sleep(100)
-        }
-        Logger.i(TAG, "recordingUntilKeyFrameArrived ends: " + System.nanoTime() / 1000)
-    }
-}
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
index a172cc5..7ee8a9c 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
@@ -297,7 +297,6 @@
         // Arrange.
         val videoCapture = VideoCapture.withOutput(Recorder.Builder().build())
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        val outputOptions = FileOutputOptions.builder().setFile(file).build()
         @Suppress("UNCHECKED_CAST")
         val mockListener = mock(Consumer::class.java) as Consumer<VideoRecordEvent>
         instrumentation.runOnMainSync {
@@ -307,7 +306,7 @@
 
         // Act.
         videoCapture.output
-            .prepareRecording(outputOptions)
+            .prepareRecording(FileOutputOptions.Builder(file).build())
             .withEventListener(
                 CameraXExecutors.directExecutor(),
                 mockListener
@@ -403,10 +402,8 @@
 
     private fun startVideoRecording(videoCapture: VideoCapture<Recorder>, file: File):
         ActiveRecording {
-            val outputOptions = FileOutputOptions.builder().setFile(file).build()
-
             val activeRecording = videoCapture.output
-                .prepareRecording(outputOptions)
+                .prepareRecording(FileOutputOptions.Builder(file).build())
                 .withEventListener(
                     CameraXExecutors.directExecutor(),
                     videoRecordEventListener
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt
index 1d43406..5d08268 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt
@@ -24,6 +24,7 @@
 import android.media.MediaFormat
 import android.media.MediaRecorder
 import android.os.Build
+import android.os.SystemClock
 import android.util.Log
 import android.util.Size
 import android.view.Surface
@@ -71,6 +72,7 @@
 import org.mockito.invocation.InvocationOnMock
 import java.util.concurrent.Executor
 import java.util.concurrent.TimeUnit
+import kotlin.math.abs
 
 private const val TAG = "VideoEncoderTest"
 
@@ -294,6 +296,26 @@
         assertThat(isKeyFrame(captor.allValues.first().bufferInfo)).isTrue()
     }
 
+    @Test
+    fun bufferTimeIsUptime() {
+        // Skip test if the difference between uptime and realtime is too close to avoid test flaky.
+        // Note: Devices such as lab devices always have usb-plugged, so the uptime and realtime
+        // may always be the same and be skipped.
+        // TODO(b/199486135): Find a way to make the uptime differ from realtime in lab devices
+        assumeTrue(abs(SystemClock.elapsedRealtime() - SystemClock.uptimeMillis()) > 3000)
+
+        videoEncoder.start()
+        val captor = ArgumentCaptor.forClass(EncodedData::class.java)
+        verify(videoEncoderCallback, timeout(15000L).atLeast(5)).onEncodedData(captor.capture())
+
+        val bufferTimeUs = captor.value.presentationTimeUs
+        val uptimeUs = TimeUnit.MILLISECONDS.toMicros(SystemClock.uptimeMillis())
+        val realtimeUs = TimeUnit.MILLISECONDS.toMicros(SystemClock.elapsedRealtime())
+        val isCloseToUptime = abs(bufferTimeUs - uptimeUs) <= abs(bufferTimeUs - realtimeUs)
+
+        assertThat(isCloseToUptime).isTrue()
+    }
+
     private fun initVideoEncoder() {
         val cameraInfo = camera.cameraInfo as CameraInfoInternal
         val profileProvider = cameraInfo.camcorderProfileProvider
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java b/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java
index 2dffe99..53d7383 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java
@@ -17,14 +17,11 @@
 package androidx.camera.video;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.camera.core.Logger;
 import androidx.camera.core.impl.utils.CloseGuardHelper;
 import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import java.util.concurrent.Executor;
-import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -45,41 +42,59 @@
  */
 public final class ActiveRecording implements AutoCloseable {
 
-    private static final String TAG = "ActiveRecording";
-
     // Indicates the recording has been explicitly stopped by users.
     private final AtomicBoolean mIsStopped = new AtomicBoolean(false);
-    // Indicates the recording has been finalized. Not to be confused with the object being
-    // finalized via its finalizer.
-    private final AtomicBoolean mIsRecordingFinalized = new AtomicBoolean(false);
     private final Recorder mRecorder;
+    private final long mRecordingId;
     private final OutputOptions mOutputOptions;
-    private final Consumer<VideoRecordEvent> mEventListener;
-    private final Executor mCallbackExecutor;
     private final CloseGuardHelper mCloseGuard = CloseGuardHelper.create();
-    private final boolean mAudioEnabled;
 
-    ActiveRecording(@NonNull Recorder recorder, @NonNull OutputOptions options,
-            @Nullable Executor callbackExecutor, @Nullable Consumer<VideoRecordEvent> listener,
-            boolean audioEnabled) {
+    ActiveRecording(@NonNull Recorder recorder, long recordingId, @NonNull OutputOptions options,
+            boolean finalizedOnCreation) {
         mRecorder = recorder;
+        mRecordingId = recordingId;
         mOutputOptions = options;
-        mCallbackExecutor = callbackExecutor;
-        mEventListener = listener;
 
-        mCloseGuard.open("stop");
-        mAudioEnabled = audioEnabled;
+        if (finalizedOnCreation) {
+            mIsStopped.set(true);
+        } else {
+            mCloseGuard.open("stop");
+        }
     }
 
     /**
-     * Creates an {@link ActiveRecording} from a {@link PendingRecording}.
+     * Creates an {@link ActiveRecording} from a {@link PendingRecording} and recording ID.
+     *
+     * <p>The recording ID is expected to be unique to the recorder that generated the pending
+     * recording.
      */
     @NonNull
-    static ActiveRecording from(@NonNull PendingRecording pendingRecording) {
+    static ActiveRecording from(@NonNull PendingRecording pendingRecording, long recordingId) {
         Preconditions.checkNotNull(pendingRecording, "The given PendingRecording cannot be null.");
         return new ActiveRecording(pendingRecording.getRecorder(),
-                pendingRecording.getOutputOptions(), pendingRecording.getCallbackExecutor(),
-                pendingRecording.getEventListener(), pendingRecording.isAudioEnabled());
+                recordingId,
+                pendingRecording.getOutputOptions(),
+                /*finalizedOnCreation=*/false);
+    }
+
+    /**
+     * Creates an {@link ActiveRecording} from a {@link PendingRecording} and recording ID in a
+     * finalized state.
+     *
+     * <p>This can be used if there was an error setting up the active recording and it would not
+     * be able to be started.
+     *
+     * <p>The recording ID is expected to be unique to the recorder that generated the pending
+     * recording.
+     */
+    @NonNull
+    static ActiveRecording createFinalizedFrom(@NonNull PendingRecording pendingRecording,
+            long recordingId) {
+        Preconditions.checkNotNull(pendingRecording, "The given PendingRecording cannot be null.");
+        return new ActiveRecording(pendingRecording.getRecorder(),
+                recordingId,
+                pendingRecording.getOutputOptions(),
+                /*finalizedOnCreation=*/true);
     }
 
     @NonNull
@@ -87,10 +102,6 @@
         return mOutputOptions;
     }
 
-    boolean isAudioEnabled() {
-        return mAudioEnabled;
-    }
-
     /**
      * Pauses the current recording if active.
      *
@@ -108,10 +119,7 @@
         if (mIsStopped.get()) {
             throw new IllegalStateException("The recording has been stopped.");
         }
-        if (mIsRecordingFinalized.get()) {
-            return;
-        }
-        mRecorder.pause();
+        mRecorder.pause(this);
     }
 
     /**
@@ -130,10 +138,7 @@
         if (mIsStopped.get()) {
             throw new IllegalStateException("The recording has been stopped.");
         }
-        if (mIsRecordingFinalized.get()) {
-            return;
-        }
-        mRecorder.resume();
+        mRecorder.resume(this);
     }
 
     /**
@@ -150,26 +155,10 @@
      */
     public void stop() {
         mCloseGuard.close();
-        if (mIsStopped.getAndSet(true) || mIsRecordingFinalized.get()) {
+        if (mIsStopped.getAndSet(true)) {
             return;
         }
-        mRecorder.stop();
-    }
-
-    /**
-     * Updates the recording status and callback to users.
-     */
-    void updateVideoRecordEvent(@NonNull VideoRecordEvent event) {
-        if (event instanceof VideoRecordEvent.Finalize) {
-            mIsRecordingFinalized.set(true);
-        }
-        if (mCallbackExecutor != null && mEventListener != null) {
-            try {
-                mCallbackExecutor.execute(() -> mEventListener.accept(event));
-            } catch (RejectedExecutionException e) {
-                Logger.e(TAG, "The callback executor is invalid.", e);
-            }
-        }
+        mRecorder.stop(this);
     }
 
     /**
@@ -195,4 +184,9 @@
             super.finalize();
         }
     }
+
+    /** Returns the recording ID which is unique to the recorder that generated this recording. */
+    long getRecordingId() {
+        return mRecordingId;
+    }
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java b/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java
new file mode 100644
index 0000000..1443c8b
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+import com.google.auto.value.AutoValue;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * The audio information about an {@link ActiveRecording} at a point in time.
+ *
+ * <p>The audio information will be contained in every {@link RecordingStats}.
+ */
+@AutoValue
+public abstract class AudioStats {
+
+    // Restrict to package-private.
+    AudioStats() {
+
+    }
+
+    @NonNull
+    static AudioStats of(@AudioState int state, @Nullable Throwable errorCause) {
+        return new AutoValue_AudioStats(state, errorCause);
+    }
+
+    /**
+     * The recording is being recorded with audio data.
+     *
+     * <p>When audio is active, the recorded video file will contain audio data.
+     */
+    public static final int AUDIO_STATE_ACTIVE = 0;
+    /**
+     * The recording is disabled.
+     *
+     * <p>This audio state results from a {@link PendingRecording} that was
+     * {@linkplain PendingRecording#start() started} without calling
+     * {@link PendingRecording#withAudioEnabled()}.
+     */
+    public static final int AUDIO_STATE_DISABLED = 1;
+    /**
+     * The recording is muted because the audio source is silenced by the system.
+     *
+     * <p>If the audio source is occupied by privilege application, depending on the system
+     * version, the system may silence the application that are using the audio source. Use
+     * {@link #getErrorCause()} to get the error cause.
+     */
+    public static final int AUDIO_STATE_SOURCE_SILENCED = 2;
+    /**
+     * The recording is muted because the audio encoder encountered errors.
+     *
+     * <p>Use {@link #getErrorCause()} to get the error cause.
+     */
+    public static final int AUDIO_STATE_ENCODER_ERROR = 3;
+
+    /** @hide */
+    @IntDef({AUDIO_STATE_ACTIVE, AUDIO_STATE_DISABLED, AUDIO_STATE_SOURCE_SILENCED,
+            AUDIO_STATE_ENCODER_ERROR})
+    @Retention(RetentionPolicy.SOURCE)
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public @interface AudioState {
+    }
+
+    /**
+     * The subset of states considered error states.
+     *
+     * <p>{@link #hasError()} returns {@code true} if the current state is one of the error states.
+     */
+    private static final Set<Integer> ERROR_STATES =
+            Collections.unmodifiableSet(new HashSet<>(Arrays.asList(AUDIO_STATE_SOURCE_SILENCED,
+                    AUDIO_STATE_ENCODER_ERROR)));
+
+    /**
+     * Indicates whether the recording is being recorded with audio.
+     */
+    public boolean hasAudio() {
+        return getAudioState() == AUDIO_STATE_ACTIVE;
+    }
+
+    /**
+     * Indicates whether an error occurred.
+     *
+     * <p>Returns {@code true} if the audio is muted due to unexpected error like audio source is
+     * occupied or audio encoder encountered errors, otherwise {@code false}.
+     */
+    public boolean hasError() {
+        return ERROR_STATES.contains(getAudioState());
+    }
+
+    /**
+     * Returns the state of audio in the recording.
+     *
+     * <p>The audio state describes whether audio is enabled for the recording and if audio is
+     * currently recording or is silenced due to system priority or errors.
+     *
+     * @return The state of the audio at the time of these audio stats being generated. One of
+     * {@link #AUDIO_STATE_ACTIVE}, {@link #AUDIO_STATE_DISABLED},
+     * {@link #AUDIO_STATE_SOURCE_SILENCED}, or {@link #AUDIO_STATE_ENCODER_ERROR}.
+     */
+    @AudioState
+    public abstract int getAudioState();
+
+    /**
+     * Gets the error cause.
+     *
+     * <p>Returns {@code null} if {@link #hasError()} returns {@code false}.
+     */
+    @Nullable
+    public abstract Throwable getErrorCause();
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
index 55f022f..8f9f71e 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
@@ -19,6 +19,8 @@
 import android.os.ParcelFileDescriptor;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.util.Preconditions;
 
 import com.google.auto.value.AutoValue;
 
@@ -31,49 +33,78 @@
  * <p>To use a {@link java.io.File} as an output destination instead of a file descriptor, use
  * {@link FileOutputOptions}.
  */
-@AutoValue
-public abstract class FileDescriptorOutputOptions extends OutputOptions {
+public final class FileDescriptorOutputOptions extends OutputOptions {
 
-    FileDescriptorOutputOptions() {
+    private final FileDescriptorOutputOptionsInternal mFileDescriptorOutputOptionsInternal;
+
+    FileDescriptorOutputOptions(
+            @NonNull FileDescriptorOutputOptionsInternal fileDescriptorOutputOptionsInternal) {
         super(OPTIONS_TYPE_FILE_DESCRIPTOR);
+        Preconditions.checkNotNull(fileDescriptorOutputOptionsInternal,
+                "FileDescriptorOutputOptionsInternal can't be null.");
+        mFileDescriptorOutputOptionsInternal = fileDescriptorOutputOptionsInternal;
     }
 
-    /** Returns a builder for this FileDescriptorOutputOptions. */
+    /**
+     * Gets the file descriptor instance.
+     *
+     * @return the file descriptor used as the output destination.
+     */
     @NonNull
-    public static Builder builder() {
-        return new AutoValue_FileDescriptorOutputOptions.Builder()
-                .setFileSizeLimit(FILE_SIZE_UNLIMITED);
+    public ParcelFileDescriptor getParcelFileDescriptor() {
+        return mFileDescriptorOutputOptionsInternal.getParcelFileDescriptor();
     }
 
     /**
      * Gets the limit for the file length in bytes.
      */
     @Override
-    public abstract long getFileSizeLimit();
+    public long getFileSizeLimit() {
+        return mFileDescriptorOutputOptionsInternal.getFileSizeLimit();
+    }
 
-    /**
-     * Gets the file descriptor instance.
-     * @return the file descriptor used as the output destination.
-     */
+    @Override
     @NonNull
-    public abstract ParcelFileDescriptor getParcelFileDescriptor();
+    public String toString() {
+        // Don't use Class.getSimpleName(), class name will be changed by proguard obfuscation.
+        return mFileDescriptorOutputOptionsInternal.toString().replaceFirst(
+                "FileDescriptorOutputOptionsInternal", "FileDescriptorOutputOptions");
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof FileDescriptorOutputOptions)) {
+            return false;
+        }
+        return mFileDescriptorOutputOptionsInternal.equals(
+                ((FileDescriptorOutputOptions) o).mFileDescriptorOutputOptionsInternal);
+    }
+
+    @Override
+    public int hashCode() {
+        return mFileDescriptorOutputOptionsInternal.hashCode();
+    }
 
     /** The builder of the {@link FileDescriptorOutputOptions}. */
-    @AutoValue.Builder
-    @SuppressWarnings("StaticFinalBuilder")
-    public abstract static class Builder implements
+    public static final class Builder implements
             OutputOptions.Builder<FileDescriptorOutputOptions, Builder> {
-        Builder() {
-        }
+        private final FileDescriptorOutputOptionsInternal.Builder mInternalBuilder =
+                new AutoValue_FileDescriptorOutputOptions_FileDescriptorOutputOptionsInternal
+                        .Builder()
+                        .setFileSizeLimit(FILE_SIZE_UNLIMITED);
 
         /**
-         * Defines the file descriptor used to store the result.
+         * Creates a builder of the {@link FileDescriptorOutputOptions} with a file descriptor.
          *
          * @param fileDescriptor the file descriptor to use as the output destination.
          */
-        @NonNull
-        public abstract Builder setParcelFileDescriptor(
-                @NonNull ParcelFileDescriptor fileDescriptor);
+        public Builder(@NonNull ParcelFileDescriptor fileDescriptor) {
+            Preconditions.checkNotNull(fileDescriptor, "File descriptor can't be null.");
+            mInternalBuilder.setParcelFileDescriptor(fileDescriptor);
+        }
 
         /**
          * Sets the limit for the file length in bytes. Zero or negative values are considered
@@ -89,11 +120,34 @@
          */
         @Override
         @NonNull
-        public abstract Builder setFileSizeLimit(long bytes);
+        public Builder setFileSizeLimit(long fileSizeLimitBytes) {
+            mInternalBuilder.setFileSizeLimit(fileSizeLimitBytes);
+            return this;
+        }
 
         /** Builds the {@link FileDescriptorOutputOptions} instance. */
         @Override
         @NonNull
-        public abstract FileDescriptorOutputOptions build();
+        public FileDescriptorOutputOptions build() {
+            return new FileDescriptorOutputOptions(mInternalBuilder.build());
+        }
+    }
+
+    @AutoValue
+    abstract static class FileDescriptorOutputOptionsInternal {
+        @NonNull
+        abstract ParcelFileDescriptor getParcelFileDescriptor();
+        abstract long getFileSizeLimit();
+
+        @AutoValue.Builder
+        abstract static class Builder {
+            @NonNull
+            abstract Builder setParcelFileDescriptor(
+                    @NonNull ParcelFileDescriptor parcelFileDescriptor);
+            @NonNull
+            abstract Builder setFileSizeLimit(long fileSizeLimitBytes);
+            @NonNull
+            abstract FileDescriptorOutputOptionsInternal build();
+        }
     }
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
index 0268b38..12285c5 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
@@ -17,6 +17,8 @@
 package androidx.camera.video;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.util.Preconditions;
 
 import com.google.auto.value.AutoValue;
 
@@ -30,42 +32,75 @@
  * <p>To use a {@link android.os.ParcelFileDescriptor} as an output desination instead of a
  * {@link File}, use {@link FileDescriptorOutputOptions}.
  */
-@AutoValue
-public abstract class FileOutputOptions extends OutputOptions {
+public final class FileOutputOptions extends OutputOptions {
 
-    FileOutputOptions() {
+    private final FileOutputOptionsInternal mFileOutputOptionsInternal;
+
+    FileOutputOptions(@NonNull FileOutputOptionsInternal fileOutputOptionsInternal) {
         super(OPTIONS_TYPE_FILE);
+        Preconditions.checkNotNull(fileOutputOptionsInternal,
+                "FileOutputOptionsInternal can't be null.");
+        mFileOutputOptionsInternal = fileOutputOptionsInternal;
     }
 
-    /** Returns a builder for this FileOutputOptions. */
+    /** Gets the File instance */
     @NonNull
-    public static Builder builder() {
-        return new AutoValue_FileOutputOptions.Builder()
-                .setFileSizeLimit(FILE_SIZE_UNLIMITED);
+    public File getFile() {
+        return mFileOutputOptionsInternal.getFile();
     }
 
     /**
      * Gets the limit for the file length in bytes.
      */
     @Override
-    public abstract long getFileSizeLimit();
+    public long getFileSizeLimit() {
+        return mFileOutputOptionsInternal.getFileSizeLimit();
+    }
 
-    /** Gets the File instance */
+    @Override
     @NonNull
-    public abstract File getFile();
+    public String toString() {
+        // Don't use Class.getSimpleName(), class name will be changed by proguard obfuscation.
+        return mFileOutputOptionsInternal.toString().replaceFirst("FileOutputOptionsInternal",
+                "FileOutputOptions");
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof FileOutputOptions)) {
+            return false;
+        }
+        return mFileOutputOptionsInternal.equals(
+                ((FileOutputOptions) o).mFileOutputOptionsInternal);
+    }
+
+    @Override
+    public int hashCode() {
+        return mFileOutputOptionsInternal.hashCode();
+    }
 
     /** The builder of the {@link FileOutputOptions}. */
-    @AutoValue.Builder
-    @SuppressWarnings("StaticFinalBuilder")
-    public abstract static class Builder implements
-            OutputOptions.Builder<FileOutputOptions, Builder> {
-        Builder() {
-        }
+    public static final class Builder implements OutputOptions.Builder<FileOutputOptions, Builder> {
+        private final FileOutputOptionsInternal.Builder mInternalBuilder =
+                new AutoValue_FileOutputOptions_FileOutputOptionsInternal.Builder()
+                        .setFileSizeLimit(OutputOptions.FILE_SIZE_UNLIMITED);
 
-        /** Defines the file used to store the result. */
-        @SuppressWarnings("StreamFiles") // FileDescriptor API is in FileDescriptorOutputOptions
-        @NonNull
-        public abstract Builder setFile(@NonNull File file);
+        /**
+         * Creates a builder of the {@link FileOutputOptions} with a file object.
+         *
+         * <p>The file object can be created with a path using the {@link File} APIs. The path
+         * must be seekable and writable.
+         *
+         * @param file the file object.
+         * @see File
+         */
+        public Builder(@NonNull File file) {
+            Preconditions.checkNotNull(file, "File can't be null.");
+            mInternalBuilder.setFile(file);
+        }
 
         /**
          * Sets the limit for the file length in bytes. Zero or negative values are considered
@@ -81,11 +116,36 @@
          */
         @Override
         @NonNull
-        public abstract Builder setFileSizeLimit(long bytes);
+        public Builder setFileSizeLimit(long fileSizeLimitBytes) {
+            mInternalBuilder.setFileSizeLimit(fileSizeLimitBytes);
+            return this;
+        }
 
         /** Builds the {@link FileOutputOptions} instance. */
         @Override
         @NonNull
-        public abstract FileOutputOptions build();
+        public FileOutputOptions build() {
+            return new FileOutputOptions(mInternalBuilder.build());
+        }
+    }
+
+    @AutoValue
+    abstract static class FileOutputOptionsInternal {
+        @NonNull
+        abstract File getFile();
+
+        abstract long getFileSizeLimit();
+
+        @AutoValue.Builder
+        abstract static class Builder {
+            @NonNull
+            abstract Builder setFile(@NonNull File file);
+
+            @NonNull
+            abstract Builder setFileSizeLimit(long fileSizeLimitBytes);
+
+            @NonNull
+            abstract FileOutputOptionsInternal build();
+        }
     }
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java b/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java
index 66a78ee..f0ecd53 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java
@@ -18,6 +18,7 @@
 
 import android.annotation.SuppressLint;
 import android.media.MediaFormat;
+import android.media.MediaMuxer;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
@@ -40,7 +41,7 @@
 public abstract class MediaSpec {
 
     private static final String AUDIO_FORMAT_MPEG4 = MediaFormat.MIMETYPE_AUDIO_AAC;
-    private static final String AUDIO_FORMAT_WEBM = "audio/webm";
+    private static final String AUDIO_FORMAT_WEBM = MediaFormat.MIMETYPE_AUDIO_VORBIS;
     private static final String VIDEO_FORMAT_MPEG4 = MediaFormat.MIMETYPE_VIDEO_AVC;
     private static final String VIDEO_FORMAT_WEBM = MediaFormat.MIMETYPE_VIDEO_VP8;
 
@@ -65,6 +66,8 @@
                 return AUDIO_FORMAT_WEBM;
             case MediaSpec.OUTPUT_FORMAT_MPEG_4:
                 // Fall-through
+            case MediaSpec.OUTPUT_FORMAT_AUTO:
+                // Fall-through
             default:
                 return AUDIO_FORMAT_MPEG4;
         }
@@ -77,11 +80,26 @@
                 return VIDEO_FORMAT_WEBM;
             case MediaSpec.OUTPUT_FORMAT_MPEG_4:
                 // Fall-through
+            case MediaSpec.OUTPUT_FORMAT_AUTO:
+                // Fall-through
             default:
                 return VIDEO_FORMAT_MPEG4;
         }
     }
 
+    static int outputFormatToMuxerFormat(@OutputFormat int outputFormat) {
+        switch (outputFormat) {
+            case MediaSpec.OUTPUT_FORMAT_WEBM:
+                return MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM;
+            case MediaSpec.OUTPUT_FORMAT_MPEG_4:
+                // Fall-through
+            case MediaSpec.OUTPUT_FORMAT_AUTO:
+                // Fall-through
+            default:
+                return MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4;
+        }
+    }
+
     // Doesn't allow inheritance outside of package
     MediaSpec() {
     }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
index 1248749..c90ff98 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
@@ -21,6 +21,8 @@
 import android.net.Uri;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.util.Preconditions;
 
 import com.google.auto.value.AutoValue;
 
@@ -46,65 +48,113 @@
  *
  * }</pre>
  */
-@AutoValue
-public abstract class MediaStoreOutputOptions extends OutputOptions {
+public final class MediaStoreOutputOptions extends OutputOptions {
 
-    MediaStoreOutputOptions() {
+    /**
+     * An empty {@link ContentValues}.
+     */
+    public static final ContentValues EMPTY_CONTENT_VALUES = new ContentValues();
+
+    private final MediaStoreOutputOptionsInternal mMediaStoreOutputOptionsInternal;
+
+    MediaStoreOutputOptions(
+            @NonNull MediaStoreOutputOptionsInternal mediaStoreOutputOptionsInternal) {
         super(OPTIONS_TYPE_MEDIA_STORE);
+        Preconditions.checkNotNull(mediaStoreOutputOptionsInternal,
+                "MediaStoreOutputOptionsInternal can't be null.");
+        mMediaStoreOutputOptionsInternal = mediaStoreOutputOptionsInternal;
     }
 
     /**
-     * Returns a builder for this MediaStoreOutputOptions.
+     * Gets the ContentResolver instance in order to convert URI to a file path.
      */
     @NonNull
-    public static Builder builder() {
-        return new AutoValue_MediaStoreOutputOptions.Builder()
-                .setFileSizeLimit(FILE_SIZE_UNLIMITED);
+    public ContentResolver getContentResolver() {
+        return mMediaStoreOutputOptionsInternal.getContentResolver();
     }
 
     /**
-     * Gets the ContentResolver instance in order to convert Uri to a file path.
-     */
-    @NonNull
-    public abstract ContentResolver getContentResolver();
-
-    /**
      * Gets the URL of the table to insert into.
      */
     @NonNull
-    public abstract Uri getCollection();
+    public Uri getCollection() {
+        return mMediaStoreOutputOptionsInternal.getCollection();
+    }
 
     /**
      * Gets the content values to be included in the created file.
      */
     @NonNull
-    public abstract ContentValues getContentValues();
+    public ContentValues getContentValues() {
+        return mMediaStoreOutputOptionsInternal.getContentValues();
+    }
 
     /**
      * Gets the limit for the file length in bytes.
      */
     @Override
-    public abstract long getFileSizeLimit();
+    public long getFileSizeLimit() {
+        return mMediaStoreOutputOptionsInternal.getFileSizeLimit();
+    }
+
+    @Override
+    @NonNull
+    public String toString() {
+        // Don't use Class.getSimpleName(), class name will be changed by proguard obfuscation.
+        return mMediaStoreOutputOptionsInternal.toString().replaceFirst(
+                "MediaStoreOutputOptionsInternal", "MediaStoreOutputOptions");
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof MediaStoreOutputOptions)) {
+            return false;
+        }
+        return mMediaStoreOutputOptionsInternal.equals(
+                ((MediaStoreOutputOptions) o).mMediaStoreOutputOptionsInternal);
+    }
+
+    @Override
+    public int hashCode() {
+        return mMediaStoreOutputOptionsInternal.hashCode();
+    }
 
     /** The builder of the {@link MediaStoreOutputOptions}. */
-    @AutoValue.Builder
-    @SuppressWarnings("StaticFinalBuilder")
-    public abstract static class Builder implements
+    public static final class Builder implements
             OutputOptions.Builder<MediaStoreOutputOptions, Builder> {
-        Builder() {
+        private final MediaStoreOutputOptionsInternal.Builder mInternalBuilder =
+                new AutoValue_MediaStoreOutputOptions_MediaStoreOutputOptionsInternal.Builder()
+                        .setContentValues(EMPTY_CONTENT_VALUES)
+                        .setFileSizeLimit(FILE_SIZE_UNLIMITED);
+
+        /**
+         * Creates a builder of the {@link MediaStoreOutputOptions} with media store options.
+         *
+         * @param contentResolver the content resolver instance.
+         * @param collectionUri the URI of the table to insert into.
+         */
+        public Builder(@NonNull ContentResolver contentResolver, @NonNull Uri collectionUri) {
+            Preconditions.checkNotNull(contentResolver, "Content resolver can't be null.");
+            Preconditions.checkNotNull(collectionUri, "Collection Uri can't be null.");
+            mInternalBuilder.setContentResolver(contentResolver).setCollection(collectionUri);
         }
 
-        /** Sets the ContentResolver instance. */
+        /**
+         * Sets the content values to be included in the created file.
+         *
+         * <p>If not set, defaults to {@link #EMPTY_CONTENT_VALUES}.
+         *
+         * @param contentValues the content values to be inserted.
+         */
         @NonNull
-        public abstract Builder setContentResolver(@NonNull ContentResolver contentResolver);
-
-        /** Sets the URL of the table to insert into. */
-        @NonNull
-        public abstract Builder setCollection(@NonNull Uri collectionUri);
-
-        /** Sets the content values to be included in the created file. */
-        @NonNull
-        public abstract Builder setContentValues(@NonNull ContentValues contentValues);
+        public Builder setContentValues(@NonNull ContentValues contentValues) {
+            Preconditions.checkNotNull(contentValues, "Content values can't be null.");
+            mInternalBuilder.setContentValues(contentValues);
+            return this;
+        }
 
         /**
          * Sets the limit for the file length in bytes. Zero or negative values are considered
@@ -120,11 +170,41 @@
          */
         @Override
         @NonNull
-        public abstract Builder setFileSizeLimit(long bytes);
+        public Builder setFileSizeLimit(long fileSizeLimitBytes) {
+            mInternalBuilder.setFileSizeLimit(fileSizeLimitBytes);
+            return this;
+        }
 
         /** Builds the {@link MediaStoreOutputOptions} instance. */
         @Override
         @NonNull
-        public abstract MediaStoreOutputOptions build();
+        public MediaStoreOutputOptions build() {
+            return new MediaStoreOutputOptions(mInternalBuilder.build());
+        }
+    }
+
+    @AutoValue
+    abstract static class MediaStoreOutputOptionsInternal {
+        @NonNull
+        abstract ContentResolver getContentResolver();
+        @NonNull
+        abstract Uri getCollection();
+        @NonNull
+        abstract ContentValues getContentValues();
+        abstract long getFileSizeLimit();
+
+        @AutoValue.Builder
+        abstract static class Builder {
+            @NonNull
+            abstract Builder setContentResolver(@NonNull ContentResolver contentResolver);
+            @NonNull
+            abstract Builder setCollection(@NonNull Uri collectionUri);
+            @NonNull
+            abstract Builder setContentValues(@NonNull ContentValues contentValues);
+            @NonNull
+            abstract Builder setFileSizeLimit(long fileSizeLimitBytes);
+            @NonNull
+            abstract MediaStoreOutputOptionsInternal build();
+        }
     }
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java b/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
index 074e3a5..a9b278b 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
@@ -38,8 +38,8 @@
     /**
      * Gets the {@link Uri} of the output.
      *
-     * <p>Returns the actual {@link Uri} of the output destination if the
-     * {@link OutputOptions} is implemented by {@link MediaStoreOutputOptions}, otherwise
+     * <p>Returns the actual {@link Uri} of the output destination if the {@link OutputOptions}
+     * is implemented by {@link MediaStoreOutputOptions} or {@link FileOutputOptions}, otherwise
      * returns {@link Uri#EMPTY}.
      */
     @NonNull
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java b/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java
index 9ac9a24..275b737 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java
@@ -18,6 +18,7 @@
 
 import android.Manifest;
 
+import androidx.annotation.CheckResult;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresPermission;
@@ -138,11 +139,16 @@
      * found in that event's {@link VideoRecordEvent.Finalize#getError()} method. The returned
      * {@link ActiveRecording} will be in a finalized state, and all controls will be no-ops.
      *
+     * <p>If the returned {@link ActiveRecording} is garbage collected, the recording will be
+     * automatically stopped. A reference to the active recording must be maintained as long as
+     * the recording needs to be active.
+     *
      * @throws IllegalStateException if the associated Recorder currently has an unfinished
      * active recording, or if the recording has {@link #withAudioEnabled()} audio} but
      * {@link android.Manifest.permission#RECORD_AUDIO} is not granted.
      */
     @NonNull
+    @CheckResult
     public ActiveRecording start() {
         return mRecorder.start(this);
     }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
index 6bcb207..58a3ab4 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
@@ -40,7 +40,6 @@
 import android.os.ParcelFileDescriptor;
 import android.provider.MediaStore;
 import android.util.Size;
-import android.util.SparseArray;
 import android.view.Surface;
 
 import androidx.annotation.GuardedBy;
@@ -80,17 +79,21 @@
 import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
+import com.google.auto.value.AutoValue;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * An implementation of {@link VideoOutput} for starting video recordings that are saved
@@ -124,6 +127,7 @@
  *
  * <p>A recorder can also capture and save audio alongside video. The audio must be explicitly
  * enabled with {@link PendingRecording#withAudioEnabled()} before starting the recording.
+ *
  * @see VideoCapture#withOutput(VideoOutput)
  * @see PendingRecording
  */
@@ -184,7 +188,7 @@
         /**
          * The recording is being recorded with audio.
          */
-        RECORDING,
+        ACTIVE,
         /**
          * The recording is muted because the audio source is silenced.
          */
@@ -196,6 +200,26 @@
     }
 
     /**
+     * The subset of states considered pending states.
+     */
+    private static final Set<State> PENDING_STATES =
+            Collections.unmodifiableSet(EnumSet.of(State.PENDING_RECORDING, State.PENDING_PAUSED));
+
+    /**
+     * The subset of states which are valid non-pending states while in a pending state.
+     *
+     * <p>All other states should not be possible if in a PENDING_* state. Pending states are
+     * meant to be transient states that occur while waiting for another operation to finish.
+     */
+    private static final Set<State> VALID_NON_PENDING_STATES_WHILE_PENDING =
+            Collections.unmodifiableSet(EnumSet.of(
+                    State.INITIALIZING, // Waiting for camera before starting recording.
+                    State.IDLING, // Waiting for sequential executor to start pending recording.
+                    State.RESETTING, // Waiting for camera/encoders to reset before starting.
+                    State.STOPPING // Waiting for previous recording to finalize before starting.
+            ));
+
+    /**
      * Default quality selector for recordings.
      *
      * <p>The default quality selector chooses a video quality suitable for recordings based on
@@ -241,10 +265,12 @@
     private static final int VIDEO_INTRA_FRAME_INTERVAL_DEFAULT = 1;
     @SuppressWarnings("deprecation")
     private static final String MEDIA_COLUMN = MediaStore.Video.Media.DATA;
+    private static final Exception PENDING_RECORDING_ERROR_CAUSE_SOURCE_INACTIVE =
+            new RuntimeException("The video frame producer became inactive before any "
+                    + "data was received.");
+    private static final int PENDING = 1;
+    private static final int NOT_PENDING = 0;
 
-    private final Object mLock = new Object();
-    @GuardedBy("mLock")
-    private State mState = State.INITIALIZING;
     private final MutableStateObservable<StreamState> mStreamState =
             MutableStateObservable.withInitialState(StreamState.INACTIVE);
     // Used only by getExecutor()
@@ -252,29 +278,55 @@
     // May be equivalent to mUserProvidedExecutor or an internal executor if the user did not
     // provide an executor.
     private final Executor mExecutor;
-    private final AtomicBoolean mSurfaceRequested = new AtomicBoolean(false);
-    private final AtomicBoolean mAudioInitialized = new AtomicBoolean(false);
-    private final AtomicReference<SourceState> mSourceState = new AtomicReference<>(
-            SourceState.ACTIVE);
-    private SurfaceRequest.TransformationInfo mSurfaceTransformationInfo = null;
-    private Throwable mErrorCause;
-
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    final SparseArray<CallbackToFutureAdapter.Completer<Void>> mEncodingCompleters =
-            new SparseArray<>();
+    final Executor mSequentialExecutor;
+    private final Object mLock = new Object();
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    //                          Members only accessed when holding mLock                          //
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    @GuardedBy("mLock")
+    private State mState = State.INITIALIZING;
+    // Tracks the underlying state when in a PENDING_* state. When not in a PENDING_* state, this
+    // should be null.
+    @GuardedBy("mLock")
+    private State mNonPendingState = null;
+    @GuardedBy("mLock")
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    RecordingRecord mActiveRecordingRecord = null;
+    // A recording that will be started once the previous recording has finalized or the
+    // recorder has finished initializing.
+    @GuardedBy("mLock")
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    RecordingRecord mPendingRecordingRecord = null;
+    @GuardedBy("mLock")
+    private SourceState mSourceState = SourceState.ACTIVE;
+    @GuardedBy("mLock")
+    private Throwable mErrorCause;
+    @GuardedBy("mLock")
+    private boolean mSurfaceRequested = false;
+    @GuardedBy("mLock")
+    private long mLastGeneratedRecordingId = 0L;
+    //--------------------------------------------------------------------------------------------//
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    //                      Members only accessed on mSequentialExecutor                          //
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    private RecordingRecord mInProgressRecording = null;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    boolean mInProgressRecordingStopping = false;
+    private boolean mAudioInitialized = false;
+    private SurfaceRequest.TransformationInfo mSurfaceTransformationInfo = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     final List<ListenableFuture<Void>> mEncodingFutures = new ArrayList<>();
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    ActiveRecording mRunningRecording = null;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     Integer mAudioTrackIndex = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     Integer mVideoTrackIndex = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     Surface mSurface = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    final Executor mSequentialExecutor;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     MediaMuxer mMediaMuxer = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     final MutableStateObservable<MediaSpec> mMediaSpec;
@@ -283,11 +335,15 @@
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     EncoderImpl mVideoEncoder = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    OutputConfig mVideoOutputConfig = null;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     EncoderImpl mAudioEncoder = null;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    OutputConfig mAudioOutputConfig = null;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     AudioState mAudioState = AudioState.INITIALIZING;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    Uri mOutputUri = Uri.EMPTY;
+    @NonNull Uri mOutputUri = Uri.EMPTY;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     long mRecordingBytes = 0L;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -301,6 +357,13 @@
     int mRecordingStopError = ERROR_UNKNOWN;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     AudioState mCachedAudioState;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    EncodedData mPendingFirstVideoData = null;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    EncodedData mPendingFirstAudioData = null;
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    Throwable mAudioErrorCause = null;
+    //--------------------------------------------------------------------------------------------//
 
     Recorder(@Nullable Executor executor, @NonNull MediaSpec mediaSpec) {
         mUserProvidedExecutor = executor;
@@ -322,7 +385,9 @@
                     // Fall-through
                 case INITIALIZING:
                     // The recorder should be initialized only once until it is released.
-                    if (mSurfaceRequested.compareAndSet(false, true)) {
+                    // TODO (b/198551531): Make this code more robust to multiple SurfaceRequests.
+                    if (!mSurfaceRequested) {
+                        mSurfaceRequested = true;
                         mSequentialExecutor.execute(() -> initializeInternal(request));
                     }
                     break;
@@ -361,38 +426,53 @@
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     @Override
-    public void onSourceStateChanged(@NonNull SourceState sourceState) {
-        mSourceState.set(sourceState);
-        if (sourceState == SourceState.INACTIVE) {
-            synchronized (mLock) {
+    public void onSourceStateChanged(@NonNull SourceState newState) {
+        RecordingRecord pendingRecordingToFinalize = null;
+        synchronized (mLock) {
+            SourceState oldState = mSourceState;
+            mSourceState = newState;
+            if (oldState == SourceState.ACTIVE && newState == SourceState.INACTIVE) {
+                Logger.d(TAG, "Video source has transitioned to an INACTIVE state.");
                 switch (mState) {
                     case PENDING_RECORDING:
                         // Fall-through
                     case PENDING_PAUSED:
-                        mSequentialExecutor.execute(
-                                () -> finalizeRecording(ERROR_SOURCE_INACTIVE,
-                                        new IllegalStateException(
-                                                "The video frame producer is inactive.")));
+                        // Immediately finalize pending recording since it never started.
+                        pendingRecordingToFinalize = mPendingRecordingRecord;
+                        mPendingRecordingRecord = null;
+                        restoreNonPendingState(); // Equivalent to setState(mNonPendingState)
                         break;
-                    case RECORDING:
-                        // Fall-through
                     case PAUSED:
-                        mSequentialExecutor.execute(() -> stopInternal(ERROR_SOURCE_INACTIVE));
+                        // Fall-through
+                    case RECORDING:
+                        setState(State.STOPPING);
+                        RecordingRecord finalActiveRecordingRecord = mActiveRecordingRecord;
+                        mSequentialExecutor.execute(() -> stopInternal(finalActiveRecordingRecord,
+                                ERROR_SOURCE_INACTIVE));
                         break;
-                    case IDLING:
-                        // Fall-through
-                    case INITIALIZING:
-                        // Fall-through
-                    case RESETTING:
-                        // Fall-through
                     case STOPPING:
                         // Fall-through
+                    case RESETTING:
+                        // We are already stopping or resetting, nothing needs to be done.
+                        break;
+                    case INITIALIZING:
+                        // Fall-through
+                    case IDLING:
+                        break;
                     case ERROR:
-                        // No-op
+                        // In an error state, the recording will already be finalized. Nothing
+                        // needs to be done.
                         break;
                 }
+            } else if (oldState == SourceState.INACTIVE && newState == SourceState.ACTIVE) {
+                Logger.d(TAG, "Video source has transitioned to an ACTIVE state.");
             }
         }
+
+        if (pendingRecordingToFinalize != null) {
+            finalizePendingRecording(pendingRecordingToFinalize, ERROR_SOURCE_INACTIVE,
+                    PENDING_RECORDING_ERROR_CAUSE_SOURCE_INACTIVE);
+        }
     }
 
     /**
@@ -530,210 +610,306 @@
      * {@link VideoCapture} this Recorder is associated with is detached from the camera.
      *
      * @throws IllegalStateException if there's an active recording, or the audio is
-     * {@link PendingRecording#withAudioEnabled() enabled} for the recording but
-     * {@link android.Manifest.permission#RECORD_AUDIO} is not granted.
+     *                               {@link PendingRecording#withAudioEnabled() enabled} for the
+     *                               recording but
+     *                               {@link android.Manifest.permission#RECORD_AUDIO} is not
+     *                               granted.
      */
-    @SuppressLint("MissingPermission")
     @NonNull
     ActiveRecording start(@NonNull PendingRecording pendingRecording) {
         Preconditions.checkNotNull(pendingRecording, "The given PendingRecording cannot be null.");
-        ActiveRecording activeRecording = ActiveRecording.from(pendingRecording);
-        if (mSourceState.get() == SourceState.INACTIVE) {
-            // Immediately finalize the recording if the source is inactive.
-            activeRecording.updateVideoRecordEvent(VideoRecordEvent.finalizeWithError(
-                    activeRecording.getOutputOptions(),
-                    getCurrentRecordingStats(),
-                    OutputResults.of(Uri.EMPTY),
-                    ERROR_SOURCE_INACTIVE,
-                    new IllegalStateException("The video frame producer is inactive.")));
-        } else {
-            synchronized (mLock) {
+        RecordingRecord alreadyInProgressRecording = null;
+        @VideoRecordError int error = ERROR_NONE;
+        Throwable errorCause = null;
+        long recordingId;
+        synchronized (mLock) {
+            recordingId = ++mLastGeneratedRecordingId;
+            if (mSourceState == SourceState.INACTIVE) {
+                error = ERROR_SOURCE_INACTIVE;
+                errorCause = PENDING_RECORDING_ERROR_CAUSE_SOURCE_INACTIVE;
+            } else {
                 switch (mState) {
-                    case STOPPING:
-                        // Fall-through
-                    case PENDING_PAUSED:
-                        // Fall-through
                     case PAUSED:
                         // Fall-through
-                    case PENDING_RECORDING:
-                        // Fall-through
                     case RECORDING:
-                        throw new IllegalStateException("There's an active recording.");
+                        alreadyInProgressRecording = mActiveRecordingRecord;
+                        break;
+                    case PENDING_PAUSED:
+                        // Fall-through
+                    case PENDING_RECORDING:
+                        // There is already a recording pending that hasn't been stopped.
+                        alreadyInProgressRecording =
+                                Preconditions.checkNotNull(mPendingRecordingRecord);
+                        break;
                     case RESETTING:
                         // Fall-through
+                    case STOPPING:
+                        // Fall-through
                     case INITIALIZING:
-                        setupAudioIfNeeded(activeRecording);
-                        mRunningRecording = activeRecording;
+                        mPendingRecordingRecord = RecordingRecord.from(pendingRecording,
+                                recordingId);
                         // The recording will automatically start once the initialization completes.
                         setState(State.PENDING_RECORDING);
                         break;
                     case IDLING:
-                        setupAudioIfNeeded(activeRecording);
-                        mRunningRecording = activeRecording;
-                        mSequentialExecutor.execute(this::startInternal);
-                        setState(State.RECORDING);
+                        Preconditions.checkState(
+                                mActiveRecordingRecord == null && mPendingRecordingRecord == null,
+                                "Expected recorder to be idle but a recording is either pending or "
+                                        + "in progress.");
+                        mPendingRecordingRecord = RecordingRecord.from(pendingRecording,
+                                recordingId);
+                        setState(State.PENDING_RECORDING);
+                        mSequentialExecutor.execute(this::tryServicePendingRecording);
                         break;
                     case ERROR:
-                        Logger.e(TAG,
-                                "Recording was started when the Recorder had encountered error "
-                                        + mErrorCause);
-                        // Immediately finalize the recording if the Recorder encountered error.
-                        activeRecording.updateVideoRecordEvent(VideoRecordEvent.finalizeWithError(
-                                activeRecording.getOutputOptions(),
-                                getCurrentRecordingStats(),
-                                OutputResults.of(Uri.EMPTY),
-                                ERROR_RECORDER_ERROR,
-                                mErrorCause));
+                        error = ERROR_RECORDER_ERROR;
+                        errorCause = mErrorCause;
                         break;
                 }
             }
         }
-        return activeRecording;
+
+        if (alreadyInProgressRecording != null) {
+            throw new IllegalStateException("A recording is already in progress. Previous "
+                    + "recordings must be stopped before a new recording can be started.");
+        } else if (error != ERROR_NONE) {
+            Logger.e(TAG,
+                    "Recording was started when the Recorder had encountered error " + errorCause);
+            // Immediately update the listener if the Recorder encountered an error.
+            finalizePendingRecording(RecordingRecord.from(pendingRecording, recordingId),
+                    error, errorCause);
+            return ActiveRecording.createFinalizedFrom(pendingRecording, recordingId);
+        }
+
+        return ActiveRecording.from(pendingRecording, recordingId);
     }
 
-    void pause() {
+    void pause(@NonNull ActiveRecording activeRecording) {
         synchronized (mLock) {
+            if (!isSameRecording(activeRecording, mPendingRecordingRecord) && !isSameRecording(
+                    activeRecording, mActiveRecordingRecord)) {
+                // If this ActiveRecording is no longer active, log and treat as a no-op.
+                // This is not technically an error since the recording can be finalized
+                // asynchronously.
+                Logger.d(TAG,
+                        "pause() called on a recording that is no longer active: "
+                                + activeRecording.getOutputOptions());
+                return;
+            }
+
             switch (mState) {
                 case PENDING_RECORDING:
-                    // Fall-through
-                case RESETTING:
-                    // Fall-through
-                case INITIALIZING:
                     // The recording will automatically pause once the initialization completes.
                     setState(State.PENDING_PAUSED);
                     break;
-                case STOPPING:
+                case INITIALIZING:
                     // Fall-through
                 case IDLING:
-                    throw new IllegalStateException(
-                            "Incorrectly invoke pause() in state " + mState);
+                    throw new IllegalStateException("Called pause() from invalid state: " + mState);
                 case RECORDING:
-                    mSequentialExecutor.execute(this::pauseInternal);
                     setState(State.PAUSED);
+                    RecordingRecord finalActiveRecordingRecord = mActiveRecordingRecord;
+                    mSequentialExecutor.execute(() -> pauseInternal(finalActiveRecordingRecord));
                     break;
                 case PENDING_PAUSED:
                     // Fall-through
                 case PAUSED:
                     // No-op when the recording is already paused.
                     break;
+                case RESETTING:
+                    // Fall-through
+                case STOPPING:
+                    // If recorder is resetting or stopping, then pause is a no-op.
+                    break;
                 case ERROR:
-                    Logger.e(TAG, "Recording was paused when the Recorder had encountered error "
-                            + mErrorCause);
-                    mSequentialExecutor.execute(
-                            () -> finalizeRecording(ERROR_RECORDER_ERROR, mErrorCause));
+                    // In an error state, the recording will already be finalized. Treat as a
+                    // no-op in pause()
                     break;
             }
         }
     }
 
-    void resume() {
+    void resume(@NonNull ActiveRecording activeRecording) {
         synchronized (mLock) {
+            if (!isSameRecording(activeRecording, mPendingRecordingRecord) && !isSameRecording(
+                    activeRecording, mActiveRecordingRecord)) {
+                // If this ActiveRecording is no longer active, log and treat as a no-op.
+                // This is not technically an error since the recording can be finalized
+                // asynchronously.
+                Logger.d(TAG,
+                        "resume() called on a recording that is no longer active: "
+                                + activeRecording.getOutputOptions());
+                return;
+            }
             switch (mState) {
                 case PENDING_PAUSED:
-                    // Fall-through
-                case RESETTING:
-                    // Fall-through
-                case INITIALIZING:
                     // The recording will automatically start once the initialization completes.
                     setState(State.PENDING_RECORDING);
                     break;
-                case STOPPING:
+                case INITIALIZING:
+                    // Should not be able to resume when initializing. Should be in a PENDING state.
                     // Fall-through
                 case IDLING:
-                    throw new IllegalStateException(
-                            "Incorrectly invoke resume() in state " + mState);
+                    throw new IllegalStateException("Called resume() from invalid state: "
+                            + mState);
+                case RESETTING:
+                    // Fall-through
+                case STOPPING:
+                    // If recorder is stopping or resetting, then resume is a no-op.
+                    // Fall-through
                 case PENDING_RECORDING:
                     // Fall-through
                 case RECORDING:
                     // No-op when the recording is running.
                     break;
                 case PAUSED:
-                    mSequentialExecutor.execute(this::resumeInternal);
                     setState(State.RECORDING);
+                    RecordingRecord finalActiveRecordingRecord = mActiveRecordingRecord;
+                    mSequentialExecutor.execute(() -> resumeInternal(finalActiveRecordingRecord));
                     break;
                 case ERROR:
-                    Logger.e(TAG, "Recording was resumed when the Recorder had encountered error "
-                            + mErrorCause);
-                    mSequentialExecutor.execute(
-                            () -> finalizeRecording(ERROR_RECORDER_ERROR, mErrorCause));
+                    // In an error state, the recording will already be finalized. Treat as a
+                    // no-op in resume()
                     break;
             }
         }
     }
 
-    void stop() {
+    void stop(@NonNull ActiveRecording activeRecording) {
+        RecordingRecord pendingRecordingToFinalize = null;
         synchronized (mLock) {
+            if (!isSameRecording(activeRecording, mPendingRecordingRecord) && !isSameRecording(
+                    activeRecording, mActiveRecordingRecord)) {
+                // If this ActiveRecording is no longer active, log and treat as a no-op.
+                // This is not technically an error since the recording can be finalized
+                // asynchronously.
+                Logger.d(TAG,
+                        "stop() called on a recording that is no longer active: "
+                                + activeRecording.getOutputOptions());
+                return;
+            }
             switch (mState) {
                 case PENDING_RECORDING:
                     // Fall-through
                 case PENDING_PAUSED:
-                    mSequentialExecutor.execute(
-                            () -> finalizeRecording(ERROR_NO_VALID_DATA,
-                            new IllegalStateException("The Recorder hasn't been initialized.")));
+                    // Immediately finalize pending recording since it never started.
+                    Preconditions.checkState(isSameRecording(activeRecording,
+                            mPendingRecordingRecord));
+                    pendingRecordingToFinalize = mPendingRecordingRecord;
+                    mPendingRecordingRecord = null;
+                    restoreNonPendingState(); // Equivalent to setState(mNonPendingState)
+                    break;
+                case STOPPING:
+                    // Fall-through
+                case RESETTING:
+                    // We are already resetting, likely due to an error that stopped the recording.
+                    // Ensure this is the current active recording and treat as a no-op. The
+                    // active recording will be cleared once stop/reset is complete.
+                    Preconditions.checkState(isSameRecording(activeRecording,
+                            mActiveRecordingRecord));
                     break;
                 case INITIALIZING:
                     // Fall-through
                 case IDLING:
-                    throw new IllegalStateException("There's no active recording.");
+                    throw new IllegalStateException("Calling stop() while idling or "
+                            + "initializing is invalid.");
                 case PAUSED:
                     // Fall-through
                 case RECORDING:
                     setState(State.STOPPING);
-                    mSequentialExecutor.execute(() -> stopInternal(ERROR_NONE));
+                    RecordingRecord finalActiveRecordingRecord = mActiveRecordingRecord;
+                    mSequentialExecutor.execute(() -> stopInternal(finalActiveRecordingRecord,
+                            ERROR_NONE));
                     break;
                 case ERROR:
-                    Logger.e(TAG, "Recording was stopped when the Recorder had encountered error "
-                            + mErrorCause);
-                    mSequentialExecutor.execute(
-                            () -> finalizeRecording(ERROR_RECORDER_ERROR, mErrorCause));
-                    break;
-                case STOPPING:
-                    // Fall-through
-                case RESETTING:
-                    // No-Op
+                    // In an error state, the recording will already be finalized. Treat as a
+                    // no-op in stop()
                     break;
             }
         }
+
+        if (pendingRecordingToFinalize != null) {
+            finalizePendingRecording(pendingRecordingToFinalize, ERROR_NO_VALID_DATA,
+                    new RuntimeException("Recording was stopped before any data could be "
+                            + "produced."));
+        }
+    }
+
+    private void finalizePendingRecording(@NonNull RecordingRecord recordingToFinalize,
+            @VideoRecordError int error, @Nullable Throwable cause) {
+        recordingToFinalize.updateVideoRecordEvent(
+                VideoRecordEvent.finalizeWithError(
+                        recordingToFinalize.getOutputOptions(),
+                        RecordingStats.of(/*duration=*/0L,
+                                /*bytes=*/0L,
+                                AudioStats.of(AudioStats.AUDIO_STATE_DISABLED, mAudioErrorCause)),
+                        OutputResults.of(Uri.EMPTY),
+                        error,
+                        cause));
     }
 
     /**
-     * Releases the Recorder.
+     * Resets the state on the sequential executor for a new recording.
      *
-     * <p>By releasing the Recorder, it will stop the running recording if there's one. Once the
-     * Recorder is released, it cannot be used anymore. Any other method call after the encoder
-     * is released will get {@link IllegalStateException}.
+     * <p>If a recording is in progress, it will be stopped asynchronously and reset once it has
+     * been finalized.
+     *
+     * <p>If there is a recording in progress, reset() will stop the recording and rely on the
+     * recording's onRecordingFinalized() to actually release resources.
      */
     @ExecutedBy("mSequentialExecutor")
     void reset() {
+        boolean shouldReset = false;
+        boolean shouldStop = false;
         synchronized (mLock) {
             switch (mState) {
                 case PENDING_RECORDING:
                     // Fall-through
                 case PENDING_PAUSED:
                     // Fall-through
+                    mSurfaceRequested = false;
+                    shouldReset = true;
+                    updateNonPendingState(State.RESETTING);
+                    break;
                 case INITIALIZING:
                     // Fall-through
                 case ERROR:
                     // Fall-through
                 case IDLING:
-                    resetInternal();
+                    setState(State.INITIALIZING);
+                    mSurfaceRequested = false;
+                    shouldReset = true;
                     break;
                 case PAUSED:
                     // Fall-through
                 case RECORDING:
-                    setState(State.RESETTING);
+                    if (mActiveRecordingRecord != mInProgressRecording) {
+                        throw new AssertionError("In-progress recording does not match the active"
+                                + " recording. Unable to reset encoder.");
+                    }
                     // If there's an active recording, stop it first then release the resources
-                    // at finalizeRecording().
-                    mSequentialExecutor.execute(() -> stopInternal(ERROR_NONE));
+                    // at onRecordingFinalized().
+                    setState(State.RESETTING);
+                    shouldStop = true;
                     break;
                 case STOPPING:
+                    // Already stopping. Set state to RESETTING so resources will be released once
+                    // onRecordingFinalized() runs.
                     setState(State.RESETTING);
-                    break;
+                    // Fall-through
                 case RESETTING:
-                    // No-Op, the Recorder is being reset.
+                    // No-Op, the Recorder is already being reset.
                     break;
             }
         }
+
+        // These calls must not be posted to the executor to ensure they are executed inline on
+        // the sequential executor and the state changes above are correctly handled.
+        if (shouldReset) {
+            resetInternal();
+        } else if (shouldStop) {
+            stopInternal(mInProgressRecording, ERROR_NONE);
+        }
     }
 
     @ExecutedBy("mSequentialExecutor")
@@ -760,6 +936,8 @@
 
     @ExecutedBy("mSequentialExecutor")
     private void onInitialized() {
+        RecordingRecord recordingToStart = null;
+        boolean startRecordingPaused = false;
         synchronized (mLock) {
             switch (mState) {
                 case IDLING:
@@ -768,35 +946,32 @@
                     // Fall-through
                 case PAUSED:
                     // Fall-through
-                case STOPPING:
-                    // Fall-through
                 case RESETTING:
-                    throw new IllegalStateException(
+                    // Fall-through
+                case STOPPING:
+                    throw new AssertionError(
                             "Incorrectly invoke onInitialized() in state " + mState);
                 case INITIALIZING:
                     setState(State.IDLING);
                     break;
-                case PENDING_PAUSED:
-                    // Start and pause recording if start() has been called before video encoder is
-                    // setup.
-                    mSequentialExecutor.execute(() -> {
-                        startInternal();
-                        pauseInternal();
-                    });
-                    setState(State.PAUSED);
-                    break;
-                case PENDING_RECORDING:
-                    // Start recording if start() has been called before video encoder is setup.
-                    mSequentialExecutor.execute(this::startInternal);
-                    setState(State.RECORDING);
-                    break;
                 case ERROR:
                     Logger.e(TAG,
                             "onInitialized() was invoked when the Recorder had encountered error "
                                     + mErrorCause);
                     break;
+                case PENDING_PAUSED:
+                    startRecordingPaused = true;
+                    // Fall through
+                case PENDING_RECORDING:
+                    recordingToStart = makePendingRecordingActiveLocked(mState);
+                    break;
             }
         }
+
+        if (recordingToStart != null) {
+            // Start new active recording inline on sequential executor (but unlocked).
+            startActiveRecording(recordingToStart, startRecordingPaused);
+        }
     }
 
     @NonNull
@@ -831,6 +1006,15 @@
         return mediaSpecBuilder.build();
     }
 
+    private static boolean isSameRecording(@NonNull ActiveRecording activeRecording,
+            @Nullable RecordingRecord recordingRecord) {
+        if (recordingRecord == null) {
+            return false;
+        }
+
+        return activeRecording.getRecordingId() == recordingRecord.getRecordingId();
+    }
+
     @ExecutedBy("mSequentialExecutor")
     @NonNull
     private AudioEncoderConfig composeAudioEncoderConfig(@NonNull MediaSpec mediaSpec) {
@@ -859,8 +1043,9 @@
     }
 
     @RequiresPermission(Manifest.permission.RECORD_AUDIO)
-    private void setupAudioIfNeeded(@NonNull ActiveRecording activeRecording) {
-        if (!activeRecording.isAudioEnabled()) {
+    @ExecutedBy("mSequentialExecutor")
+    private void setupAudioIfNeeded(@NonNull RecordingRecord activeRecording) {
+        if (!activeRecording.hasAudioEnabled()) {
             // Skip if audio is not enabled for the recording.
             return;
         }
@@ -869,7 +1054,7 @@
             throw new IllegalStateException("The Recorder doesn't support recording with audio");
         }
 
-        if (mAudioInitialized.getAndSet(true)) {
+        if (mAudioInitialized) {
             // Skip if audio has already been initialized.
             return;
         }
@@ -881,96 +1066,23 @@
             mAudioEncoder = new EncoderImpl(mExecutor, config);
         } catch (InvalidConfigException e) {
             Logger.e(TAG, "Unable to initialize audio encoder." + e);
-            setState(State.ERROR);
-            mErrorCause = e;
+            onEncoderSetupError(e);
             return;
         }
 
         Encoder.EncoderInput bufferProvider = mAudioEncoder.getInput();
-        Preconditions.checkState(
-                bufferProvider instanceof Encoder.ByteBufferInput,
-                "The EncoderInput of audio isn't a ByteBufferInput.");
+        if (!(bufferProvider instanceof Encoder.ByteBufferInput)) {
+            throw new AssertionError("The EncoderInput of audio isn't a ByteBufferInput.");
+        }
         try {
             mAudioSource = setupAudioSource((Encoder.ByteBufferInput) bufferProvider,
                     mediaSpec.getAudioSpec());
         } catch (AudioSourceAccessException e) {
             Logger.e(TAG, "Unable to create audio source." + e);
-            throw new IllegalStateException("Unable to create audio source.", e);
+            throw new AssertionError("Unable to create audio source.", e);
         }
 
-        mAudioEncoder.setEncoderCallback(new EncoderCallback() {
-            @Override
-            public void onEncodeStart() {
-                // No-op.
-            }
-
-            @Override
-            public void onEncodeStop() {
-                mEncodingCompleters.get(mAudioTrackIndex).set(null);
-            }
-
-            @Override
-            public void onEncodeError(@NonNull EncodeException e) {
-                // If the audio encoder encounters error, update the status event to notify users.
-                // Then continue recording without audio data.
-                setAudioState(AudioState.ENCODER_ERROR);
-                updateStatusEvent();
-                mEncodingCompleters.get(mAudioTrackIndex).set(null);
-            }
-
-            @Override
-            public void onEncodedData(@NonNull EncodedData encodedData) {
-                try (EncodedData encodedDataToClose = encodedData) {
-                    if (mAudioState == AudioState.DISABLED) {
-                        throw new IllegalStateException(
-                                "Audio is not enabled but audio encoded data is produced.");
-                    } else if (mAudioState == AudioState.RECORDING
-                            || mAudioState == AudioState.SOURCE_SILENCED) {
-                        if (mAudioTrackIndex == null) {
-                            // Throw an exception if the data comes before the track is added.
-                            throw new IllegalStateException(
-                                    "Audio data comes before the track is added to MediaMuxer.");
-                        }
-                        if (mVideoTrackIndex == null) {
-                            Logger.d(TAG, "Drop audio data since video track hasn't been added.");
-                            return;
-                        }
-
-                        long newRecordingBytes = mRecordingBytes + encodedData.size();
-                        if (mFileSizeLimitInBytes != OutputOptions.FILE_SIZE_UNLIMITED
-                                && mRecordingBytes + encodedData.size() > mFileSizeLimitInBytes) {
-                            Logger.d(TAG,
-                                    String.format("Reach file size limit %d > %d",
-                                            newRecordingBytes,
-                                            mFileSizeLimitInBytes));
-                            stopInternal(ERROR_FILE_SIZE_LIMIT_REACHED);
-                            return;
-                        }
-
-                        mMediaMuxer.writeSampleData(mAudioTrackIndex, encodedData.getByteBuffer(),
-                                encodedData.getBufferInfo());
-
-                        mRecordingBytes = newRecordingBytes;
-                    }
-                }
-            }
-
-            @Override
-            public void onOutputConfigUpdate(@NonNull OutputConfig outputConfig) {
-                if (isAudioEnabled() && mAudioTrackIndex == null) {
-                    mAudioTrackIndex = Preconditions.checkNotNull(mMediaMuxer).addTrack(
-                            outputConfig.getMediaFormat());
-                    mEncodingFutures.add(CallbackToFutureAdapter.getFuture(
-                            completer -> {
-                                mEncodingCompleters.put(mAudioTrackIndex, completer);
-                                return "audioEncodingFuture";
-                            }));
-                }
-                if (mVideoTrackIndex != null) {
-                    startMediaMuxer();
-                }
-            }
-        }, mSequentialExecutor);
+        mAudioInitialized = true;
     }
 
     @RequiresPermission(Manifest.permission.RECORD_AUDIO)
@@ -997,17 +1109,20 @@
                             case INITIALIZING:
                                 // No-op
                                 break;
-                            case RECORDING:
+                            case ACTIVE:
                                 if (silenced) {
                                     mCachedAudioState = mAudioState;
                                     setAudioState(AudioState.SOURCE_SILENCED);
-                                    updateStatusEvent();
+                                    mAudioErrorCause = new IllegalStateException("The audio "
+                                            + "source has been silenced.");
+                                    updateInProgressStatusEvent();
                                 }
                                 break;
                             case SOURCE_SILENCED:
                                 if (!silenced) {
                                     setAudioState(mCachedAudioState);
-                                    updateStatusEvent();
+                                    mAudioErrorCause = null;
+                                    updateInProgressStatusEvent();
                                 }
                                 break;
                         }
@@ -1017,7 +1132,7 @@
                     public void onError(@NonNull Throwable throwable) {
                         if (throwable instanceof AudioSourceAccessException) {
                             setAudioState(AudioState.DISABLED);
-                            updateStatusEvent();
+                            updateInProgressStatusEvent();
                         }
                     }
                 });
@@ -1055,14 +1170,14 @@
         } catch (InvalidConfigException e) {
             surfaceRequest.willNotProvideSurface();
             Logger.e(TAG, "Unable to initialize video encoder." + e);
-            setState(State.ERROR);
-            mErrorCause = e;
+            onEncoderSetupError(e);
             return;
         }
 
         Encoder.EncoderInput encoderInput = mVideoEncoder.getInput();
-        Preconditions.checkState(encoderInput instanceof Encoder.SurfaceInput,
-                "The EncoderInput of video isn't a SurfaceInput.");
+        if (!(encoderInput instanceof Encoder.SurfaceInput)) {
+            throw new AssertionError("The EncoderInput of video isn't a SurfaceInput.");
+        }
         ((Encoder.SurfaceInput) encoderInput).setOnSurfaceUpdateListener(
                 mSequentialExecutor,
                 surface -> {
@@ -1079,148 +1194,150 @@
                     });
                     onInitialized();
                 });
+    }
 
-        mVideoEncoder.setEncoderCallback(new EncoderCallback() {
-            @Override
-            public void onEncodeStart() {
-                // No-op.
+    @ExecutedBy("mSequentialExecutor")
+    private void onEncoderSetupError(@Nullable Throwable cause) {
+        RecordingRecord pendingRecordingToFinalize = null;
+        synchronized (mLock) {
+            switch (mState) {
+                case PENDING_PAUSED:
+                    // Fall-through
+                case PENDING_RECORDING:
+                    pendingRecordingToFinalize = mPendingRecordingRecord;
+                    mPendingRecordingRecord = null;
+                    // Fall-through
+                case INITIALIZING:
+                    setState(State.ERROR);
+                    mErrorCause = cause;
+                    break;
+                case ERROR:
+                    // Already in an error state. Ignore new error.
+                    break;
+                case PAUSED:
+                    // Fall-through
+                case RECORDING:
+                    // Fall-through
+                case IDLING:
+                    // Fall-through
+                case RESETTING:
+                    // Fall-through
+                case STOPPING:
+                    throw new AssertionError("Encountered encoder setup error while in unexpected"
+                            + " state " + mState + ": " + cause);
             }
+        }
 
-            @Override
-            public void onEncodeStop() {
-                mEncodingCompleters.get(mVideoTrackIndex).set(null);
-            }
-
-            @Override
-            public void onEncodeError(@NonNull EncodeException e) {
-                mEncodingCompleters.get(mVideoTrackIndex).setException(e);
-            }
-
-            @Override
-            public void onEncodedData(@NonNull EncodedData encodedData) {
-                try (EncodedData encodedDataToClose = encodedData) {
-                    if (mVideoTrackIndex == null) {
-                        // Throw an exception if the data comes before the track is added.
-                        throw new IllegalStateException(
-                                "Video data comes before the track is added to MediaMuxer.");
-                    }
-                    if (isAudioEnabled() && mAudioTrackIndex == null) {
-                        Logger.d(TAG, "Drop video data since audio track hasn't been added.");
-                        return;
-                    }
-                    // If the first video data is not a key frame, MediaMuxer#writeSampleData
-                    // will drop it. It will cause incorrect estimated record bytes and should
-                    // be dropped.
-                    if (mFirstRecordingVideoDataTimeUs == 0L && !encodedData.isKeyFrame()) {
-                        Logger.d(TAG, "Drop video data since first video data is no key frame.");
-                        mVideoEncoder.requestKeyFrame();
-                        return;
-                    }
-
-                    long newRecordingBytes = mRecordingBytes + encodedData.size();
-                    if (mFileSizeLimitInBytes != OutputOptions.FILE_SIZE_UNLIMITED
-                            && newRecordingBytes > mFileSizeLimitInBytes) {
-                        Logger.d(TAG,
-                                String.format("Reach file size limit %d > %d", newRecordingBytes,
-                                        mFileSizeLimitInBytes));
-                        stopInternal(ERROR_FILE_SIZE_LIMIT_REACHED);
-                        return;
-                    }
-
-                    mMediaMuxer.writeSampleData(mVideoTrackIndex, encodedData.getByteBuffer(),
-                            encodedData.getBufferInfo());
-
-                    mRecordingBytes = newRecordingBytes;
-
-                    if (mFirstRecordingVideoDataTimeUs == 0L) {
-                        mFirstRecordingVideoDataTimeUs = encodedData.getPresentationTimeUs();
-                    }
-                    mRecordingDurationNs = TimeUnit.MICROSECONDS.toNanos(
-                            encodedData.getPresentationTimeUs() - mFirstRecordingVideoDataTimeUs);
-
-                    updateStatusEvent();
-                }
-            }
-
-            @Override
-            public void onOutputConfigUpdate(@NonNull OutputConfig outputConfig) {
-                if (mVideoTrackIndex == null) {
-                    mVideoTrackIndex = Preconditions.checkNotNull(mMediaMuxer).addTrack(
-                            outputConfig.getMediaFormat());
-                    mEncodingFutures.add(CallbackToFutureAdapter.getFuture(
-                            completer -> {
-                                mEncodingCompleters.put(mVideoTrackIndex, completer);
-                                return "videoEncodingFuture";
-                            }));
-                }
-                if (isAudioEnabled() && mAudioTrackIndex == null) {
-                    // The audio is enabled but audio track hasn't been configured.
-                    return;
-                }
-                startMediaMuxer();
-            }
-        }, mSequentialExecutor);
+        if (pendingRecordingToFinalize != null) {
+            finalizePendingRecording(pendingRecordingToFinalize, ERROR_RECORDER_ERROR, cause);
+        }
     }
 
     @ExecutedBy("mSequentialExecutor")
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    void startMediaMuxer() {
-        Futures.addCallback(Futures.allAsList(mEncodingFutures),
-                new FutureCallback<List<Void>>() {
-                    @Override
-                    public void onSuccess(@Nullable List<Void> result) {
-                        finalizeRecording(mRecordingStopError, null);
-                    }
+    void setupAndStartMediaMuxer(@NonNull RecordingRecord recordingToStart) {
+        if (mMediaMuxer != null) {
+            throw new AssertionError("Unable to set up media muxer when one already exists.");
+        }
 
-                    @Override
-                    public void onFailure(Throwable t) {
-                        finalizeRecording(ERROR_ENCODING_FAILED, t);
-                    }
-                }, mSequentialExecutor);
-        Preconditions.checkNotNull(mMediaMuxer).start();
+        if (isAudioEnabled() && mPendingFirstAudioData == null) {
+            throw new AssertionError("Audio is enabled but no audio sample is ready. Cannot start"
+                    + " media muxer.");
+        }
+
+        if (mPendingFirstVideoData == null) {
+            throw new AssertionError("Media muxer cannot be started without an encoded video "
+                    + "frame.");
+        }
+
+        try (EncodedData videoDataToWrite = mPendingFirstVideoData; EncodedData audioDataToWrite =
+                mPendingFirstAudioData) {
+            mPendingFirstVideoData = null;
+            mPendingFirstAudioData = null;
+            // Make sure we can write the first audio and video data without hitting the file size
+            // limit. Otherwise we will be left with a malformed (empty) track on stop.
+            long firstDataSize = videoDataToWrite.size();
+            if (audioDataToWrite != null) {
+                firstDataSize += audioDataToWrite.size();
+            }
+            if (mFileSizeLimitInBytes != OutputOptions.FILE_SIZE_UNLIMITED
+                    && firstDataSize > mFileSizeLimitInBytes) {
+                Logger.d(TAG,
+                        String.format("Initial data exceeds file size limit %d > %d", firstDataSize,
+                                mFileSizeLimitInBytes));
+                onInProgressRecordingInternalError(recordingToStart, ERROR_FILE_SIZE_LIMIT_REACHED);
+                return;
+            }
+
+            try {
+                setupMediaMuxer(recordingToStart.getOutputOptions());
+            } catch (IOException e) {
+                onInProgressRecordingInternalError(recordingToStart, ERROR_INVALID_OUTPUT_OPTIONS);
+                return;
+            }
+
+            mVideoTrackIndex = mMediaMuxer.addTrack(mVideoOutputConfig.getMediaFormat());
+            if (isAudioEnabled()) {
+                mAudioTrackIndex = mMediaMuxer.addTrack(mAudioOutputConfig.getMediaFormat());
+            }
+            mMediaMuxer.start();
+
+            // Write first data to ensure tracks are not empty
+            writeVideoData(videoDataToWrite, recordingToStart);
+            if (audioDataToWrite != null) {
+                writeAudioData(audioDataToWrite, recordingToStart);
+            }
+        }
     }
 
+    @SuppressLint("WrongConstant")
     @ExecutedBy("mSequentialExecutor")
     private void setupMediaMuxer(@NonNull OutputOptions options) throws IOException {
-        int outputFormat = getObservableData(mMediaSpec).getOutputFormat();
+        int muxerOutputFormat = MediaSpec.outputFormatToMuxerFormat(
+                getObservableData(mMediaSpec).getOutputFormat());
         switch (options.getType()) {
             case OutputOptions.OPTIONS_TYPE_FILE:
-                Preconditions.checkState(options instanceof FileOutputOptions, "Invalid "
-                                + "OutputOptions type");
+                if (!(options instanceof FileOutputOptions)) {
+                    throw new AssertionError("Invalid OutputOptions type");
+                }
                 FileOutputOptions fileOutputOptions = (FileOutputOptions) options;
-                mMediaMuxer = new MediaMuxer(
-                        fileOutputOptions.getFile().getAbsolutePath(),
-                        outputFormat);
+                File file = fileOutputOptions.getFile();
+                mMediaMuxer = new MediaMuxer(file.getAbsolutePath(), muxerOutputFormat);
+                mOutputUri = Uri.fromFile(file);
                 break;
             case OutputOptions.OPTIONS_TYPE_FILE_DESCRIPTOR:
-                Preconditions.checkState(options instanceof FileDescriptorOutputOptions, "Invalid "
-                        + "OutputOptions type");
+                if (!(options instanceof FileDescriptorOutputOptions)) {
+                    throw new AssertionError("Invalid OutputOptions type");
+                }
                 FileDescriptorOutputOptions fileDescriptorOutputOptions =
                         (FileDescriptorOutputOptions) options;
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                     mMediaMuxer = Api26Impl.createMediaMuxer(
                             fileDescriptorOutputOptions.getParcelFileDescriptor()
-                                    .getFileDescriptor(),
-                            outputFormat);
+                                    .getFileDescriptor(), muxerOutputFormat);
                 } else {
                     throw new IOException(
                             "MediaMuxer doesn't accept FileDescriptor as output destination.");
                 }
                 break;
             case OutputOptions.OPTIONS_TYPE_MEDIA_STORE:
-                Preconditions.checkState(options instanceof MediaStoreOutputOptions, "Invalid "
-                        + "OutputOptions type");
+                if (!(options instanceof MediaStoreOutputOptions)) {
+                    throw new AssertionError("Invalid OutputOptions type");
+                }
                 MediaStoreOutputOptions mediaStoreOutputOptions = (MediaStoreOutputOptions) options;
 
                 ContentValues contentValues =
                         new ContentValues(mediaStoreOutputOptions.getContentValues());
-                mOutputUri = mediaStoreOutputOptions.getContentResolver().insert(
-                        mediaStoreOutputOptions.getCollection(), contentValues);
-                if (mOutputUri == null) {
-                    finalizeRecording(ERROR_INVALID_OUTPUT_OPTIONS,
-                            new IOException("Unable to create MediaStore entry."));
-                    return;
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                    // Toggle on pending status for the video file.
+                    contentValues.put(MediaStore.Video.Media.IS_PENDING, PENDING);
                 }
+                Uri outputUri = mediaStoreOutputOptions.getContentResolver().insert(
+                        mediaStoreOutputOptions.getCollection(), contentValues);
+                if (outputUri == null) {
+                    throw new IOException("Unable to create MediaStore entry.");
+                }
+                mOutputUri = outputUri;  // Guarantee mOutputUri is non-null value.
 
                 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                     String path =
@@ -1234,18 +1351,18 @@
                     if (parentFile != null && !parentFile.mkdirs()) {
                         Logger.w(TAG, "Failed to create folder for " + path);
                     }
-                    mMediaMuxer = new MediaMuxer(path, outputFormat);
+                    mMediaMuxer = new MediaMuxer(path, muxerOutputFormat);
                 } else {
                     ParcelFileDescriptor fileDescriptor =
                             mediaStoreOutputOptions.getContentResolver().openFileDescriptor(
                                     mOutputUri, "rw");
                     mMediaMuxer = Api26Impl.createMediaMuxer(fileDescriptor.getFileDescriptor(),
-                            outputFormat);
+                            muxerOutputFormat);
                     fileDescriptor.close();
                 }
                 break;
             default:
-                throw new IllegalArgumentException(
+                throw new AssertionError(
                         "Invalid output options type." + options.getType());
         }
         // TODO: Add more metadata to MediaMuxer, e.g. location information.
@@ -1254,73 +1371,346 @@
         }
     }
 
+    @SuppressLint("MissingPermission")
     @ExecutedBy("mSequentialExecutor")
-    private void startInternal() {
-        if (mAudioState == AudioState.INITIALIZING) {
-            setAudioState(mRunningRecording.isAudioEnabled() ? AudioState.RECORDING
-                    : AudioState.DISABLED);
+    private void startInternal(@NonNull RecordingRecord recordingToStart) {
+        if (mInProgressRecording != null) {
+            throw new AssertionError("Attempted to start a new recording while another was in "
+                    + "progress.");
         }
 
-        try {
-            setupMediaMuxer(Preconditions.checkNotNull(mRunningRecording).getOutputOptions());
-        } catch (IOException e) {
-            finalizeRecording(ERROR_INVALID_OUTPUT_OPTIONS, e);
-            return;
-        }
-
-        if (mRunningRecording.getOutputOptions().getFileSizeLimit() > 0) {
+        if (recordingToStart.getOutputOptions().getFileSizeLimit() > 0) {
             // Use %95 of the given file size limit as the criteria, which refers to the
             // MPEG4Writer.cpp in libstagefright.
             mFileSizeLimitInBytes = Math.round(
-                    mRunningRecording.getOutputOptions().getFileSizeLimit() * 0.95);
+                    recordingToStart.getOutputOptions().getFileSizeLimit() * 0.95);
             Logger.d(TAG, "File size limit in bytes: " + mFileSizeLimitInBytes);
         } else {
             mFileSizeLimitInBytes = OutputOptions.FILE_SIZE_UNLIMITED;
         }
 
+        setupAudioIfNeeded(recordingToStart);
+
+        mInProgressRecording = recordingToStart;
+        if (mAudioState == AudioState.INITIALIZING) {
+            setAudioState(recordingToStart.hasAudioEnabled() ? AudioState.ACTIVE
+                    : AudioState.DISABLED);
+        }
+
+        initEncoderCallbacks(recordingToStart);
         if (isAudioEnabled()) {
             mAudioSource.start();
             mAudioEncoder.start();
         }
         mVideoEncoder.start();
 
-        updateVideoRecordEvent(VideoRecordEvent.start(
-                Preconditions.checkNotNull(mRunningRecording).getOutputOptions(),
-                getCurrentRecordingStats()));
+        mInProgressRecording.updateVideoRecordEvent(VideoRecordEvent.start(
+                mInProgressRecording.getOutputOptions(),
+                getInProgressRecordingStats()));
     }
 
     @ExecutedBy("mSequentialExecutor")
-    private void pauseInternal() {
-        if (isAudioEnabled()) {
-            mAudioEncoder.pause();
-        }
-        mVideoEncoder.pause();
+    private void initEncoderCallbacks(@NonNull RecordingRecord recordingToStart) {
+        mEncodingFutures.add(CallbackToFutureAdapter.getFuture(
+                completer -> {
+                    mVideoEncoder.setEncoderCallback(new EncoderCallback() {
+                        @ExecutedBy("mSequentialExecutor")
+                        @Override
+                        public void onEncodeStart() {
+                            // No-op.
+                        }
 
-        updateVideoRecordEvent(VideoRecordEvent.pause(
-                Preconditions.checkNotNull(mRunningRecording).getOutputOptions(),
-                getCurrentRecordingStats()));
+                        @ExecutedBy("mSequentialExecutor")
+                        @Override
+                        public void onEncodeStop() {
+                            completer.set(null);
+                        }
+
+                        @ExecutedBy("mSequentialExecutor")
+                        @Override
+                        public void onEncodeError(@NonNull EncodeException e) {
+                            completer.setException(e);
+                        }
+
+                        @ExecutedBy("mSequentialExecutor")
+                        @Override
+                        public void onEncodedData(@NonNull EncodedData encodedData) {
+                            // If the media muxer doesn't yet exist, we may need to create and
+                            // start it. Otherwise we can write the data.
+                            if (mMediaMuxer == null) {
+                                if (!mInProgressRecordingStopping) {
+                                    // Clear any previously pending video data since we now
+                                    // have newer data.
+                                    boolean cachedDataDropped = false;
+                                    if (mPendingFirstVideoData != null) {
+                                        cachedDataDropped = true;
+                                        mPendingFirstVideoData.close();
+                                        mPendingFirstVideoData = null;
+                                    }
+
+                                    if (encodedData.isKeyFrame()) {
+                                        // We have a keyframe. Cache it in case we need to wait
+                                        // for audio data.
+                                        mPendingFirstVideoData = encodedData;
+                                        // If first pending audio data exists or audio is
+                                        // disabled, we can start the muxer.
+                                        if (!isAudioEnabled() || mPendingFirstAudioData != null) {
+                                            Logger.d(TAG, "Received video keyframe. Starting "
+                                                    + "muxer...");
+                                            setupAndStartMediaMuxer(recordingToStart);
+                                        } else {
+                                            if (cachedDataDropped) {
+                                                Logger.d(TAG, "Replaced cached video keyframe "
+                                                        + "with newer keyframe.");
+                                            } else {
+                                                Logger.d(TAG, "Cached video keyframe while we wait "
+                                                        + "for first audio sample before starting "
+                                                        + "muxer.");
+                                            }
+                                        }
+                                    } else {
+                                        // If the video data is not a key frame,
+                                        // MediaMuxer#writeSampleData will drop it. It will
+                                        // cause incorrect estimated record bytes and should
+                                        // be dropped.
+                                        if (cachedDataDropped) {
+                                            Logger.d(TAG, "Dropped cached keyframe since we have "
+                                                    + "new video data and have not yet received "
+                                                    + "audio data.");
+                                        }
+                                        Logger.d(TAG, "Dropped video data since muxer has not yet "
+                                                + "started and data is not a keyframe.");
+                                        mVideoEncoder.requestKeyFrame();
+                                        encodedData.close();
+                                    }
+                                } else {
+                                    // Recording is stopping before muxer has been started.
+                                    Logger.d(TAG, "Drop video data since recording is stopping.");
+                                    encodedData.close();
+                                }
+                            } else {
+                                // MediaMuxer is already started, write the data.
+                                try (EncodedData videoDataToWrite = encodedData) {
+                                    writeVideoData(videoDataToWrite, recordingToStart);
+                                }
+                            }
+                        }
+
+                        @ExecutedBy("mSequentialExecutor")
+                        @Override
+                        public void onOutputConfigUpdate(@NonNull OutputConfig outputConfig) {
+                            mVideoOutputConfig = outputConfig;
+                        }
+                    }, mSequentialExecutor);
+                    return "videoEncodingFuture";
+                }));
+
+        if (isAudioEnabled()) {
+            mEncodingFutures.add(CallbackToFutureAdapter.getFuture(
+                    completer -> {
+                        mAudioEncoder.setEncoderCallback(new EncoderCallback() {
+                            @ExecutedBy("mSequentialExecutor")
+                            @Override
+                            public void onEncodeStart() {
+                                // No-op.
+                            }
+
+                            @ExecutedBy("mSequentialExecutor")
+                            @Override
+                            public void onEncodeStop() {
+                                completer.set(null);
+                            }
+
+                            @ExecutedBy("mSequentialExecutor")
+                            @Override
+                            public void onEncodeError(@NonNull EncodeException e) {
+                                // If the audio encoder encounters error, update the status event
+                                // to notify users. Then continue recording without audio data.
+                                setAudioState(AudioState.ENCODER_ERROR);
+                                mAudioErrorCause = e;
+                                updateInProgressStatusEvent();
+                                completer.set(null);
+                            }
+
+                            @ExecutedBy("mSequentialExecutor")
+                            @Override
+                            public void onEncodedData(@NonNull EncodedData encodedData) {
+                                if (mAudioState == AudioState.DISABLED) {
+                                    throw new AssertionError(
+                                            "Audio is not enabled but audio encoded data is "
+                                                    + "produced.");
+                                }
+
+                                // If the media muxer doesn't yet exist, we may need to create and
+                                // start it. Otherwise we can write the data.
+                                if (mMediaMuxer == null) {
+                                    if (!mInProgressRecordingStopping) {
+                                        boolean cachedDataDropped = false;
+                                        if (mPendingFirstAudioData != null) {
+                                            cachedDataDropped = true;
+                                            mPendingFirstAudioData.close();
+                                            mPendingFirstAudioData = null;
+                                        }
+
+                                        mPendingFirstAudioData = encodedData;
+                                        if (mPendingFirstVideoData != null) {
+                                            // Both audio and data are ready. Start the muxer.
+                                            Logger.d(TAG, "Received audio data. Starting muxer...");
+                                            setupAndStartMediaMuxer(recordingToStart);
+                                        } else {
+                                            if (cachedDataDropped) {
+                                                Logger.d(TAG, "Replaced cached audio data with "
+                                                        + "newer data.");
+                                            } else {
+                                                Logger.d(TAG, "Cached audio data while we wait for "
+                                                        + "video keyframe before starting muxer.");
+                                            }
+                                        }
+                                    } else {
+                                        // Recording is stopping before muxer has been started.
+                                        Logger.d(TAG,
+                                                "Drop audio data since recording is stopping.");
+                                        encodedData.close();
+                                    }
+                                } else {
+                                    try (EncodedData audioDataToWrite = encodedData) {
+                                        writeAudioData(audioDataToWrite, recordingToStart);
+                                    }
+                                }
+                            }
+
+                            @ExecutedBy("mSequentialExecutor")
+                            @Override
+                            public void onOutputConfigUpdate(@NonNull OutputConfig outputConfig) {
+                                mAudioOutputConfig = outputConfig;
+                            }
+                        }, mSequentialExecutor);
+                        return "audioEncodingFuture";
+                    }));
+        }
+
+        Futures.addCallback(Futures.allAsList(mEncodingFutures),
+                new FutureCallback<List<Void>>() {
+                    @Override
+                    public void onSuccess(@Nullable List<Void> result) {
+                        finalizeInProgressRecording(mRecordingStopError, null);
+                    }
+
+                    @Override
+                    public void onFailure(Throwable t) {
+                        finalizeInProgressRecording(ERROR_ENCODING_FAILED, t);
+                    }
+                },
+                // Can use direct executor since completers are always completed on sequential
+                // executor.
+                CameraXExecutors.directExecutor());
+    }
+
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    void writeVideoData(@NonNull EncodedData encodedData,
+            @NonNull RecordingRecord recording) {
+        if (mVideoTrackIndex == null) {
+            // Throw an exception if the data comes before the track is added.
+            throw new AssertionError(
+                    "Video data comes before the track is added to MediaMuxer.");
+        }
+
+        long newRecordingBytes = mRecordingBytes + encodedData.size();
+        if (mFileSizeLimitInBytes != OutputOptions.FILE_SIZE_UNLIMITED
+                && newRecordingBytes > mFileSizeLimitInBytes) {
+            Logger.d(TAG,
+                    String.format("Reach file size limit %d > %d", newRecordingBytes,
+                            mFileSizeLimitInBytes));
+            onInProgressRecordingInternalError(recording, ERROR_FILE_SIZE_LIMIT_REACHED);
+            return;
+        }
+
+        mMediaMuxer.writeSampleData(mVideoTrackIndex, encodedData.getByteBuffer(),
+                encodedData.getBufferInfo());
+
+        mRecordingBytes = newRecordingBytes;
+
+        if (mFirstRecordingVideoDataTimeUs == 0L) {
+            mFirstRecordingVideoDataTimeUs = encodedData.getPresentationTimeUs();
+        }
+        mRecordingDurationNs = TimeUnit.MICROSECONDS.toNanos(
+                encodedData.getPresentationTimeUs() - mFirstRecordingVideoDataTimeUs);
+
+        updateInProgressStatusEvent();
+    }
+
+    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    void writeAudioData(@NonNull EncodedData encodedData,
+            @NonNull RecordingRecord recording) {
+
+        long newRecordingBytes = mRecordingBytes + encodedData.size();
+        if (mFileSizeLimitInBytes != OutputOptions.FILE_SIZE_UNLIMITED
+                && newRecordingBytes > mFileSizeLimitInBytes) {
+            Logger.d(TAG,
+                    String.format("Reach file size limit %d > %d",
+                            newRecordingBytes,
+                            mFileSizeLimitInBytes));
+            onInProgressRecordingInternalError(recording, ERROR_FILE_SIZE_LIMIT_REACHED);
+            return;
+        }
+
+        mMediaMuxer.writeSampleData(mAudioTrackIndex,
+                encodedData.getByteBuffer(),
+                encodedData.getBufferInfo());
+
+        mRecordingBytes = newRecordingBytes;
     }
 
     @ExecutedBy("mSequentialExecutor")
-    private void resumeInternal() {
-        if (isAudioEnabled()) {
-            mAudioEncoder.start();
-        }
-        mVideoEncoder.start();
+    private void pauseInternal(@NonNull RecordingRecord recordingToPause) {
+        // Only pause recording if recording is in-progress and it is not stopping.
+        if (mInProgressRecording == recordingToPause && !mInProgressRecordingStopping) {
+            if (isAudioEnabled()) {
+                mAudioEncoder.pause();
+            }
+            mVideoEncoder.pause();
 
-        updateVideoRecordEvent(VideoRecordEvent.resume(
-                Preconditions.checkNotNull(mRunningRecording).getOutputOptions(),
-                getCurrentRecordingStats()));
+            mInProgressRecording.updateVideoRecordEvent(VideoRecordEvent.pause(
+                    mInProgressRecording.getOutputOptions(),
+                    getInProgressRecordingStats()));
+        }
+    }
+
+    @ExecutedBy("mSequentialExecutor")
+    private void resumeInternal(@NonNull RecordingRecord recordingToResume) {
+        // Only resume recording if recording is in-progress and it is not stopping.
+        if (mInProgressRecording == recordingToResume && !mInProgressRecordingStopping) {
+            if (isAudioEnabled()) {
+                mAudioEncoder.start();
+            }
+            mVideoEncoder.start();
+
+            mInProgressRecording.updateVideoRecordEvent(VideoRecordEvent.resume(
+                    mInProgressRecording.getOutputOptions(),
+                    getInProgressRecordingStats()));
+        }
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mSequentialExecutor")
-    void stopInternal(@VideoRecordError int stopError) {
-        mRecordingStopError = stopError;
-        if (isAudioEnabled()) {
-            mAudioEncoder.stop();
+    void stopInternal(@NonNull RecordingRecord recordingToStop, @VideoRecordError int stopError) {
+        // Only stop recording if recording is in-progress and it is not already stopping.
+        if (mInProgressRecording == recordingToStop && !mInProgressRecordingStopping) {
+            mInProgressRecordingStopping = true;
+            mRecordingStopError = stopError;
+            if (isAudioEnabled()) {
+                if (mPendingFirstAudioData != null) {
+                    mPendingFirstAudioData.close();
+                    mPendingFirstAudioData = null;
+                }
+                mAudioEncoder.stop();
+            }
+            if (mPendingFirstVideoData != null) {
+                mPendingFirstVideoData.close();
+                mPendingFirstVideoData = null;
+            }
+            mVideoEncoder.stop();
         }
-        mVideoEncoder.stop();
     }
 
     @ExecutedBy("mSequentialExecutor")
@@ -1328,36 +1718,36 @@
         if (mAudioEncoder != null) {
             mAudioEncoder.release();
             mAudioEncoder = null;
+            mAudioOutputConfig = null;
         }
         if (mVideoEncoder != null) {
             mVideoEncoder.release();
             mVideoEncoder = null;
+            mVideoOutputConfig = null;
         }
         if (mAudioSource != null) {
             mAudioSource.release();
             mAudioSource = null;
         }
 
-        mSurfaceRequested.set(false);
-        mAudioInitialized.set(false);
-        setState(State.INITIALIZING);
+        mAudioInitialized = false;
     }
 
-    private int internalAudioStateToEventAudioState(@NonNull AudioState audioState) {
+    private int internalAudioStateToAudioStatsState(@NonNull AudioState audioState) {
         switch (audioState) {
             case DISABLED:
-                return RecordingStats.AUDIO_DISABLED;
+                return AudioStats.AUDIO_STATE_DISABLED;
             case INITIALIZING:
                 // Fall-through
-            case RECORDING:
-                return RecordingStats.AUDIO_RECORDING;
+            case ACTIVE:
+                return AudioStats.AUDIO_STATE_ACTIVE;
             case SOURCE_SILENCED:
-                return RecordingStats.AUDIO_SOURCE_SILENCED;
+                return AudioStats.AUDIO_STATE_SOURCE_SILENCED;
             case ENCODER_ERROR:
-                return RecordingStats.AUDIO_ENCODER_ERROR;
+                return AudioStats.AUDIO_STATE_ENCODER_ERROR;
         }
         // Should not reach.
-        throw new IllegalStateException("Invalid internal audio state: " + audioState);
+        throw new AssertionError("Invalid internal audio state: " + audioState);
     }
 
     @NonNull
@@ -1365,41 +1755,57 @@
         // Stopping state should be treated as inactive on certain chipsets. See b/196039619.
         DeactivateEncoderSurfaceBeforeStopEncoderQuirk quirk =
                 DeviceQuirks.get(DeactivateEncoderSurfaceBeforeStopEncoderQuirk.class);
+        // TODO(b/197047288): For devices that have the above quirk, wait for a signal that the
+        //  surface is no longer in use before stopping the video encoder.
         return state == State.RECORDING || (state == State.STOPPING && quirk == null)
                 ? StreamState.ACTIVE : StreamState.INACTIVE;
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @ExecutedBy("mSequentialExecutor")
     boolean isAudioEnabled() {
         return mAudioState != AudioState.DISABLED && mAudioState != AudioState.ENCODER_ERROR;
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mSequentialExecutor")
-    void finalizeRecording(@VideoRecordError int error, @Nullable Throwable throwable) {
+    void finalizeInProgressRecording(@VideoRecordError int error,
+            @Nullable Throwable throwable) {
+        if (mInProgressRecording == null) {
+            throw new AssertionError("Attempted to finalize in-progress recording, but no "
+                    + "recording is in progress.");
+        }
         int errorToSend = error;
         if (mMediaMuxer != null) {
             try {
                 mMediaMuxer.stop();
+                mMediaMuxer.release();
             } catch (IllegalStateException e) {
-                Logger.e(TAG, "MediaMuxer failed to stop with error: " + e.getMessage());
+                Logger.e(TAG, "MediaMuxer failed to stop or release with error: " + e.getMessage());
                 if (errorToSend == ERROR_NONE) {
                     errorToSend = ERROR_UNKNOWN;
                 }
             }
-            mMediaMuxer.release();
             mMediaMuxer = null;
+        } else if (errorToSend == ERROR_NONE) {
+            // Muxer was never started, so recording has no data.
+            errorToSend = ERROR_NO_VALID_DATA;
         }
 
-        OutputOptions outputOptions =
-                Preconditions.checkNotNull(mRunningRecording).getOutputOptions();
-        RecordingStats stats = getCurrentRecordingStats();
+        OutputOptions outputOptions = mInProgressRecording.getOutputOptions();
+        RecordingStats stats = getInProgressRecordingStats();
+
+        if (outputOptions.getType() == OutputOptions.OPTIONS_TYPE_MEDIA_STORE) {
+            // Toggle off pending status for the video file.
+            finalizeMediaStoreFile((MediaStoreOutputOptions) outputOptions);
+        }
+
         OutputResults outputResults = OutputResults.of(mOutputUri);
-        updateVideoRecordEvent(errorToSend == ERROR_NONE
+        mInProgressRecording.updateVideoRecordEvent(errorToSend == ERROR_NONE
                 ? VideoRecordEvent.finalize(
-                        outputOptions,
-                        stats,
-                        outputResults)
+                outputOptions,
+                stats,
+                outputResults)
                 : VideoRecordEvent.finalizeWithError(
                         outputOptions,
                         stats,
@@ -1407,20 +1813,136 @@
                         errorToSend,
                         throwable));
 
+        RecordingRecord finalizedRecording = mInProgressRecording;
+        mInProgressRecording = null;
+        mInProgressRecordingStopping = false;
         mAudioTrackIndex = null;
         mVideoTrackIndex = null;
         mEncodingFutures.clear();
-        mEncodingCompleters.clear();
-        mRunningRecording = null;
         mOutputUri = Uri.EMPTY;
         mRecordingBytes = 0L;
         mRecordingDurationNs = 0L;
         mFirstRecordingVideoDataTimeUs = 0L;
         mRecordingStopError = ERROR_UNKNOWN;
-        mFileSizeLimitInBytes = OutputOptions.FILE_SIZE_UNLIMITED;
+        mAudioErrorCause = null;
 
+        onRecordingFinalized(finalizedRecording);
+    }
+
+    @ExecutedBy("mSequentialExecutor")
+    private void onRecordingFinalized(@NonNull RecordingRecord finalizedRecording) {
+        boolean needsReset = false;
+        boolean startRecordingPaused = false;
+        RecordingRecord recordingToStart = null;
+        synchronized (mLock) {
+            if (mActiveRecordingRecord != finalizedRecording) {
+                throw new AssertionError("Active recording did not match finalized recording on "
+                        + "finalize.");
+            }
+
+            mActiveRecordingRecord = null;
+            switch (mState) {
+                case RESETTING:
+                    setState(State.INITIALIZING);
+                    mSurfaceRequested = false;
+                    needsReset = true;
+                    break;
+                case PAUSED:
+                    // Fall-through
+                case RECORDING:
+                    // If finalized while in a RECORDING or PAUSED state, then the recording was
+                    // likely finalized due to an error.
+                    // Fall-through
+                case STOPPING:
+                    setState(State.IDLING);
+                    break;
+                case PENDING_PAUSED:
+                    startRecordingPaused = true;
+                    // Fall-through
+                case PENDING_RECORDING:
+                    recordingToStart = makePendingRecordingActiveLocked(mState);
+                    break;
+                case ERROR:
+                    // Error state is non-recoverable. Nothing to do here.
+                    break;
+                case IDLING:
+                    // Fall-through
+                case INITIALIZING:
+                    throw new AssertionError("Unexpected state on finalize of recording: "
+                            + mState);
+            }
+        }
+
+        // Perform required actions from state changes inline on sequential executor but unlocked.
+        if (needsReset) {
+            resetInternal();
+        } else if (recordingToStart != null) {
+            startActiveRecording(recordingToStart, startRecordingPaused);
+        }
+    }
+
+    @ExecutedBy("mSequentialExecutor")
+    void onInProgressRecordingInternalError(@NonNull RecordingRecord recording,
+            @VideoRecordError int error) {
+        if (recording != mInProgressRecording) {
+            throw new AssertionError("Internal error occurred on recording that is not the current "
+                    + "in-progress recorindg.");
+        }
+
+        boolean needsStop = false;
         synchronized (mLock) {
             switch (mState) {
+                case PAUSED:
+                    // Fall-through
+                case RECORDING:
+                    setState(State.STOPPING);
+                    needsStop = true;
+                    // Fall-through
+                case STOPPING:
+                    // Fall-through
+                case RESETTING:
+                    // Fall-through
+                case PENDING_RECORDING:
+                    // Fall-through
+                case PENDING_PAUSED:
+                    // Fall-through
+                    if (recording != mActiveRecordingRecord) {
+                        throw new AssertionError("Internal error occurred for recording but it is"
+                                + " not the active recording.");
+                    }
+                    break;
+                case INITIALIZING:
+                    // Fall-through
+                case IDLING:
+                    // Fall-through
+                case ERROR:
+                    throw new AssertionError("In-progress recording error occurred while in "
+                            + "unexpected state: " + mState);
+            }
+        }
+
+        if (needsStop) {
+            stopInternal(recording, error);
+        }
+    }
+
+    @ExecutedBy("mSequentialExecutor")
+    void tryServicePendingRecording() {
+        boolean startRecordingPaused = false;
+        RecordingRecord recordingToStart = null;
+        synchronized (mLock) {
+            switch (mState) {
+                case PENDING_PAUSED:
+                    startRecordingPaused = true;
+                    // Fall-through
+                case PENDING_RECORDING:
+                    if (mActiveRecordingRecord != null) {
+                        // Active recording is still finalizing. Pending recording will be
+                        // serviced in onRecordingFinalized().
+                        break;
+                    }
+                    recordingToStart = makePendingRecordingActiveLocked(mState);
+                    break;
                 case INITIALIZING:
                     // Fall-through
                 case IDLING:
@@ -1428,54 +1950,110 @@
                 case RECORDING:
                     // Fall-through
                 case PAUSED:
-                    throw new IllegalStateException(
-                            "Incorrectly invoke finalizeRecording in state " + mState);
-                case PENDING_RECORDING:
                     // Fall-through
-                case PENDING_PAUSED:
-                    setState(State.INITIALIZING);
-                    break;
                 case STOPPING:
                     // Fall-through
-                case ERROR:
-                    // Reset the internal state, except when the error is an recorder error,
-                    // which can't be recovered without reinitializing the recorder.
-                    if (error != ERROR_RECORDER_ERROR) {
-                        setState(State.IDLING);
-                    }
-                    break;
                 case RESETTING:
-                    resetInternal();
+                    // Fall-through
+                case ERROR:
                     break;
             }
         }
+
+        if (recordingToStart != null) {
+            // Start new active recording inline on sequential executor (but unlocked).
+            startActiveRecording(recordingToStart, startRecordingPaused);
+        }
     }
 
+    /**
+     * Makes the pending recording active and returns the new active recording.
+     *
+     * <p>This method will not actually start the recording. It is up to the caller to start the
+     * returned recording. However, the Recorder.State will be updated to reflect what the state
+     * should be after the recording is started. This allows the recording to be started when no
+     * longer under lock.
+     */
+    @GuardedBy("mLock")
+    @NonNull
+    private RecordingRecord makePendingRecordingActiveLocked(@NonNull State state) {
+        boolean startRecordingPaused = false;
+        if (state == State.PENDING_PAUSED) {
+            startRecordingPaused = true;
+        } else if (state != State.PENDING_RECORDING) {
+            throw new AssertionError("makePendingRecordingActiveLocked() can only be called from "
+                    + "a pending state.");
+        }
+        if (mActiveRecordingRecord != null) {
+            throw new AssertionError("Cannot make pending recording active because another "
+                    + "recording is already active.");
+        }
+        if (mPendingRecordingRecord == null) {
+            throw new AssertionError("Pending recording should exist when in a PENDING"
+                    + " state.");
+        }
+        // Swap the pending recording to the active recording and start it
+        RecordingRecord recordingToStart = mActiveRecordingRecord = mPendingRecordingRecord;
+        mPendingRecordingRecord = null;
+        // Start recording if start() has been called before video encoder is setup.
+        if (startRecordingPaused) {
+            setState(State.PAUSED);
+        } else {
+            setState(State.RECORDING);
+        }
+
+        return recordingToStart;
+    }
+
+    /**
+     * Actually starts a recording on the sequential executor.
+     *
+     * <p>This is intended to be called while unlocked on the sequential executor. It should only
+     * be called immediately after a pending recording has just been made active. The recording
+     * passed to this method should be the newly-made-active recording.
+     */
+    @ExecutedBy("mSequentialExecutor")
+    private void startActiveRecording(@NonNull RecordingRecord recordingToStart,
+            boolean startRecordingPaused) {
+        // Start pending recording inline since we are already on sequential executor.
+        startInternal(recordingToStart);
+        if (startRecordingPaused) {
+            pauseInternal(recordingToStart);
+        }
+    }
+
+
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mSequentialExecutor")
-    void updateStatusEvent() {
-        if (mRunningRecording != null) {
-            updateVideoRecordEvent(
+    void updateInProgressStatusEvent() {
+        if (mInProgressRecording != null) {
+            mInProgressRecording.updateVideoRecordEvent(
                     VideoRecordEvent.status(
-                            mRunningRecording.getOutputOptions(),
-                            getCurrentRecordingStats()));
+                            mInProgressRecording.getOutputOptions(),
+                            getInProgressRecordingStats()));
         }
     }
 
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mSequentialExecutor")
-    void updateVideoRecordEvent(@NonNull VideoRecordEvent event) {
-        if (mRunningRecording != null) {
-            mRunningRecording.updateVideoRecordEvent(event);
+    private void finalizeMediaStoreFile(@NonNull MediaStoreOutputOptions mediaStoreOutputOptions) {
+        if (mOutputUri.equals(Uri.EMPTY)) {
+            return;
         }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            ContentValues contentValues = new ContentValues();
+            contentValues.put(MediaStore.Video.Media.IS_PENDING, NOT_PENDING);
+            mediaStoreOutputOptions.getContentResolver().update(mOutputUri, contentValues, null,
+                    null);
+        }
+        // TODO (b/198551531): Trigger MediaScannerConnection.scanFile to rescan.
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mSequentialExecutor")
     @NonNull
-    RecordingStats getCurrentRecordingStats() {
+    RecordingStats getInProgressRecordingStats() {
         return RecordingStats.of(mRecordingDurationNs, mRecordingBytes,
-                internalAudioStateToEventAudioState(mAudioState));
+                AudioStats.of(internalAudioStateToAudioStatsState(mAudioState), mAudioErrorCause));
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -1495,17 +2073,80 @@
                 != AudioSpec.CHANNEL_COUNT_NONE;
     }
 
+    @GuardedBy("mLock")
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     void setState(@NonNull State state) {
-        synchronized (mLock) {
-            if (mState != state) {
-                Logger.d(TAG, "Transitioning Recorder internal state: " + mState + " --> " + state);
-                mState = state;
-                mStreamState.setState(internalStateToStreamState(state));
-            } else {
-                Logger.w(TAG, "Attempting to transition to the same state " + mState);
-            }
+        // If we're attempt to transition to the same state, then we likely have a logic error.
+        // All state transitions should be intentional, so throw an AssertionError here.
+        if (mState == state) {
+            throw new AssertionError("Attempted to transition to state " + state + ", but "
+                    + "Recorder is already in state " + state);
         }
+
+        Logger.d(TAG, "Transitioning Recorder internal state: " + mState + " --> " + state);
+        // If we are transitioning from a non-pending state to a pending state, we need to store
+        // the non-pending state so we can transition back if the pending recording is stopped
+        // before it becomes active.
+        StreamState streamState = null;
+        if (PENDING_STATES.contains(state)) {
+            if (!PENDING_STATES.contains(mState)) {
+                if (!VALID_NON_PENDING_STATES_WHILE_PENDING.contains(mState)) {
+                    throw new AssertionError(
+                            "Invalid state transition. Should not be transitioning "
+                                    + "to a PENDING state from state " + mState);
+                }
+                mNonPendingState = mState;
+                streamState = internalStateToStreamState(mNonPendingState);
+            }
+        } else if (mNonPendingState != null) {
+            // Transitioning out of a pending state. Clear the non-pending state.
+            mNonPendingState = null;
+        }
+
+        mState = state;
+        if (streamState == null) {
+            streamState = internalStateToStreamState(mState);
+        }
+        mStreamState.setState(streamState);
+    }
+
+    /**
+     * Updates the non-pending state while in a pending state.
+     *
+     * <p>If called from a non-pending state, an assertion error will be thrown.
+     */
+    @GuardedBy("mLock")
+    private void updateNonPendingState(@NonNull State state) {
+        if (!PENDING_STATES.contains(mState)) {
+            throw new AssertionError("Can only updated non-pending state from a pending state, "
+                    + "but state is " + mState);
+        }
+
+        if (!VALID_NON_PENDING_STATES_WHILE_PENDING.contains(state)) {
+            throw new AssertionError(
+                    "Invalid state transition. State is not a valid non-pending state while in a "
+                            + "pending state: " + state);
+        }
+
+        if (mNonPendingState != state) {
+            mNonPendingState = state;
+            mStreamState.setState(internalStateToStreamState(state));
+        }
+    }
+
+    /**
+     * Convenience for restoring the state to the non-pending state.
+     *
+     * <p>This is equivalent to calling setState(mNonPendingState), but performs a few safety
+     * checks. This can only be called while in a pending state.
+     */
+    @GuardedBy("mLock")
+    private void restoreNonPendingState() {
+        if (!PENDING_STATES.contains(mState)) {
+            throw new AssertionError("Cannot restore non-pending state when in state " + mState);
+        }
+
+        setState(mNonPendingState);
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -1515,6 +2156,50 @@
         mAudioState = audioState;
     }
 
+    @AutoValue
+    abstract static class RecordingRecord {
+
+        static RecordingRecord from(@NonNull PendingRecording pendingRecording, long recordingId) {
+            return new AutoValue_Recorder_RecordingRecord(
+                    pendingRecording.getOutputOptions(),
+                    pendingRecording.getCallbackExecutor(),
+                    pendingRecording.getEventListener(),
+                    pendingRecording.isAudioEnabled(),
+                    recordingId
+            );
+        }
+
+        @NonNull
+        abstract OutputOptions getOutputOptions();
+
+        @Nullable
+        abstract Executor getCallbackExecutor();
+
+        @Nullable
+        abstract Consumer<VideoRecordEvent> getEventListener();
+
+        abstract boolean hasAudioEnabled();
+
+        abstract long getRecordingId();
+
+        /**
+         * Updates the recording status and callback to users.
+         */
+        void updateVideoRecordEvent(@NonNull VideoRecordEvent event) {
+            Preconditions.checkState(Objects.equals(event.getOutputOptions(), getOutputOptions()),
+                    "Attempted to update event listener with event from incorrect recording "
+                            + "[Recording: " + event.getOutputOptions() + ", Expected: "
+                            + getOutputOptions() + "]");
+            if (getCallbackExecutor() != null && getEventListener() != null) {
+                try {
+                    getCallbackExecutor().execute(() -> getEventListener().accept(event));
+                } catch (RejectedExecutionException e) {
+                    Logger.e(TAG, "The callback executor is invalid.", e);
+                }
+            }
+        }
+    }
+
     /**
      * Builder class for {@link Recorder} objects.
      */
@@ -1558,7 +2243,8 @@
          * depending on the resolutions supported by the camera and codec capabilities.
          *
          * <p>If no quality selector is provided, the default is
-         * {@link #DEFAULT_QUALITY_SELECTOR}.
+         * {@link Recorder#DEFAULT_QUALITY_SELECTOR}.
+         *
          * @see QualitySelector
          */
         @NonNull
@@ -1587,7 +2273,8 @@
          * before starting the recording.
          *
          * @param source The audio source to use. One of {@link AudioSpec#SOURCE_AUTO} or
-         * {@link AudioSpec#SOURCE_CAMCORDER}. Default is {@link AudioSpec#SOURCE_AUTO}.
+         *               {@link AudioSpec#SOURCE_CAMCORDER}. Default is
+         *               {@link AudioSpec#SOURCE_AUTO}.
          */
         @NonNull
         Builder setAudioSource(@AudioSpec.Source int source) {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java b/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
index 9bc8a82..997c57a 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
@@ -16,16 +16,12 @@
 
 package androidx.camera.video;
 
-import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
 import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 
 import com.google.auto.value.AutoValue;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 import java.util.concurrent.Executor;
 
 /**
@@ -41,48 +37,15 @@
 @AutoValue
 public abstract class RecordingStats {
 
-    /**
-     * The recording is being recorded with audio data.
-     *
-     * <p>When audio is recording, the resulting video file will contain an audio track.
-     */
-    public static final int AUDIO_RECORDING = 0;
-    /**
-     * The recording is disabled.
-     *
-     * <p>This audio state results from a {@link PendingRecording} that was
-     * {@linkplain PendingRecording#start() started} without calling
-     * {@link PendingRecording#withAudioEnabled()}.
-     */
-    public static final int AUDIO_DISABLED = 1;
-    /**
-     * The recording is muted because the audio source is silenced by the system.
-     *
-     * <p>If the audio source is occupied by privilege application, depending on the system
-     * version, the system may silence the application that are using the audio source.
-     */
-    public static final int AUDIO_SOURCE_SILENCED = 2;
-    /**
-     * The recording is muted because the audio encoder encountered errors.
-     */
-    public static final int AUDIO_ENCODER_ERROR = 3;
-
-    /** @hide */
-    @IntDef({AUDIO_RECORDING, AUDIO_DISABLED, AUDIO_SOURCE_SILENCED, AUDIO_ENCODER_ERROR})
-    @Retention(RetentionPolicy.SOURCE)
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public @interface AudioState {
-    }
-
     // Restrict the constructor scope.
     RecordingStats() {
     }
 
     @NonNull
-    static RecordingStats of(long duration, long bytes, @AudioState int audioState) {
+    static RecordingStats of(long duration, long bytes, @NonNull AudioStats audioStats) {
         Preconditions.checkArgument(duration >= 0, "duration must be positive value.");
         Preconditions.checkArgument(bytes >= 0, "bytes must be positive value.");
-        return new AutoValue_RecordingStats(duration, bytes, audioState);
+        return new AutoValue_RecordingStats(duration, bytes, audioStats);
     }
 
     /**
@@ -105,15 +68,8 @@
     public abstract long getNumBytesRecorded();
 
     /**
-     * Returns the state of audio in the recording.
-     *
-     * <p>The audio state describes whether audio is enabled for the recording and if audio is
-     * currently recording or is silenced due to system priority or errors.
-     *
-     * @return The state of the audio at the time of these recording stats being generated. One of
-     * {@link #AUDIO_RECORDING}, {@link #AUDIO_DISABLED}, {@link #AUDIO_SOURCE_SILENCED}, or
-     * {@link #AUDIO_ENCODER_ERROR}.
+     * Returns the {@link AudioStats} that is associated with this recording stats.
      */
-    @AudioState
-    public abstract int getAudioState();
+    @NonNull
+    public abstract AudioStats getAudioStats();
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java
new file mode 100644
index 0000000..d94cc1c
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.compat.quirk;
+
+
+import android.os.Build;
+
+import androidx.camera.core.impl.Quirk;
+import androidx.camera.video.internal.workaround.CorrectVideoTimeByTimebase;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Quirk that denotes some Samsung devices use inconsistent timebase for camera frame.
+ *
+ * <p>See b/197805856 for more detail.
+ *
+ * @see CorrectVideoTimeByTimebase
+ */
+public class CameraUseInconsistentTimebaseQuirk implements Quirk {
+    private static final Set<String> BUILD_HARDWARE_SET = new HashSet<>(Arrays.asList(
+            "samsungexynos7570",
+            "samsungexynos7870"
+    ));
+
+    static boolean load() {
+        return "SAMSUNG".equalsIgnoreCase(Build.BRAND)
+                && BUILD_HARDWARE_SET.contains(Build.HARDWARE.toLowerCase());
+    }
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
index d3e1864..aa16934 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
@@ -48,6 +48,9 @@
         if (DeactivateEncoderSurfaceBeforeStopEncoderQuirk.load()) {
             quirks.add(new DeactivateEncoderSurfaceBeforeStopEncoderQuirk());
         }
+        if (CameraUseInconsistentTimebaseQuirk.load()) {
+            quirks.add(new CameraUseInconsistentTimebaseQuirk());
+        }
 
         return quirks;
     }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java
index 2e6bb2c..c8d2238 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java
@@ -45,6 +45,9 @@
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.video.internal.DebugUtils;
+import androidx.camera.video.internal.compat.quirk.CameraUseInconsistentTimebaseQuirk;
+import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.video.internal.workaround.CorrectVideoTimeByTimebase;
 import androidx.camera.video.internal.workaround.EncoderFinder;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
@@ -762,6 +765,8 @@
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     class MediaCodecCallback extends MediaCodec.Callback {
+        @Nullable
+        private final CorrectVideoTimeByTimebase mCorrectVideoTimestamp;
 
         private boolean mHasSendStartCallback = false;
         private boolean mHasFirstData = false;
@@ -775,6 +780,15 @@
         private long mLastSentPresentationTimeUs = 0L;
         private boolean mIsOutputBufferInPauseState = false;
 
+        MediaCodecCallback() {
+            if (mIsVideoEncoder
+                    && DeviceQuirks.get(CameraUseInconsistentTimebaseQuirk.class) != null) {
+                mCorrectVideoTimestamp = new CorrectVideoTimeByTimebase();
+            } else {
+                mCorrectVideoTimestamp = null;
+            }
+        }
+
         @Override
         public void onInputBufferAvailable(MediaCodec mediaCodec, int index) {
             mEncoderExecutor.execute(() -> {
@@ -821,6 +835,10 @@
                             Logger.d(mTag, DebugUtils.readableBufferInfo(bufferInfo));
                         }
 
+                        if (mCorrectVideoTimestamp != null) {
+                            mCorrectVideoTimestamp.correctTimestamp(bufferInfo);
+                        }
+
                         // Handle start of stream
                         if (!mHasSendStartCallback) {
                             mHasSendStartCallback = true;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java
new file mode 100644
index 0000000..600506e
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.workaround;
+
+import android.media.MediaCodec;
+import android.os.SystemClock;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.core.Logger;
+import androidx.camera.video.internal.compat.quirk.CameraUseInconsistentTimebaseQuirk;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Corrects the video timestamps if video buffer contains REALTIME timestamp.
+ *
+ * <p>As described on b/197805856, some Samsung devices use inconsistent timebase for camera
+ * frame. The workaround detects and corrects the timestamp by generating a new timestamp.
+ * Note: this will sacrifice the precise timestamp of video buffer.
+ *
+ * @see CameraUseInconsistentTimebaseQuirk
+ */
+public class CorrectVideoTimeByTimebase {
+    private static final String TAG = "CorrectVideoTimeByTimebase";
+
+    @Nullable
+    private AtomicBoolean mNeedToCorrectVideoTimebase = null;
+
+    /**
+     * Corrects the video timestamp if necessary.
+     *
+     * <p>This method will modify the {@link MediaCodec.BufferInfo#presentationTimeUs} if necessary.
+     *
+     * @param bufferInfo the buffer info.
+     */
+    public void correctTimestamp(@NonNull MediaCodec.BufferInfo bufferInfo) {
+        // For performance concern, only check the requirement once.
+        if (mNeedToCorrectVideoTimebase == null) {
+            // Skip invalid buffer
+            if (bufferInfo.size <= 0 || bufferInfo.presentationTimeUs <= 0L
+                    || (bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
+                return;
+            }
+
+            long uptimeUs = TimeUnit.MILLISECONDS.toMicros(SystemClock.uptimeMillis());
+            long realtimeUs = TimeUnit.MILLISECONDS.toMicros(SystemClock.elapsedRealtime());
+            // Expected to be uptime
+            boolean closeToRealTime = Math.abs(bufferInfo.presentationTimeUs - realtimeUs)
+                    < Math.abs(bufferInfo.presentationTimeUs - uptimeUs);
+            if (closeToRealTime) {
+                Logger.w(TAG, "Detected video buffer timestamp is close to real time.");
+            }
+            mNeedToCorrectVideoTimebase = new AtomicBoolean(closeToRealTime);
+        }
+
+        if (mNeedToCorrectVideoTimebase.get()) {
+            bufferInfo.presentationTimeUs -= TimeUnit.MILLISECONDS.toMicros(
+                    SystemClock.elapsedRealtime() - SystemClock.uptimeMillis());
+        }
+    }
+}
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/FileDescriptorOutputOptionsTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/FileDescriptorOutputOptionsTest.kt
new file mode 100644
index 0000000..0c4c56b
--- /dev/null
+++ b/camera/camera-video/src/test/java/androidx/camera/video/FileDescriptorOutputOptionsTest.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video
+
+import android.os.Build
+import android.os.ParcelFileDescriptor
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class FileDescriptorOutputOptionsTest {
+
+    @Test
+    fun equals_reflexive() {
+        val parcelFileDescriptor = mock(ParcelFileDescriptor::class.java)
+        val options = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+
+        assertThat(options == options).isTrue()
+    }
+
+    @Test
+    fun equals_symmetric() {
+        val parcelFileDescriptor = mock(ParcelFileDescriptor::class.java)
+        val options1 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+        val options2 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+
+        assertThat(options1 == options2 && options2 == options1).isTrue()
+    }
+
+    @Test
+    fun equals_transitive() {
+        val parcelFileDescriptor = mock(ParcelFileDescriptor::class.java)
+        val options1 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+        val options2 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+        val options3 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+
+        assertThat(options1 == options2 && options2 == options3 && options3 == options1).isTrue()
+    }
+
+    @Test
+    fun equals_consistent() {
+        val parcelFileDescriptor = mock(ParcelFileDescriptor::class.java)
+        val options1 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+        val options2 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+        val options3 = FileDescriptorOutputOptions.Builder(parcelFileDescriptor)
+            .setFileSizeLimit(100)
+            .build()
+
+        assertThat(options1 == options2 && options1 == options2).isTrue()
+        assertThat(options1 != options3 && options1 != options3).isTrue()
+    }
+
+    @Test
+    fun equals_nullCheck() {
+        val parcelFileDescriptor = mock(ParcelFileDescriptor::class.java)
+        val options = FileDescriptorOutputOptions.Builder(parcelFileDescriptor).build()
+
+        assertThat(options.equals(null)).isFalse()
+    }
+}
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt
new file mode 100644
index 0000000..a7940f6
--- /dev/null
+++ b/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import java.io.File
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class FileOutputOptionsTest {
+
+    @Test
+    fun equals_reflexive() {
+        val file = File("/fake/path")
+        val options = FileOutputOptions.Builder(file).build()
+
+        assertThat(options == options).isTrue()
+    }
+
+    @Test
+    fun equals_symmetric() {
+        val file = File("/fake/path")
+        val options1 = FileOutputOptions.Builder(file).build()
+        val options2 = FileOutputOptions.Builder(file).build()
+
+        assertThat(options1 == options2 && options2 == options1).isTrue()
+    }
+
+    @Test
+    fun equals_transitive() {
+        val file = File("/fake/path")
+        val options1 = FileOutputOptions.Builder(file).build()
+        val options2 = FileOutputOptions.Builder(file).build()
+        val options3 = FileOutputOptions.Builder(file).build()
+
+        assertThat(options1 == options2 && options2 == options3 && options3 == options1).isTrue()
+    }
+
+    @Test
+    fun equals_consistent() {
+        val file = File("/fake/path")
+        val options1 = FileOutputOptions.Builder(file).build()
+        val options2 = FileOutputOptions.Builder(file).build()
+        val options3 = FileOutputOptions.Builder(file).setFileSizeLimit(100).build()
+
+        assertThat(options1 == options2 && options1 == options2).isTrue()
+        assertThat(options1 != options3 && options1 != options3).isTrue()
+    }
+
+    @Test
+    fun equals_nullCheck() {
+        val file = File("/fake/path")
+        val options = FileOutputOptions.Builder(file).build()
+
+        assertThat(options.equals(null)).isFalse()
+    }
+}
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/MediaStoreOutputOptionsTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/MediaStoreOutputOptionsTest.kt
new file mode 100644
index 0000000..2190ec8
--- /dev/null
+++ b/camera/camera-video/src/test/java/androidx/camera/video/MediaStoreOutputOptionsTest.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video
+
+import android.content.Context
+import android.net.Uri
+import android.os.Build
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class MediaStoreOutputOptionsTest {
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+
+    @Test
+    fun equals_reflexive() {
+        val options = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+
+        assertThat(options == options).isTrue()
+    }
+
+    @Test
+    fun equals_symmetric() {
+        val options1 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+        val options2 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+
+        assertThat(options1 == options2 && options2 == options1).isTrue()
+    }
+
+    @Test
+    fun equals_transitive() {
+        val options1 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+        val options2 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+        val options3 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+
+        assertThat(options1 == options2 && options2 == options3 && options3 == options1).isTrue()
+    }
+
+    @Test
+    fun equals_consistent() {
+        val options1 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+        val options2 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+        val options3 = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY)
+            .setFileSizeLimit(100)
+            .build()
+
+        assertThat(options1 == options2 && options1 == options2).isTrue()
+        assertThat(options1 != options3 && options1 != options3).isTrue()
+    }
+
+    @Test
+    fun equals_nullCheck() {
+        val options = MediaStoreOutputOptions.Builder(context.contentResolver, Uri.EMPTY).build()
+
+        assertThat(options.equals(null)).isFalse()
+    }
+}
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
index 8d5578c..71c4d17 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
@@ -30,9 +30,9 @@
 import java.io.File
 
 private const val INVALID_FILE_PATH = "/invalid/file/path"
-private val TEST_OUTPUT_OPTION =
-    FileOutputOptions.builder().setFile(File(INVALID_FILE_PATH)).build()
-private val TEST_RECORDING_STATE = RecordingStats.of(0, 0, RecordingStats.AUDIO_RECORDING)
+private val TEST_OUTPUT_OPTION = FileOutputOptions.Builder(File(INVALID_FILE_PATH)).build()
+private val TEST_RECORDING_STATE =
+    RecordingStats.of(0, 0, AudioStats.of(AudioStats.AUDIO_STATE_ACTIVE, null))
 private val TEST_OUTPUT_RESULT = OutputResults.of(Uri.EMPTY)
 
 @RunWith(RobolectricTestRunner::class)
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index d69c8f8..25d0175 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -546,9 +546,8 @@
         contentValues.put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName);
         contentValues.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
         contentValues.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
-        return MediaStoreOutputOptions.builder()
-                .setContentResolver(getContentResolver())
-                .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
+        return new MediaStoreOutputOptions.Builder(getContentResolver(),
+                MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
                 .setContentValues(contentValues)
                 .build();
     }
@@ -560,7 +559,7 @@
                 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES),
                 videoFileName + ".mp4");
         Log.d(TAG, "VideoOutputFileOptions file: " + videoFile.getAbsolutePath());
-        return FileOutputOptions.builder().setFile(videoFile).build();
+        return new FileOutputOptions.Builder(videoFile).build();
     }
 
     @NonNull
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/ArrivedDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/ArrivedDemoScreen.java
index f746e76..a6fb772 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/ArrivedDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/ArrivedDemoScreen.java
@@ -16,10 +16,6 @@
 
 package androidx.car.app.sample.showcase.common.navigation.routing;
 
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-
 import androidx.annotation.NonNull;
 import androidx.car.app.CarContext;
 import androidx.car.app.Screen;
@@ -41,15 +37,15 @@
     @NonNull
     @Override
     public Template onGetTemplate() {
-        Resources resources = getCarContext().getResources();
-        Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.test_image_square);
-
         return new NavigationTemplate.Builder()
                 .setNavigationInfo(
                         new MessageInfo.Builder("Arrived!")
                                 .setText("Google Bellevue Office\n1120 112th Ave NE")
                                 .setImage(
-                                        new CarIcon.Builder(IconCompat.createWithBitmap(bitmap))
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithResource(
+                                                        getCarContext(),
+                                                        R.drawable.ic_local_gas_station_white_48dp))
                                                 .build())
                                 .build())
                 .setActionStrip(RoutingDemoModels.getActionStrip(getCarContext(), this::finish))
diff --git a/collection/collection-benchmark-js/.gitignore b/collection/collection-benchmark-js/.gitignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/collection/collection-benchmark-js/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/collection/collection-benchmark-js/README.md b/collection/collection-benchmark-js/README.md
new file mode 100644
index 0000000..aacc699
--- /dev/null
+++ b/collection/collection-benchmark-js/README.md
@@ -0,0 +1,22 @@
+# AndroidX Collection Benchmarks for Kotlin/JS
+
+This directory builds a set of AndroidX Collection benchmarks for Kotlin/JS.
+
+This project depends on node.js. Run this one-time setup task first:
+
+    ./gradlew :collection:collection-benchmark-js:setupJsBenchmark
+
+To run the benchmarks:
+
+    ./gradlew :collection:collection-benchmark-js:runJsBenchmark
+
+The output will look something like this:
+
+```
+circularArray_addFromHeadAndPopFromTail x 2,256 ops/sec ±1.96% (88 runs sampled)
+circularArray_addFromTailAndPopFromHead x 2,355 ops/sec ±1.04% (93 runs sampled)
+lruCache_allHits x 65.37 ops/sec ±0.75% (68 runs sampled)
+lruCache_allMisses x 402 ops/sec ±0.79% (88 runs sampled)
+lruCache_customCreate x 52,805 ops/sec ±0.74% (89 runs sampled)
+benchmark suite completed
+```
diff --git a/collection/collection-benchmark-js/build.gradle b/collection/collection-benchmark-js/build.gradle
new file mode 100644
index 0000000..1822f31
--- /dev/null
+++ b/collection/collection-benchmark-js/build.gradle
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2021 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.
+ */
+
+def githubBuild = project.properties['androidx.github.build'] ?: false
+if (githubBuild) {
+    task setupJsBenchmark(type: Exec) {
+        inputs.file("package.json")
+        inputs.file("package-lock.json")
+
+        commandLine 'npm', 'install'
+
+        outputs.dir("node_modules")
+    }
+
+    task linkCollectionPackage(type: Exec) {
+        def compileTaskName = ':collection:collection2:compileKotlinJs'
+        dependsOn compileTaskName
+
+        // Store where the node module is located. Subject to future changes.
+        def npmPackageDir = ''
+        tasks.getByPath(compileTaskName).outputs.files.each {
+            def matcher = it.toString() =~ /(.+)\/kotlin$/
+            if (matcher) {
+                npmPackageDir = matcher.group(1)
+            }
+        }
+
+        outputs.dir(npmPackageDir)
+
+        // Symlink the built module to the working dir's node_modules/. This enables
+        // our benchmark code to use Collection KMP.
+        commandLine 'npm', 'link', npmPackageDir
+    }
+
+    task runJsBenchmark(type: Exec) {
+        dependsOn linkCollectionPackage
+        commandLine 'node', 'src/js/main.js'
+    }
+}
diff --git a/collection/collection-benchmark-js/package-lock.json b/collection/collection-benchmark-js/package-lock.json
new file mode 100644
index 0000000..6ae27ff
--- /dev/null
+++ b/collection/collection-benchmark-js/package-lock.json
@@ -0,0 +1,52 @@
+{
+  "name": "collection-benchmark-js",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "benchmark": "2.1.4"
+      }
+    },
+    "node_modules/benchmark": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
+      "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
+      "dependencies": {
+        "lodash": "^4.17.4",
+        "platform": "^1.3.3"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/platform": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
+      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
+    }
+  },
+  "dependencies": {
+    "benchmark": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
+      "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
+      "requires": {
+        "lodash": "^4.17.4",
+        "platform": "^1.3.3"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "platform": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
+      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
+    }
+  }
+}
diff --git a/collection/collection-benchmark-js/package.json b/collection/collection-benchmark-js/package.json
new file mode 100644
index 0000000..026e4e6
--- /dev/null
+++ b/collection/collection-benchmark-js/package.json
@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "benchmark": "2.1.4"
+  }
+}
diff --git a/collection/collection-benchmark-js/src/js/main.js b/collection/collection-benchmark-js/src/js/main.js
new file mode 100644
index 0000000..105447b
--- /dev/null
+++ b/collection/collection-benchmark-js/src/js/main.js
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2021 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.
+ */
+
+let Benchmark = require('benchmark');
+let suite = new Benchmark.Suite();
+
+let Collection = require('androidx-collection2')
+    .androidx.collection;
+
+let SourceValues = [];
+for (let i = 0; i < 10000; i++) {
+    SourceValues.push(`value ${i}`);
+}
+
+console.log('benchmark suite started');
+
+suite.add('circularArray_addFromHeadAndPopFromTail', function() {
+    let circularArray = new Collection.CircularArray();
+
+    console.assert(circularArray.isEmpty());
+    for (let value in SourceValues) {
+        circularArray.addFirst(value);
+    }
+    console.assert(!circularArray.isEmpty());
+    console.assert(circularArray.size == SourceValues.length);
+
+    var numPopped = 0;
+    let numElements = SourceValues.length;
+
+    while (!circularArray.isEmpty()) {
+        circularArray.popLast();
+        numPopped++;
+    }
+    console.assert(numPopped === numElements);
+})
+.add('circularArray_addFromTailAndPopFromHead', function() {
+    let circularArray = new Collection.CircularArray();
+
+    console.assert(circularArray.isEmpty());
+    for (let value in SourceValues) {
+        circularArray.addLast(value);
+    }
+    console.assert(!circularArray.isEmpty());
+    console.assert(circularArray.size == SourceValues.length);
+
+    var numPopped = 0;
+    let numElements = SourceValues.length;
+
+    while (!circularArray.isEmpty()) {
+        circularArray.popFirst();
+        numPopped++;
+    }
+    console.assert(numPopped === numElements);
+})
+.add('lruCache_allHits', function() {
+    let cache = Collection.LruCache$int(SourceValues.length);
+    for (let key in SourceValues) {
+        cache.put(key, key);
+    }
+    for (let key in SourceValues) {
+        let value = cache.get(key);
+        console.assert(value === key);
+    }
+    console.assert(cache.hitCount() == SourceValues.length);
+    console.assert(cache.missCount() == 0);
+})
+.add('lruCache_allMisses', function() {
+    let cache = Collection.LruCache$int(SourceValues.length);
+    for (let key in SourceValues) {
+        let value = cache.get(key);
+        console.assert(value === null);
+    }
+    console.assert(cache.hitCount() == 0);
+    console.assert(cache.missCount() == SourceValues.length);
+})
+.add('lruCache_customCreate', function() {
+    let cache = Collection.LruCache$int(2);
+    cache.create = function(key) { return `value_${key}`; };
+
+    cache.put('foo', '1');
+    cache.put('bar', '1');
+    let value = cache.get('baz');
+    console.assert(value == 'value_baz');
+    console.assert(cache.size == 2);
+    console.assert(cache.hitCount() == 0);
+    console.assert(cache.missCount() == 1);
+
+    let value2 = cache.get('baz');
+    console.assert(value2 == 'value_baz');
+    console.assert(cache.hitCount() == 1);
+    console.assert(cache.missCount() == 1);
+})
+.on('cycle', function(event) {
+  console.log(String(event.target));
+})
+.on('complete', function() {
+  console.log('benchmark suite completed');
+})
+.run({ 'async': false });
diff --git a/collection/collection-benchmark-native/README.md b/collection/collection-benchmark-native/README.md
new file mode 100644
index 0000000..98e16f7
--- /dev/null
+++ b/collection/collection-benchmark-native/README.md
@@ -0,0 +1,34 @@
+# AndroidX Collection Benchmarks for Native Platforms
+
+This directory builds a set of benchmarks for AndroidX Collection on native
+platforms. Currently only macOS (x86_64) is supported.
+
+To build, run in the collection project root:
+
+    ./gradlew :collection:collection-benchmark-native:assemble
+
+Then execute the resulting binary at:
+
+    ../out/collection-playground/collection-playground/collection/collection-benchmark-native/build/install/main/debug/collection-benchmark-native
+
+The output will look something like this:
+
+```
+Running ../out/collection-playground/collection-playground/collection/collection-benchmark-native/build/install/main/debug/lib/collection-benchmark-native
+Run on (12 X 2900 MHz CPU s)
+CPU Caches:
+  L1 Data 32 KiB (x6)
+  L1 Instruction 32 KiB (x6)
+  L2 Unified 256 KiB (x6)
+  L3 Unified 12288 KiB (x1)
+Load Average: 2.21, 2.43, 2.23
+--------------------------------------------------------------------------------------------------------
+Benchmark                                                              Time             CPU   Iterations
+--------------------------------------------------------------------------------------------------------
+BM_CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP        4599997 ns      4590038 ns          158
+BM_SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP 1635764920 ns   1628431000 ns            1
+```
+
+This project assumes you have
+[Google Benchmark](https://github.com/google/benchmark) installed. It also
+assumes you have installed Xcode.
diff --git a/collection/collection-benchmark-native/build.gradle b/collection/collection-benchmark-native/build.gradle
new file mode 100644
index 0000000..c06255f
--- /dev/null
+++ b/collection/collection-benchmark-native/build.gradle
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 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.
+ */
+
+plugins {}
+
+def githubBuild = project.properties['androidx.github.build'] ?: false
+if (githubBuild) {
+    apply plugin: "cpp-application"
+
+    def COLLECTION_KMP_FRAMEWORK_NAME = 'CollectionKMP'
+    def FRAMEWORK_TASK = ':collection:collection2:linkReleaseFrameworkMacosX64'
+
+    tasks.withType(CppCompile) {
+        def frameworkPath = tasks.getByPath(FRAMEWORK_TASK).outputs.files.singleFile.toString()
+
+        // Add *.m and *.mm files to the source set, since by default the C++ plug-in doesn't do
+        // that.
+        def sourceFiles = files("src/main/objc/").asFileTree.matching { include("**/*.m?") }
+        inputs.files(sourceFiles)
+        source.from(sourceFiles)
+
+        compilerArgs.addAll '-x', 'objective-c++', '-F', frameworkPath
+    }
+
+    tasks.withType(LinkExecutable) {
+        def frameworkTask = tasks.getByPath(FRAMEWORK_TASK)
+        dependsOn(frameworkTask)
+
+        def frameworkPath = frameworkTask.outputs.files.singleFile.toString()
+        linkerArgs.addAll '-framework', 'Foundation',
+                '-l', 'benchmark',
+                '-framework', COLLECTION_KMP_FRAMEWORK_NAME,
+                '-F', frameworkPath,
+                '-rpath', frameworkPath
+    }
+}
diff --git a/collection/collection-benchmark-native/src/main/objc/main.mm b/collection/collection-benchmark-native/src/main/objc/main.mm
new file mode 100644
index 0000000..f9053d5
--- /dev/null
+++ b/collection/collection-benchmark-native/src/main/objc/main.mm
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2021 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.
+ */
+
+#import <CollectionKMP/CollectionKMP.h>
+#import <Foundation/Foundation.h>
+#import <benchmark/benchmark.h>
+
+static NSArray *GenerateOrderedStrings(int size) {
+  NSMutableArray *array = [NSMutableArray array];
+  for (int i = 0; i < size; i++) {
+    [array addObject:[NSString stringWithFormat:@"value %d", i]];
+  }
+  return array;
+}
+
+static NSDictionary *GenerateSourceMap(int size) {
+  NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+  for (int i = 0; i < size; i++) {
+    [dict setObject:[NSString stringWithFormat:@"value %d", i]
+             forKey:[NSString stringWithFormat:@"key %d", i]];
+  }
+  return dict;
+}
+
+const int CircularArray_sourceSetSize = 10000;
+const int SimpleArrayMap_sourceMapSize = 10000;
+
+static void CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP(NSArray *source) {
+  @autoreleasepool {
+    CKMPCircularArray *array = [[CKMPCircularArray alloc] initWithMinCapacity:8];
+    for (id element in source) {
+      [array addFirstE:element];
+    }
+    NSCAssert([array size] == [source count], @"");
+    for (NSInteger i = 0, s = [source count]; i < s; i++) {
+      [array popLast];
+    }
+    NSCAssert([array isEmpty], @"");
+  }
+}
+
+static void BM_CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP(benchmark::State &state) {
+  NSArray *source = GenerateOrderedStrings(CircularArray_sourceSetSize);
+  for (auto _ : state) {
+    CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP(source);
+  }
+}
+BENCHMARK(BM_CircularArray_addFromHeadAndPopFromTail_ObjCCallingKMP);
+
+static void SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP(NSDictionary *source) {
+  @autoreleasepool {
+    CKMPSimpleArrayMap<NSString *, NSString *> *map =
+        [[CKMPSimpleArrayMap alloc] initWithCapacity:(int)[source count]];
+    for (id key in source) {
+      [map putKey:key value:[source objectForKey:key]];
+    }
+    NSCAssert([map size] == [source count], @"");
+    for (id key in source) {
+      [map removeKey:key];
+    }
+    NSCAssert([map isEmpty], @"");
+  }
+}
+
+static void BM_SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP(benchmark::State &state) {
+  NSDictionary *source = GenerateSourceMap(SimpleArrayMap_sourceMapSize);
+  for (auto _ : state) {
+    SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP(source);
+  }
+}
+BENCHMARK(BM_SimpleArrayMap_addAllThenRemoveIndividually_ObjCCallingKMP);
+
+int main(int argc, char **argv) {
+  @autoreleasepool {
+    ::benchmark::Initialize(&argc, argv);
+    if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1;
+    ::benchmark::RunSpecifiedBenchmarks();
+  }
+}
diff --git a/collection/gradlew.bat b/collection/gradlew.bat
new file mode 120000
index 0000000..b20877e
--- /dev/null
+++ b/collection/gradlew.bat
@@ -0,0 +1 @@
+../playground-common/gradlew.bat
\ No newline at end of file
diff --git a/collection2/collection2/build.gradle b/collection2/collection2/build.gradle
index 88b68de..3e55350 100644
--- a/collection2/collection2/build.gradle
+++ b/collection2/collection2/build.gradle
@@ -40,15 +40,14 @@
 
 def githubBuild = project.properties['androidx.github.build'] ?: false
 
-kotlin {
+def enableMac = project.properties['androidx.kmp.mac.enabled'] ?: githubBuild
 
+kotlin {
     jvm {
         withJava()
     }
-    if (githubBuild) {
-        js {
-            nodejs()
-        }
+
+    if (enableMac) {
         macosX64 {
             binaries {
                 framework {
@@ -56,10 +55,15 @@
                 }
             }
         }
+    }
+
+    if (githubBuild) {
+        js {
+            nodejs()
+        }
 
         linuxX64()
         mingwX64()
-        macosX64()
         iosX64()
         iosArm64()
         iosArm32()
@@ -84,20 +88,39 @@
             }
         }
 
-        if (githubBuild) {
+        if (githubBuild || enableMac) {
             nonJvmMain {
                 // Used for JS and all native targets.
                 dependencies {
                     api(libs.atomicFu)
                 }
             }
+        }
 
-            configure([macosX64Main, linuxX64Main, mingwX64Main, iosX64Main, iosArm32Main, iosArm64Main]) {
+        if (enableMac) {
+            configure([macosX64Main]) {
                 dependsOn nonJvmMain
             }
+        }
 
+        if (githubBuild) {
+            configure([linuxX64Main, mingwX64Main, iosX64Main, iosArm32Main, iosArm64Main]) {
+                dependsOn nonJvmMain
+            }
+        }
+
+        if (githubBuild || enableMac) {
             nativeTest // Used for all native targets.
-            configure([macosX64Test, linuxX64Test, mingwX64Test, iosX64Test, iosArm32Test, iosArm64Test]) {
+        }
+
+        if (enableMac) {
+            configure([macosX64Test]) {
+                dependsOn nativeTest
+            }
+        }
+
+        if (githubBuild) {
+            configure([linuxX64Test, mingwX64Test, iosX64Test, iosArm32Test, iosArm64Test]) {
                 dependsOn nativeTest
             }
         }
@@ -130,9 +153,9 @@
     }
 }
 
-if (githubBuild) {
+if (githubBuild || enableMac) {
    // Workaround for https://youtrack.jetbrains.com/issue/KT-31603
-   sourceSets.test.java.srcDir('../collection/src/test/java')
+   sourceSets.test.java.srcDir('../../collection/collection/src/test/java')
 }
 
 androidx {
@@ -157,7 +180,6 @@
 dependencies {
     jvmApiBaseline('androidx.collection:collection:1.1.0') {
         transitive = false
-        force = true
     }
 }
 
diff --git a/compose/animation/animation-core/api/1.0.0-beta02.txt b/compose/animation/animation-core/api/1.0.0-beta02.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta02.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta02.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta03.txt b/compose/animation/animation-core/api/1.0.0-beta03.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta03.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta03.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta04.txt b/compose/animation/animation-core/api/1.0.0-beta04.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta04.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta04.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta05.txt b/compose/animation/animation-core/api/1.0.0-beta05.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta05.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta05.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta06.txt b/compose/animation/animation-core/api/1.0.0-beta06.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta06.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta06.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta07.txt b/compose/animation/animation-core/api/1.0.0-beta07.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta07.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta07.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta08.txt b/compose/animation/animation-core/api/1.0.0-beta08.txt
index 4fc8d81..537da00 100644
--- a/compose/animation/animation-core/api/1.0.0-beta08.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta08.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta09.txt b/compose/animation/animation-core/api/1.0.0-beta09.txt
index d5e04ff..a7d8552 100644
--- a/compose/animation/animation-core/api/1.0.0-beta09.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta09.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/1.0.0-beta10.txt b/compose/animation/animation-core/api/1.0.0-beta10.txt
index d5e04ff..a7d8552 100644
--- a/compose/animation/animation-core/api/1.0.0-beta10.txt
+++ b/compose/animation/animation-core/api/1.0.0-beta10.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/current.txt b/compose/animation/animation-core/api/current.txt
index 28694e4..07dd416 100644
--- a/compose/animation/animation-core/api/current.txt
+++ b/compose/animation/animation-core/api/current.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -379,8 +355,10 @@
     ctor public MutableTransitionState(S? initialState);
     method public S! getCurrentState();
     method public S! getTargetState();
+    method public boolean isIdle();
     method public void setTargetState(S! targetState);
     property public final S! currentState;
+    property public final boolean isIdle;
     property public final S! targetState;
   }
 
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta02.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta02.txt
index dcaa6a1..0e2028b 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta02.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta02.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta03.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta03.txt
index dcaa6a1..0e2028b 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta03.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta03.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta04.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta04.txt
index dcaa6a1..0e2028b 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta04.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta04.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta05.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta05.txt
index dcaa6a1..0e2028b 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta05.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta05.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta06.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta06.txt
index dcaa6a1..0e2028b 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta06.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta06.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta07.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta07.txt
index cad783a..fcfabb6 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta07.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta07.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta08.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta08.txt
index cad783a..fcfabb6 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta08.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta09.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta09.txt
index 4c779be..3a7804d 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta09.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta09.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta10.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta10.txt
index 4c779be..3a7804d 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta10.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta10.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/public_plus_experimental_current.txt b/compose/animation/animation-core/api/public_plus_experimental_current.txt
index 900214f..86f2996 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_current.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -385,10 +361,10 @@
     ctor public MutableTransitionState(S? initialState);
     method public S! getCurrentState();
     method public S! getTargetState();
-    method @androidx.compose.animation.core.ExperimentalTransitionApi public boolean isIdle();
+    method public boolean isIdle();
     method public void setTargetState(S! targetState);
     property public final S! currentState;
-    property @androidx.compose.animation.core.ExperimentalTransitionApi public final boolean isIdle;
+    property public final boolean isIdle;
     property public final S! targetState;
   }
 
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta02.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta02.txt
index 73d1aba..176c186 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta02.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta02.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta03.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta03.txt
index 73d1aba..176c186 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta03.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta03.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta04.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta04.txt
index 73d1aba..176c186 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta04.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta04.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta05.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta05.txt
index 73d1aba..176c186 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta05.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta05.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt
index 73d1aba..176c186 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta07.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta07.txt
index fc466ec..f45cf36 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta07.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta07.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta08.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta08.txt
index fc466ec..f45cf36 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta08.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta08.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta09.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta09.txt
index 5c9da06..d1d0dee 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta09.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta09.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta10.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta10.txt
index 5c9da06..d1d0dee 100644
--- a/compose/animation/animation-core/api/restricted_1.0.0-beta10.txt
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta10.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
diff --git a/compose/animation/animation-core/api/restricted_current.txt b/compose/animation/animation-core/api/restricted_current.txt
index 694f1a1..8cdd3c0 100644
--- a/compose/animation/animation-core/api/restricted_current.txt
+++ b/compose/animation/animation-core/api/restricted_current.txt
@@ -153,41 +153,23 @@
 
   public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector1D(float initVal);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getValue();
-    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float value;
   }
 
   public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector2D(float v1, float v2);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
-    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
   }
 
   public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector3D(float v1, float v2, float v3);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
-    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -195,16 +177,10 @@
 
   public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
     ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
-    method public float get$metalava_module(int index);
-    method public int getSize$metalava_module();
     method public float getV1();
     method public float getV2();
     method public float getV3();
     method public float getV4();
-    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
-    method public void reset$metalava_module();
-    method public void set$metalava_module(int index, float value);
-    property public int size;
     property public final float v1;
     property public final float v2;
     property public final float v3;
@@ -379,8 +355,10 @@
     ctor public MutableTransitionState(S? initialState);
     method public S! getCurrentState();
     method public S! getTargetState();
+    method public boolean isIdle();
     method public void setTargetState(S! targetState);
     property public final S! currentState;
+    property public final boolean isIdle;
     property public final S! targetState;
   }
 
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
index eb8f60e..1752fd6 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
@@ -117,9 +117,6 @@
      *
      * @sample androidx.compose.animation.core.samples.TransitionStateIsIdleSample
      */
-    @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
-    @get:ExperimentalTransitionApi
-    @ExperimentalTransitionApi
     val isIdle: Boolean
         get() = (currentState == targetState) && !isRunning
 
diff --git a/compose/animation/animation/api/current.txt b/compose/animation/animation/api/current.txt
index 5d07282..efcf96a 100644
--- a/compose/animation/animation/api/current.txt
+++ b/compose/animation/animation/api/current.txt
@@ -9,6 +9,15 @@
   }
 
   public final class AnimatedVisibilityKt {
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+  }
+
+  public interface AnimatedVisibilityScope {
   }
 
   public final class AnimationModifierKt {
@@ -24,6 +33,40 @@
   }
 
   public final class EnterExitTransitionKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.EnterTransition plus(androidx.compose.animation.EnterTransition enter);
+    field public static final androidx.compose.animation.EnterTransition.Companion Companion;
+  }
+
+  public static final class EnterTransition.Companion {
+    method public androidx.compose.animation.EnterTransition getNone();
+    property public final androidx.compose.animation.EnterTransition None;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.ExitTransition plus(androidx.compose.animation.ExitTransition exit);
+    field public static final androidx.compose.animation.ExitTransition.Companion Companion;
+  }
+
+  public static final class ExitTransition.Companion {
+    method public androidx.compose.animation.ExitTransition getNone();
+    property public final androidx.compose.animation.ExitTransition None;
   }
 
   public final class FlingCalculatorKt {
diff --git a/compose/animation/animation/api/public_plus_experimental_current.txt b/compose/animation/animation/api/public_plus_experimental_current.txt
index 022f237..5c15629 100644
--- a/compose/animation/animation/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation/api/public_plus_experimental_current.txt
@@ -42,20 +42,20 @@
   }
 
   public final class AnimatedVisibilityKt {
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
     method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <T> void AnimatedVisibility(androidx.compose.animation.core.Transition<T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, androidx.compose.animation.EnterTransition enter, androidx.compose.animation.ExitTransition exit, boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
-  @androidx.compose.animation.ExperimentalAnimationApi public interface AnimatedVisibilityScope {
-    method public default androidx.compose.ui.Modifier animateEnterExit(androidx.compose.ui.Modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label);
-    method public androidx.compose.animation.core.Transition<androidx.compose.animation.EnterExitState> getTransition();
-    property public abstract androidx.compose.animation.core.Transition<androidx.compose.animation.EnterExitState> transition;
+  public interface AnimatedVisibilityScope {
+    method @androidx.compose.animation.ExperimentalAnimationApi public default androidx.compose.ui.Modifier animateEnterExit(androidx.compose.ui.Modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label);
+    method @androidx.compose.animation.ExperimentalAnimationApi public androidx.compose.animation.core.Transition<androidx.compose.animation.EnterExitState> getTransition();
+    property @androidx.compose.animation.ExperimentalAnimationApi public abstract androidx.compose.animation.core.Transition<androidx.compose.animation.EnterExitState> transition;
   }
 
   public final class AnimationModifierKt {
@@ -90,25 +90,25 @@
   }
 
   public final class EnterExitTransitionKt {
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.ui.Alignment expandFrom, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.ui.Alignment.Vertical expandFrom, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional float initialAlpha, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional float targetAlpha, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition scaleIn(optional float initialScale, optional long transformOrigin, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition scaleOut(optional float targetScale, optional long transformOrigin, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.ui.Alignment shrinkTowards, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
-    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetAlpha);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition scaleIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialScale, optional long transformOrigin);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition scaleOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetScale, optional long transformOrigin);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY);
   }
 
-  @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
+  @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
     method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.EnterTransition plus(androidx.compose.animation.EnterTransition enter);
     field public static final androidx.compose.animation.EnterTransition.Companion Companion;
   }
@@ -118,7 +118,7 @@
     property public final androidx.compose.animation.EnterTransition None;
   }
 
-  @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
+  @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
     method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.ExitTransition plus(androidx.compose.animation.ExitTransition exit);
     field public static final androidx.compose.animation.ExitTransition.Companion Companion;
   }
@@ -128,7 +128,7 @@
     property public final androidx.compose.animation.ExitTransition None;
   }
 
-  @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalAnimationApi {
+  @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalAnimationApi {
   }
 
   public final class FlingCalculatorKt {
diff --git a/compose/animation/animation/api/restricted_current.txt b/compose/animation/animation/api/restricted_current.txt
index 5d07282..efcf96a 100644
--- a/compose/animation/animation/api/restricted_current.txt
+++ b/compose/animation/animation/api/restricted_current.txt
@@ -9,6 +9,15 @@
   }
 
   public final class AnimatedVisibilityKt {
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> visibleState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional String label, kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedVisibilityScope,kotlin.Unit> content);
+  }
+
+  public interface AnimatedVisibilityScope {
   }
 
   public final class AnimationModifierKt {
@@ -24,6 +33,40 @@
   }
 
   public final class EnterExitTransitionKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical expandFrom, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float initialAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, optional float targetAlpha);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional boolean clip, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX);
+    method @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class EnterTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.EnterTransition plus(androidx.compose.animation.EnterTransition enter);
+    field public static final androidx.compose.animation.EnterTransition.Companion Companion;
+  }
+
+  public static final class EnterTransition.Companion {
+    method public androidx.compose.animation.EnterTransition getNone();
+    property public final androidx.compose.animation.EnterTransition None;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class ExitTransition {
+    method @androidx.compose.runtime.Stable public final operator androidx.compose.animation.ExitTransition plus(androidx.compose.animation.ExitTransition exit);
+    field public static final androidx.compose.animation.ExitTransition.Companion Companion;
+  }
+
+  public static final class ExitTransition.Companion {
+    method public androidx.compose.animation.ExitTransition getNone();
+    property public final androidx.compose.animation.ExitTransition None;
   }
 
   public final class FlingCalculatorKt {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/InspectionEnterExitCombination.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/InspectionEnterExitCombination.kt
index fe096e4..5d9712b 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/InspectionEnterExitCombination.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/InspectionEnterExitCombination.kt
@@ -210,7 +210,7 @@
             BottomCenter -> expandVertically(expandFrom = Bottom)
             CenterStart -> expandHorizontally(expandFrom = Start)
             CenterEnd -> expandHorizontally(expandFrom = End)
-            else -> expandIn(animationAlignment)
+            else -> expandIn(expandFrom = animationAlignment)
         }
 
         val shrink = when (animationAlignment) {
@@ -218,30 +218,30 @@
             BottomCenter -> shrinkVertically(shrinkTowards = Bottom)
             CenterStart -> shrinkHorizontally(shrinkTowards = Start)
             CenterEnd -> shrinkHorizontally(shrinkTowards = End)
-            else -> shrinkOut(animationAlignment)
+            else -> shrinkOut(shrinkTowards = animationAlignment)
         }
 
         val slideIn = when (alignment) {
-            TopCenter -> slideInVertically({ -it })
-            BottomCenter -> slideInVertically({ it })
-            CenterStart -> slideInHorizontally({ -it })
-            CenterEnd -> slideInHorizontally({ it })
-            TopStart -> slideIn({ IntOffset(-it.width, -it.height) })
-            BottomStart -> slideIn({ IntOffset(-it.width, it.height) })
-            TopEnd -> slideIn({ IntOffset(it.width, -it.height) })
-            BottomEnd -> slideIn({ IntOffset(it.width, it.height) })
-            else -> slideIn({ alignment.align(it, IntSize.Zero, LayoutDirection.Ltr) })
+            TopCenter -> slideInVertically { -it }
+            BottomCenter -> slideInVertically { it }
+            CenterStart -> slideInHorizontally { -it }
+            CenterEnd -> slideInHorizontally { it }
+            TopStart -> slideIn { IntOffset(-it.width, -it.height) }
+            BottomStart -> slideIn { IntOffset(-it.width, it.height) }
+            TopEnd -> slideIn { IntOffset(it.width, -it.height) }
+            BottomEnd -> slideIn { IntOffset(it.width, it.height) }
+            else -> slideIn { alignment.align(it, IntSize.Zero, LayoutDirection.Ltr) }
         }
         val slideOut = when (alignment) {
-            TopCenter -> slideOutVertically({ -it })
-            BottomCenter -> slideOutVertically({ it })
-            CenterStart -> slideOutHorizontally({ -it })
-            CenterEnd -> slideOutHorizontally({ it })
-            TopStart -> slideOut({ IntOffset(-it.width, -it.height) })
-            BottomStart -> slideOut({ IntOffset(-it.width, it.height) })
-            TopEnd -> slideOut({ IntOffset(it.width, -it.height) })
-            BottomEnd -> slideOut({ IntOffset(it.width, it.height) })
-            else -> slideOut({ alignment.align(IntSize.Zero, it, LayoutDirection.Ltr) })
+            TopCenter -> slideOutVertically { -it }
+            BottomCenter -> slideOutVertically { it }
+            CenterStart -> slideOutHorizontally { -it }
+            CenterEnd -> slideOutHorizontally { it }
+            TopStart -> slideOut { IntOffset(-it.width, -it.height) }
+            BottomStart -> slideOut { IntOffset(-it.width, it.height) }
+            TopEnd -> slideOut { IntOffset(it.width, -it.height) }
+            BottomEnd -> slideOut { IntOffset(it.width, it.height) }
+            else -> slideOut { alignment.align(IntSize.Zero, it, LayoutDirection.Ltr) }
         }
 
         var enter: EnterTransition? = null
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/ScaleEnterExitDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/ScaleEnterExitDemo.kt
index a084d06..a7322ad 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/ScaleEnterExitDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/ScaleEnterExitDemo.kt
@@ -97,9 +97,9 @@
         }
         AnimatedVisibility(
             visible = showBlue,
-            enter = scaleIn(1.2f) +
+            enter = scaleIn(initialScale = 1.2f) +
                 slideInHorizontally(initialOffsetX = { (-it * 1.2f).toInt() }),
-            exit = scaleOut(2f) +
+            exit = scaleOut(targetScale = 2f) +
                 slideOutHorizontally(targetOffsetX = { -2 * it })
         ) {
             Box(Modifier.size(100.dp).background(Color.Blue, shape = RoundedCornerShape(20.dp)))
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt
index 1f0ce728..eb72098 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedContentSamples.kt
@@ -77,13 +77,11 @@
                 if (targetState > initialState) {
                     // If the incoming number is larger, new number slides up and fades in while
                     // the previous (smaller) number slides up to make room and fades out.
-                    slideInVertically({ it }) + fadeIn() with
-                        slideOutVertically({ -it }) + fadeOut()
+                    slideInVertically { it } + fadeIn() with slideOutVertically { -it } + fadeOut()
                 } else {
                     // If the incoming number is smaller, new number slides down and fades in while
                     // the previous number slides down and fades out.
-                    slideInVertically({ -it }) + fadeIn() with
-                        slideOutVertically({ it }) + fadeOut()
+                    slideInVertically { -it } + fadeIn() with slideOutVertically { it } + fadeOut()
                     // Disable clipping since the faded slide-out is desired out of bounds, but
                     // the size transform is still needed from number getting longer
                 }.using(SizeTransform(clip = false)) // Using default spring for the size change.
@@ -114,13 +112,19 @@
 fun SimpleAnimatedContentSample() {
     // enum class ContentState { Foo, Bar, Baz }
     @Composable
-    fun Foo() { Box(Modifier.size(200.dp).background(Color(0xffffdb00))) }
+    fun Foo() {
+        Box(Modifier.size(200.dp).background(Color(0xffffdb00)))
+    }
 
     @Composable
-    fun Bar() { Box(Modifier.size(40.dp).background(Color(0xffff8100))) }
+    fun Bar() {
+        Box(Modifier.size(40.dp).background(Color(0xffff8100)))
+    }
 
     @Composable
-    fun Baz() { Box(Modifier.size(80.dp, 20.dp).background(Color(0xffff4400))) }
+    fun Baz() {
+        Box(Modifier.size(80.dp, 20.dp).background(Color(0xffff4400)))
+    }
 
     var contentState: ContentState by remember { mutableStateOf(ContentState.Foo) }
     AnimatedContent(contentState) {
@@ -176,9 +180,12 @@
 @OptIn(ExperimentalAnimationApi::class)
 fun TransitionExtensionAnimatedContentSample() {
     @Composable
-    fun CollapsedCart() { /* Some content here */ }
+    fun CollapsedCart() { /* Some content here */
+    }
+
     @Composable
-    fun ExpandedCart() { /* Some content here */ }
+    fun ExpandedCart() { /* Some content here */
+    }
 
     // enum class CartState { Expanded, Collapsed }
     var cartState by remember { mutableStateOf(CartState.Collapsed) }
@@ -273,19 +280,16 @@
                 // out of the bounds. This creates a sense of child menu catching up. Since
                 // the child menu has a higher z-order, it will cover the parent meu as it
                 // comes in.
-                slideOutOfContainer(
-                    towards = SlideDirection.Left,
-                    targetOffset = { offsetForFullSlide -> offsetForFullSlide / 2 }
-                )
+                slideOutOfContainer(towards = SlideDirection.Left) { offsetForFullSlide ->
+                    offsetForFullSlide / 2
+                }
         } else {
             // Going from child menu to parent menu, slide towards right.
             // Slide parent by half amount compared to child menu to create an interesting
             // parallax visual effect.
-            slideIntoContainer(
-                towards = SlideDirection.Right,
-                initialOffset = { offsetForFullSlide -> offsetForFullSlide / 2 }
-            ) with
-                slideOutOfContainer(towards = SlideDirection.Right)
+            slideIntoContainer(towards = SlideDirection.Right) { offsetForFullSlide ->
+                offsetForFullSlide / 2
+            } with slideOutOfContainer(towards = SlideDirection.Right)
         }.apply {
             // Here we can specify the zIndex for the target (i.e. incoming) content.
             targetContentZIndex = when (targetState) {
diff --git a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt
index 41f019b..bba61af 100644
--- a/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt
+++ b/compose/animation/animation/samples/src/main/java/androidx/compose/animation/samples/AnimatedVisibilitySamples.kt
@@ -23,7 +23,6 @@
 import androidx.compose.animation.ExitTransition
 import androidx.compose.animation.ExperimentalAnimationApi
 import androidx.compose.animation.animateColor
-import androidx.compose.animation.core.ExperimentalTransitionApi
 import androidx.compose.animation.core.FastOutSlowInEasing
 import androidx.compose.animation.core.LinearOutSlowInEasing
 import androidx.compose.animation.core.MutableTransitionState
@@ -96,60 +95,54 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.flow.collect
 
-@OptIn(ExperimentalAnimationApi::class)
 @Sampled
 @Composable
 fun HorizontalTransitionSample() {
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible = visible,
-        enter = expandHorizontally(
-            // Set the start width to 20 (pixels), 0 by default
-            initialWidth = { 20 }
-        ),
+        // Set the start width to 20 (pixels), 0 by default
+        enter = expandHorizontally { 20 },
         exit = shrinkHorizontally(
+            // Overwrites the default animation with tween for this shrink animation.
+            animationSpec = tween(),
             // Shrink towards the end (i.e. right edge for LTR, left edge for RTL). The default
             // direction for the shrink is towards [Alignment.Start]
             shrinkTowards = Alignment.End,
+        ) { fullWidth ->
             // Set the end width for the shrink animation to a quarter of the full width.
-            targetWidth = { fullWidth -> fullWidth / 4 },
-            // Overwrites the default animation with tween for this shrink animation.
-            animationSpec = tween()
-        )
+            fullWidth / 4
+        }
     ) {
         // Content that needs to appear/disappear goes here:
         Box(Modifier.fillMaxWidth().requiredHeight(200.dp))
     }
 }
 
-@OptIn(ExperimentalAnimationApi::class)
 @Sampled
 @Composable
 fun SlideTransition() {
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible = visible,
-        enter = slideInHorizontally(
+        enter = slideInHorizontally(animationSpec = tween(durationMillis = 200)) { fullWidth ->
             // Offsets the content by 1/3 of its width to the left, and slide towards right
-            initialOffsetX = { fullWidth -> -fullWidth / 3 },
             // Overwrites the default animation with tween for this slide animation.
-            animationSpec = tween(durationMillis = 200)
-        ) + fadeIn(
+            -fullWidth / 3
+        } + fadeIn(
             // Overwrites the default animation with tween
             animationSpec = tween(durationMillis = 200)
         ),
-        exit = slideOutHorizontally(
+        exit = slideOutHorizontally(animationSpec = spring(stiffness = Spring.StiffnessHigh)) {
             // Overwrites the ending position of the slide-out to 200 (pixels) to the right
-            targetOffsetX = { 200 },
-            animationSpec = spring(stiffness = Spring.StiffnessHigh)
-        ) + fadeOut()
+            200
+        } + fadeOut()
     ) {
         // Content that needs to appear/disappear goes here:
         Box(Modifier.fillMaxWidth().requiredHeight(200.dp)) {}
     }
 }
 
-@OptIn(ExperimentalAnimationApi::class)
 @Sampled
 @Composable
 fun FadeTransition() {
@@ -252,34 +245,30 @@
     Spacer(Modifier.requiredHeight(20.dp))
 }
 
-@OptIn(ExperimentalAnimationApi::class)
 @Sampled
 @Composable
 fun SlideInOutSample() {
     var visible by remember { mutableStateOf(true) }
     AnimatedVisibility(
         visible,
-        enter = slideIn(
+        enter = slideIn(tween(100, easing = LinearOutSlowInEasing)) { fullSize ->
             // Specifies the starting offset of the slide-in to be 1/4 of the width to the right,
             // 100 (pixels) below the content position, which results in a simultaneous slide up
             // and slide left.
-            { fullSize -> IntOffset(fullSize.width / 4, 100) },
-            tween(100, easing = LinearOutSlowInEasing)
-        ),
-        exit = slideOut(
+            IntOffset(fullSize.width / 4, 100)
+        },
+        exit = slideOut(tween(100, easing = FastOutSlowInEasing)) {
             // The offset can be entirely independent of the size of the content. This specifies
             // a target offset 180 pixels to the left of the content, and 50 pixels below. This will
             // produce a slide-left combined with a slide-down.
-            { IntOffset(-180, 50) },
-            tween(100, easing = FastOutSlowInEasing)
-        )
+            IntOffset(-180, 50)
+        },
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
     }
 }
 
-@OptIn(ExperimentalAnimationApi::class)
 @Sampled
 @Composable
 fun ExpandShrinkVerticallySample() {
@@ -289,22 +278,17 @@
         visible,
         // Sets the initial height of the content to 20, revealing only the top of the content at
         // the beginning of the expanding animation.
-        enter = expandVertically(
-            expandFrom = Alignment.Top,
-            initialHeight = { 20 }
-        ),
+        enter = expandVertically(expandFrom = Alignment.Top) { 20 },
         // Shrinks the content to half of its full height via an animation.
-        exit = shrinkVertically(
-            targetHeight = { fullHeight -> fullHeight / 2 },
-            animationSpec = tween()
-        )
+        exit = shrinkVertically(animationSpec = tween()) { fullHeight ->
+            fullHeight / 2
+        },
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
     }
 }
 
-@OptIn(ExperimentalAnimationApi::class)
 @Sampled
 @Composable
 fun ExpandInShrinkOutSample() {
@@ -313,23 +297,25 @@
     AnimatedVisibility(
         visible,
         enter = expandIn(
-            // Overwrites the corner of the content that is first revealed
-            expandFrom = Alignment.BottomStart,
-            // Overwrites the initial size to 50 pixels by 50 pixels
-            initialSize = { IntSize(50, 50) },
             // Overwrites the default spring animation with tween
-            animationSpec = tween(100, easing = LinearOutSlowInEasing)
-        ),
+            animationSpec = tween(100, easing = LinearOutSlowInEasing),
+            // Overwrites the corner of the content that is first revealed
+            expandFrom = Alignment.BottomStart
+        ) {
+            // Overwrites the initial size to 50 pixels by 50 pixels
+            IntSize(50, 50)
+        },
         exit = shrinkOut(
+            tween(100, easing = FastOutSlowInEasing),
             // Overwrites the area of the content that the shrink animation will end on. The
             // following parameters will shrink the content's clip bounds from the full size of the
             // content to 1/10 of the width and 1/5 of the height. The shrinking clip bounds will
             // always be aligned to the CenterStart of the full-content bounds.
-            shrinkTowards = Alignment.CenterStart,
+            shrinkTowards = Alignment.CenterStart
+        ) { fullSize ->
             // Overwrites the target size of the shrinking animation.
-            targetSize = { fullSize -> IntSize(fullSize.width / 10, fullSize.height / 5) },
-            animationSpec = tween(100, easing = FastOutSlowInEasing)
-        )
+            IntSize(fullSize.width / 10, fullSize.height / 5)
+        }
     ) {
         // Content that needs to appear/disappear goes here:
         Text("Content to appear/disappear", Modifier.fillMaxWidth().requiredHeight(200.dp))
@@ -337,7 +323,6 @@
 }
 
 @Sampled
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 fun ColumnAnimatedVisibilitySample() {
     var itemIndex by remember { mutableStateOf(0) }
@@ -358,7 +343,6 @@
 }
 
 @Sampled
-@OptIn(ExperimentalAnimationApi::class, ExperimentalTransitionApi::class)
 @Composable
 fun AVScopeAnimateEnterExit() {
     @OptIn(ExperimentalAnimationApi::class)
@@ -398,7 +382,6 @@
         }
     }
 
-    @OptIn(ExperimentalAnimationApi::class, ExperimentalTransitionApi::class)
     @Composable
     fun AnimateMainContent(mainContentVisible: MutableTransitionState<Boolean>) {
         Box {
@@ -457,8 +440,14 @@
                     .background(Color(0xffcdb7f6), CircleShape)
             )
             Column(Modifier.align(Alignment.CenterVertically)) {
-                Box(Modifier.height(30.dp).width(300.dp).padding(5.dp).background(Color.LightGray))
-                Box(Modifier.height(30.dp).width(300.dp).padding(5.dp).background(Color.LightGray))
+                Box(
+                    Modifier.height(30.dp).width(300.dp).padding(5.dp)
+                        .background(Color.LightGray)
+                )
+                Box(
+                    Modifier.height(30.dp).width(300.dp).padding(5.dp)
+                        .background(Color.LightGray)
+                )
             }
         }
     }
@@ -519,7 +508,6 @@
     }
 }
 
-@OptIn(ExperimentalAnimationApi::class, ExperimentalTransitionApi::class)
 @Sampled
 @Composable
 fun AnimatedVisibilityLazyColumnSample() {
@@ -542,7 +530,10 @@
         // visibility. When the MutableTransitionState's targetState changes, corresponding
         // transition will be fired. MutableTransitionState allows animation lifecycle to be
         // observed through it's [currentState] and [isIdle]. See below for details.
-        inner class ColoredItem(val visible: MutableTransitionState<Boolean>, val itemId: Int) {
+        inner class ColoredItem(
+            val visible: MutableTransitionState<Boolean>,
+            val itemId: Int
+        ) {
             val color: Color
                 get() = turquoiseColors.let {
                     it[itemId % it.size]
@@ -568,7 +559,6 @@
             item.visible.targetState = false
         }
 
-        @OptIn(ExperimentalTransitionApi::class)
         fun pruneItems() {
             // Inspect the animation status through MutableTransitionState. If isIdle == true,
             // all animations have finished for the transition.
@@ -588,13 +578,15 @@
         }
     }
 
-    @OptIn(ExperimentalAnimationApi::class, ExperimentalTransitionApi::class)
     @Composable
     fun AnimatedVisibilityInLazyColumn() {
         Column {
             val model = remember { MyModel() }
             Row(Modifier.fillMaxWidth()) {
-                Button({ model.addNewItem() }, modifier = Modifier.padding(15.dp).weight(1f)) {
+                Button(
+                    { model.addNewItem() },
+                    modifier = Modifier.padding(15.dp).weight(1f)
+                ) {
                     Text("Add")
                 }
             }
@@ -617,10 +609,14 @@
                         enter = expandVertically(),
                         exit = shrinkVertically()
                     ) {
-                        Box(Modifier.fillMaxWidth().requiredHeight(90.dp).background(item.color)) {
+                        Box(
+                            Modifier.fillMaxWidth().requiredHeight(90.dp)
+                                .background(item.color)
+                        ) {
                             Button(
                                 { model.removeItem(item) },
-                                modifier = Modifier.align(Alignment.CenterEnd).padding(15.dp)
+                                modifier = Modifier.align(Alignment.CenterEnd)
+                                    .padding(15.dp)
                             ) {
                                 Text("Remove")
                             }
@@ -640,11 +636,11 @@
 }
 
 @Sampled
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 fun AVColumnScopeWithMutableTransitionState() {
     var visible by remember { mutableStateOf(true) }
-    val colors = remember { listOf(Color(0xff2a9d8f), Color(0xffe9c46a), Color(0xfff4a261)) }
+    val colors =
+        remember { listOf(Color(0xff2a9d8f), Color(0xffe9c46a), Color(0xfff4a261)) }
     Column {
         repeat(3) {
             AnimatedVisibility(
@@ -667,7 +663,6 @@
 }
 
 @Sampled
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 fun AnimateEnterExitPartialContent() {
     @OptIn(ExperimentalAnimationApi::class)
diff --git a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
index a172d80..c4f2bbb 100644
--- a/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
+++ b/compose/animation/animation/src/androidAndroidTest/kotlin/androidx/compose/animation/AnimatedVisibilityTest.kt
@@ -83,15 +83,16 @@
                 AnimatedVisibility(
                     visible, testModifier,
                     enter = expandIn(
-                        Alignment.BottomEnd,
-                        { fullSize -> IntSize(fullSize.width / 4, fullSize.height / 2) },
-                        tween(160, easing = LinearOutSlowInEasing)
-                    ),
+                        tween(160, easing = LinearOutSlowInEasing),
+                        Alignment.BottomEnd
+                    ) { fullSize ->
+                        IntSize(fullSize.width / 4, fullSize.height / 2)
+                    },
+
                     exit = shrinkOut(
-                        Alignment.CenterStart,
-                        { fullSize -> IntSize(fullSize.width / 10, fullSize.height / 5) },
-                        tween(160, easing = FastOutSlowInEasing)
-                    )
+                        tween(160, easing = FastOutSlowInEasing),
+                        Alignment.CenterStart
+                    ) { fullSize -> IntSize(fullSize.width / 10, fullSize.height / 5) },
                 ) {
                     Box(
                         Modifier.requiredSize(100.dp, 100.dp)
@@ -196,13 +197,11 @@
             AnimatedVisibility(
                 visible, testModifier,
                 enter = slideIn(
-                    { fullSize -> IntOffset(fullSize.width / 4, -fullSize.height / 2) },
                     tween(160, easing = LinearOutSlowInEasing)
-                ),
+                ) { fullSize -> IntOffset(fullSize.width / 4, -fullSize.height / 2) },
                 exit = slideOut(
-                    { fullSize -> IntOffset(-fullSize.width / 10, fullSize.height / 5) },
                     tween(160, easing = FastOutSlowInEasing)
-                )
+                ) { fullSize -> IntOffset(-fullSize.width / 10, fullSize.height / 5) },
             ) {
                 Box(
                     Modifier.requiredSize(100.dp, 100.dp)
@@ -598,7 +597,7 @@
                 }.AnimatedVisibility(
                     { it },
                     enter = fadeIn(animationSpec = spec()) +
-                        slideInVertically({ 200 }, animationSpec = spec()),
+                        slideInVertically(animationSpec = spec()) { 200 },
                     exit = scaleOut(animationSpec = spec()) +
                         shrinkHorizontally(animationSpec = spec())
                 ) {
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
index a4b21dc..a3c6f32 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
@@ -48,9 +48,11 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
+import androidx.compose.ui.layout.IntrinsicMeasurable
+import androidx.compose.ui.layout.IntrinsicMeasureScope
 import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasurePolicy
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.ParentDataModifier
@@ -351,34 +353,22 @@
         initialOffset: (offsetForFullSlide: Int) -> Int = { it }
     ): EnterTransition =
         when {
-            towards.isLeft -> slideInHorizontally(
-                {
-                    initialOffset.invoke(
-                        currentSize.width - calculateOffset(IntSize(it, it), currentSize).x
-                    )
-                },
-                animationSpec
-            )
-            towards.isRight -> slideInHorizontally(
-                {
-                    initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).x - it)
-                },
-                animationSpec
-            )
-            towards == Up -> slideInVertically(
-                {
-                    initialOffset.invoke(
-                        currentSize.height - calculateOffset(IntSize(it, it), currentSize).y
-                    )
-                },
-                animationSpec
-            )
-            towards == Down -> slideInVertically(
-                {
-                    initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).y - it)
-                },
-                animationSpec
-            )
+            towards.isLeft -> slideInHorizontally(animationSpec) {
+                initialOffset.invoke(
+                    currentSize.width - calculateOffset(IntSize(it, it), currentSize).x
+                )
+            }
+            towards.isRight -> slideInHorizontally(animationSpec) {
+                initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).x - it)
+            }
+            towards == Up -> slideInVertically(animationSpec) {
+                initialOffset.invoke(
+                    currentSize.height - calculateOffset(IntSize(it, it), currentSize).y
+                )
+            }
+            towards == Down -> slideInVertically(animationSpec) {
+                initialOffset.invoke(-calculateOffset(IntSize(it, it), currentSize).y - it)
+            }
             else -> EnterTransition.None
         }
 
@@ -428,38 +418,28 @@
     ): ExitTransition {
         return when {
             // Note: targetSize could be 0 for empty composables
-            towards.isLeft -> slideOutHorizontally(
-                {
-                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                    targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).x - it)
-                },
-                animationSpec
-            )
-            towards.isRight -> slideOutHorizontally(
-                {
-                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                    targetOffset.invoke(
-                        -calculateOffset(IntSize(it, it), targetSize).x + targetSize.width
-                    )
-                },
-                animationSpec
-            )
-            towards == Up -> slideOutVertically(
-                {
-                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                    targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).y - it)
-                },
-                animationSpec
-            )
-            towards == Down -> slideOutVertically(
-                {
-                    val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
-                    targetOffset.invoke(
-                        -calculateOffset(IntSize(it, it), targetSize).y + targetSize.height
-                    )
-                },
-                animationSpec
-            )
+            towards.isLeft -> slideOutHorizontally(animationSpec) {
+                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).x - it)
+            }
+            towards.isRight -> slideOutHorizontally(animationSpec) {
+
+                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                targetOffset.invoke(
+                    -calculateOffset(IntSize(it, it), targetSize).x + targetSize.width
+                )
+            }
+            towards == Up -> slideOutVertically(animationSpec) {
+
+                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                targetOffset.invoke(-calculateOffset(IntSize(it, it), targetSize).y - it)
+            }
+            towards == Down -> slideOutVertically(animationSpec) {
+                val targetSize = targetSizeMap[transition.targetState]?.value ?: IntSize.Zero
+                targetOffset.invoke(
+                    -calculateOffset(IntSize(it, it), targetSize).y + targetSize.height
+                )
+            }
             else -> ExitTransition.None
         }
     }
@@ -513,7 +493,7 @@
     private inner class SizeModifier(
         val sizeAnimation: Transition<S>.DeferredAnimation<IntSize, AnimationVector2D>,
         val sizeTransform: State<SizeTransform?>,
-    ) : LayoutModifier {
+    ) : LayoutModifierWithPassThroughIntrinsics() {
 
         override fun MeasureScope.measure(
             measurable: Measurable,
@@ -677,8 +657,17 @@
                     contentMap[it]?.invoke()
                 }
             }
-        }
-    ) { measurables, constraints ->
+        },
+        measurePolicy = remember { AnimatedContentMeasurePolicy(rootScope) }
+    )
+}
+
+@OptIn(ExperimentalAnimationApi::class)
+private class AnimatedContentMeasurePolicy(val rootScope: AnimatedContentScope<*>) : MeasurePolicy {
+    override fun MeasureScope.measure(
+        measurables: List<Measurable>,
+        constraints: Constraints
+    ): MeasureResult {
         val placeables = arrayOfNulls<Placeable>(measurables.size)
         // Measure the target composable first (but place it on top unless zIndex is specified)
         measurables.fastForEachIndexed { index, measurable ->
@@ -698,7 +687,7 @@
         val maxHeight = placeables.maxByOrNull { it?.height ?: 0 }?.height ?: 0
         rootScope.measuredSize = IntSize(maxWidth, maxHeight)
         // Position the children.
-        layout(maxWidth, maxHeight) {
+        return layout(maxWidth, maxHeight) {
             placeables.forEach { placeable ->
                 placeable?.let {
                     val offset = rootScope.contentAlignment.align(
@@ -711,4 +700,24 @@
             }
         }
     }
-}
+
+    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+        measurables: List<IntrinsicMeasurable>,
+        height: Int
+    ) = measurables.asSequence().map { it.minIntrinsicWidth(height) }.maxOrNull() ?: 0
+
+    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+        measurables: List<IntrinsicMeasurable>,
+        width: Int
+    ) = measurables.asSequence().map { it.minIntrinsicHeight(width) }.maxOrNull() ?: 0
+
+    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+        measurables: List<IntrinsicMeasurable>,
+        height: Int
+    ) = measurables.asSequence().map { it.maxIntrinsicWidth(height) }.maxOrNull() ?: 0
+
+    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+        measurables: List<IntrinsicMeasurable>,
+        width: Int
+    ) = measurables.asSequence().map { it.maxIntrinsicHeight(width) }.maxOrNull() ?: 0
+}
\ No newline at end of file
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
index 7a4936b..a7305a9 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
@@ -37,8 +37,15 @@
 import androidx.compose.runtime.snapshotFlow
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
+import androidx.compose.ui.layout.IntrinsicMeasurable
+import androidx.compose.ui.layout.IntrinsicMeasureScope
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasurePolicy
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastMaxBy
@@ -108,7 +115,6 @@
  * @see shrinkOut
  * @see AnimatedVisibilityScope
  */
-@ExperimentalAnimationApi
 @Composable
 fun AnimatedVisibility(
     visible: Boolean,
@@ -184,7 +190,6 @@
  * @see ColumnScope.AnimatedVisibility
  * @see AnimatedVisibilityScope
  */
-@ExperimentalAnimationApi
 @Composable
 fun RowScope.AnimatedVisibility(
     visible: Boolean,
@@ -258,7 +263,6 @@
  * @see AnimatedVisibility
  * @see AnimatedVisibilityScope
  */
-@ExperimentalAnimationApi
 @Composable
 fun ColumnScope.AnimatedVisibility(
     visible: Boolean,
@@ -365,7 +369,6 @@
  * @see Transition.AnimatedVisibility
  * @see AnimatedVisibilityScope
  */
-@ExperimentalAnimationApi
 @Composable
 fun AnimatedVisibility(
     visibleState: MutableTransitionState<Boolean>,
@@ -441,7 +444,6 @@
  * @see Transition.AnimatedVisibility
  * @see AnimatedVisibilityScope
  */
-@ExperimentalAnimationApi
 @Composable
 fun RowScope.AnimatedVisibility(
     visibleState: MutableTransitionState<Boolean>,
@@ -518,7 +520,6 @@
  * @see Transition.AnimatedVisibility
  * @see AnimatedVisibilityScope
  */
-@ExperimentalAnimationApi
 @Composable
 fun ColumnScope.AnimatedVisibility(
     visibleState: MutableTransitionState<Boolean>,
@@ -618,12 +619,14 @@
  *
  * @sample androidx.compose.animation.samples.AVScopeAnimateEnterExit
  */
-@ExperimentalAnimationApi
 interface AnimatedVisibilityScope {
     /**
      * [transition] allows custom enter/exit animations to be specified. It will run simultaneously
      * with the built-in enter/exit transitions specified in [AnimatedVisibility].
      */
+    @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+    @get:ExperimentalAnimationApi
+    @ExperimentalAnimationApi
     val transition: Transition<EnterExitState>
 
     /**
@@ -652,6 +655,7 @@
      *
      * @sample androidx.compose.animation.samples.AnimateEnterExitPartialContent
      */
+    @ExperimentalAnimationApi
     fun Modifier.animateEnterExit(
         enter: EnterTransition = fadeIn() + expandIn(),
         exit: ExitTransition = fadeOut() + shrinkOut(),
@@ -712,8 +716,11 @@
 
 // RowScope and ColumnScope AnimatedEnterExit extensions and AnimatedEnterExit without a receiver
 // converge here.
-@OptIn(ExperimentalTransitionApi::class, InternalAnimationApi::class)
-@ExperimentalAnimationApi
+@OptIn(
+    ExperimentalTransitionApi::class,
+    InternalAnimationApi::class,
+    ExperimentalAnimationApi::class
+)
 @Composable
 private fun <T> AnimatedEnterExitImpl(
     transition: Transition<T>,
@@ -751,15 +758,14 @@
     }
 }
 
-@OptIn(ExperimentalTransitionApi::class)
-@ExperimentalAnimationApi
+@OptIn(ExperimentalTransitionApi::class, ExperimentalAnimationApi::class)
 @Composable
 private inline fun AnimatedEnterExitImpl(
     transition: Transition<EnterExitState>,
     modifier: Modifier,
     enter: EnterTransition,
     exit: ExitTransition,
-    content: @Composable() AnimatedVisibilityScope.() -> Unit
+    content: @Composable AnimatedVisibilityScope.() -> Unit
 ) {
     // TODO: Get some feedback on whether there's a need to observe this state change in user
     //  code. If there is, this if check will need to be moved to measure stage, along with some
@@ -770,25 +776,55 @@
         val scope = remember(transition) { AnimatedVisibilityScopeImpl(transition) }
         Layout(
             content = { scope.content() },
-            modifier = modifier.then(transition.createModifier(enter, exit, "Built-in"))
-        ) { measureables, constraints ->
-            val placeables = measureables.map { it.measure(constraints) }
-            val maxWidth: Int = placeables.fastMaxBy { it.width }?.width ?: 0
-            val maxHeight = placeables.fastMaxBy { it.height }?.height ?: 0
-            // Position the children.
-            scope.targetSize.value = IntSize(maxWidth, maxHeight)
-            layout(maxWidth, maxHeight) {
-                placeables.fastForEach {
-                    it.place(0, 0)
-                }
-            }
-        }
+            modifier = modifier.then(transition.createModifier(enter, exit, "Built-in")),
+            measurePolicy = remember { AnimatedEnterExitMeasurePolicy(scope) }
+        )
     }
 }
 
+@OptIn(ExperimentalAnimationApi::class)
+private class AnimatedEnterExitMeasurePolicy(
+    val scope: AnimatedVisibilityScopeImpl
+) : MeasurePolicy {
+    override fun MeasureScope.measure(
+        measurables: List<Measurable>,
+        constraints: Constraints
+    ): MeasureResult {
+        val placeables = measurables.map { it.measure(constraints) }
+        val maxWidth: Int = placeables.fastMaxBy { it.width }?.width ?: 0
+        val maxHeight = placeables.fastMaxBy { it.height }?.height ?: 0
+        // Position the children.
+        scope.targetSize.value = IntSize(maxWidth, maxHeight)
+        return layout(maxWidth, maxHeight) {
+            placeables.fastForEach {
+                it.place(0, 0)
+            }
+        }
+    }
+
+    override fun IntrinsicMeasureScope.minIntrinsicWidth(
+        measurables: List<IntrinsicMeasurable>,
+        height: Int
+    ) = measurables.asSequence().map { it.minIntrinsicWidth(height) }.maxOrNull() ?: 0
+
+    override fun IntrinsicMeasureScope.minIntrinsicHeight(
+        measurables: List<IntrinsicMeasurable>,
+        width: Int
+    ) = measurables.asSequence().map { it.minIntrinsicHeight(width) }.maxOrNull() ?: 0
+
+    override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+        measurables: List<IntrinsicMeasurable>,
+        height: Int
+    ) = measurables.asSequence().map { it.maxIntrinsicWidth(height) }.maxOrNull() ?: 0
+
+    override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+        measurables: List<IntrinsicMeasurable>,
+        width: Int
+    ) = measurables.asSequence().map { it.maxIntrinsicHeight(width) }.maxOrNull() ?: 0
+}
+
 // This converts Boolean visible to EnterExitState
-@OptIn(InternalAnimationApi::class)
-@ExperimentalAnimationApi
+@OptIn(InternalAnimationApi::class, ExperimentalAnimationApi::class)
 @Composable
 private fun <T> Transition<T>.targetEnterExit(
     visible: (T) -> Boolean,
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt
index 3087a0c..142fc13 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimationModifier.kt
@@ -28,6 +28,8 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.draw.clipToBounds
+import androidx.compose.ui.layout.IntrinsicMeasurable
+import androidx.compose.ui.layout.IntrinsicMeasureScope
 import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
@@ -86,7 +88,7 @@
 private class SizeAnimationModifier(
     val animSpec: AnimationSpec<IntSize>,
     val scope: CoroutineScope,
-) : LayoutModifier {
+) : LayoutModifierWithPassThroughIntrinsics() {
     var listener: ((startSize: IntSize, endSize: IntSize) -> Unit)? = null
 
     data class AnimData(
@@ -133,3 +135,25 @@
         return data.anim.value
     }
 }
+
+internal abstract class LayoutModifierWithPassThroughIntrinsics : LayoutModifier {
+    final override fun IntrinsicMeasureScope.minIntrinsicWidth(
+        measurable: IntrinsicMeasurable,
+        height: Int
+    ) = measurable.minIntrinsicWidth(height)
+
+    final override fun IntrinsicMeasureScope.minIntrinsicHeight(
+        measurable: IntrinsicMeasurable,
+        width: Int
+    ) = measurable.minIntrinsicHeight(width)
+
+    final override fun IntrinsicMeasureScope.maxIntrinsicWidth(
+        measurable: IntrinsicMeasurable,
+        height: Int
+    ) = measurable.maxIntrinsicWidth(height)
+
+    final override fun IntrinsicMeasureScope.maxIntrinsicHeight(
+        measurable: IntrinsicMeasurable,
+        width: Int
+    ) = measurable.maxIntrinsicHeight(width)
+}
\ No newline at end of file
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
index 258f064..ba869bf 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
@@ -46,7 +46,6 @@
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
@@ -56,7 +55,13 @@
 import androidx.compose.ui.unit.LayoutDirection
 
 @RequiresOptIn(message = "This is an experimental animation API.")
-@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)
+@Target(
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY,
+    AnnotationTarget.FIELD,
+    AnnotationTarget.PROPERTY_GETTER,
+)
 annotation class ExperimentalAnimationApi
 
 /**
@@ -84,7 +89,6 @@
  * @see expandVertically
  * @see AnimatedVisibility
  */
-@ExperimentalAnimationApi
 @Immutable
 sealed class EnterTransition {
     internal abstract val data: TransitionData
@@ -157,7 +161,6 @@
  * @see shrinkVertically
  * @see AnimatedVisibility
  */
-@ExperimentalAnimationApi
 @Immutable
 sealed class ExitTransition {
     internal abstract val data: TransitionData
@@ -213,14 +216,13 @@
  *
  * @sample androidx.compose.animation.samples.FadeTransition
  *
- * @param initialAlpha the starting alpha of the enter transition, 0f by default
  * @param animationSpec the [FiniteAnimationSpec] for this animation, [spring] by default
+ * @param initialAlpha the starting alpha of the enter transition, 0f by default
  */
 @Stable
-@ExperimentalAnimationApi
 fun fadeIn(
-    initialAlpha: Float = 0f,
-    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)
+    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow),
+    initialAlpha: Float = 0f
 ): EnterTransition {
     return EnterTransitionImpl(TransitionData(fade = Fade(initialAlpha, animationSpec)))
 }
@@ -233,14 +235,13 @@
  *
  * @sample androidx.compose.animation.samples.FadeTransition
  *
- * @param targetAlpha the target alpha of the exit transition, 0f by default
  * @param animationSpec the [FiniteAnimationSpec] for this animation, [spring] by default
+ * @param targetAlpha the target alpha of the exit transition, 0f by default
  */
 @Stable
-@ExperimentalAnimationApi
 fun fadeOut(
+    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow),
     targetAlpha: Float = 0f,
-    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)
 ): ExitTransition {
     return ExitTransitionImpl(TransitionData(fade = Fade(targetAlpha, animationSpec)))
 }
@@ -260,19 +261,18 @@
  *
  * @sample androidx.compose.animation.samples.SlideInOutSample
  *
+ * @param animationSpec the animation used for the slide-in, [spring] by default.
  * @param initialOffset a lambda that takes the full size of the content and returns the initial
  *                        offset for the slide-in
- * @param animationSpec the animation used for the slide-in, [spring] by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun slideIn(
-    initialOffset: (fullSize: IntSize) -> IntOffset,
     animationSpec: FiniteAnimationSpec<IntOffset> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntOffset.VisibilityThreshold
-        )
+        ),
+    initialOffset: (fullSize: IntSize) -> IntOffset,
 ): EnterTransition {
     return EnterTransitionImpl(TransitionData(slide = Slide(initialOffset, animationSpec)))
 }
@@ -292,19 +292,18 @@
  *
  * @sample androidx.compose.animation.samples.SlideInOutSample
  *
+ * @param animationSpec the animation used for the slide-out, [spring] by default.
  * @param targetOffset a lambda that takes the full size of the content and returns the target
  *                     offset for the slide-out
- * @param animationSpec the animation used for the slide-out, [spring] by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun slideOut(
-    targetOffset: (fullSize: IntSize) -> IntOffset,
     animationSpec: FiniteAnimationSpec<IntOffset> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntOffset.VisibilityThreshold
-        )
+        ),
+    targetOffset: (fullSize: IntSize) -> IntOffset,
 ): ExitTransition {
     return ExitTransitionImpl(TransitionData(slide = Slide(targetOffset, animationSpec)))
 }
@@ -323,16 +322,17 @@
  * layout size change while scaling. For example:
  * @sample androidx.compose.animation.samples.ScaledEnterExit
  *
+ * @param animationSpec the animation used for the scale-out, [spring] by default.
+ * @param initialScale the initial scale for the enter transition, 0 by default.
  * @param transformOrigin the pivot point in terms of fraction of the overall size. By default it's
  *                        [TransformOrigin.Center].
- * @param animationSpec the animation used for the slide-out, [spring] by default.
  */
 @Stable
 @ExperimentalAnimationApi
 fun scaleIn(
+    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow),
     initialScale: Float = 0f,
     transformOrigin: TransformOrigin = TransformOrigin.Center,
-    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)
 ): EnterTransition {
     return EnterTransitionImpl(
         TransitionData(scale = Scale(initialScale, transformOrigin, animationSpec))
@@ -353,16 +353,17 @@
  * coordinated layout size change animation. For example:
  * @sample androidx.compose.animation.samples.ScaledEnterExit
  *
+ * @param animationSpec the animation used for the slide-out, [spring] by default.
+ * @param targetScale the target scale for the exit transition, 0 by default.
  * @param transformOrigin the pivot point in terms of fraction of the overall size. By default it's
  *                        [TransformOrigin.Center].
- * @param animationSpec the animation used for the slide-out, [spring] by default.
  */
 @Stable
 @ExperimentalAnimationApi
 fun scaleOut(
+    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow),
     targetScale: Float = 0f,
-    transformOrigin: TransformOrigin = TransformOrigin.Center,
-    animationSpec: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)
+    transformOrigin: TransformOrigin = TransformOrigin.Center
 ): ExitTransition {
     return ExitTransitionImpl(
         TransitionData(scale = Scale(targetScale, transformOrigin, animationSpec))
@@ -390,22 +391,21 @@
  *
  * @sample androidx.compose.animation.samples.ExpandInShrinkOutSample
  *
- * @param expandFrom the starting point of the expanding bounds, [Alignment.BottomEnd] by default.
- * @param initialSize the start size of the expanding bounds, returning `IntSize(0, 0)` by default.
  * @param animationSpec the animation used for the expanding animation, [spring] by default.
+ * @param expandFrom the starting point of the expanding bounds, [Alignment.BottomEnd] by default.
  * @param clip whether the content outside of the animated bounds should be clipped, true by default
+ * @param initialSize the start size of the expanding bounds, returning `IntSize(0, 0)` by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun expandIn(
-    expandFrom: Alignment = Alignment.BottomEnd,
-    initialSize: (fullSize: IntSize) -> IntSize = { IntSize(0, 0) },
     animationSpec: FiniteAnimationSpec<IntSize> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntSize.VisibilityThreshold
         ),
-    clip: Boolean = true
+    expandFrom: Alignment = Alignment.BottomEnd,
+    clip: Boolean = true,
+    initialSize: (fullSize: IntSize) -> IntSize = { IntSize(0, 0) },
 ): EnterTransition {
     return EnterTransitionImpl(
         TransitionData(
@@ -434,22 +434,21 @@
  *
  * @sample androidx.compose.animation.samples.ExpandInShrinkOutSample
  *
- * @param shrinkTowards the ending point of the shrinking bounds, [Alignment.BottomEnd] by default.
- * @param targetSize returns the end size of the shrinking bounds, `IntSize(0, 0)` by default.
  * @param animationSpec the animation used for the shrinking animation, [spring] by default.
+ * @param shrinkTowards the ending point of the shrinking bounds, [Alignment.BottomEnd] by default.
  * @param clip whether the content outside of the animated bounds should be clipped, true by default
+ * @param targetSize returns the end size of the shrinking bounds, `IntSize(0, 0)` by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun shrinkOut(
-    shrinkTowards: Alignment = Alignment.BottomEnd,
-    targetSize: (fullSize: IntSize) -> IntSize = { IntSize(0, 0) },
     animationSpec: FiniteAnimationSpec<IntSize> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntSize.VisibilityThreshold
         ),
-    clip: Boolean = true
+    shrinkTowards: Alignment = Alignment.BottomEnd,
+    clip: Boolean = true,
+    targetSize: (fullSize: IntSize) -> IntSize = { IntSize(0, 0) },
 ): ExitTransition {
     return ExitTransitionImpl(
         TransitionData(
@@ -476,30 +475,25 @@
  *
  * @sample androidx.compose.animation.samples.HorizontalTransitionSample
  *
- * @param expandFrom the starting point of the expanding bounds, [Alignment.End] by default.
- * @param initialWidth the start width of the expanding bounds, returning 0 by default.
  * @param animationSpec the animation used for the expanding animation, [spring] by default.
+ * @param expandFrom the starting point of the expanding bounds, [Alignment.End] by default.
  * @param clip whether the content outside of the animated bounds should be clipped, true by default
+ * @param initialWidth the start width of the expanding bounds, returning 0 by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun expandHorizontally(
-    expandFrom: Alignment.Horizontal = Alignment.End,
-    initialWidth: (fullWidth: Int) -> Int = { 0 },
     animationSpec: FiniteAnimationSpec<IntSize> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntSize.VisibilityThreshold
         ),
-    clip: Boolean = true
+    expandFrom: Alignment.Horizontal = Alignment.End,
+    clip: Boolean = true,
+    initialWidth: (fullWidth: Int) -> Int = { 0 },
 ): EnterTransition {
-    // TODO: Support different animation types
-    return expandIn(
-        expandFrom.toAlignment(),
-        initialSize = { IntSize(initialWidth(it.width), it.height) },
-        animationSpec = animationSpec,
-        clip = clip
-    )
+    return expandIn(animationSpec, expandFrom.toAlignment(), clip = clip) {
+        IntSize(initialWidth(it.width), it.height)
+    }
 }
 
 /**
@@ -520,29 +514,25 @@
  *
  * @sample androidx.compose.animation.samples.ExpandShrinkVerticallySample
  *
- * @param expandFrom the starting point of the expanding bounds, [Alignment.Bottom] by default.
- * @param initialHeight the start height of the expanding bounds, returning 0 by default.
  * @param animationSpec the animation used for the expanding animation, [spring] by default.
+ * @param expandFrom the starting point of the expanding bounds, [Alignment.Bottom] by default.
  * @param clip whether the content outside of the animated bounds should be clipped, true by default
+ * @param initialHeight the start height of the expanding bounds, returning 0 by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun expandVertically(
-    expandFrom: Alignment.Vertical = Alignment.Bottom,
-    initialHeight: (fullHeight: Int) -> Int = { 0 },
     animationSpec: FiniteAnimationSpec<IntSize> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntSize.VisibilityThreshold
         ),
-    clip: Boolean = true
+    expandFrom: Alignment.Vertical = Alignment.Bottom,
+    clip: Boolean = true,
+    initialHeight: (fullHeight: Int) -> Int = { 0 },
 ): EnterTransition {
-    return expandIn(
-        expandFrom.toAlignment(),
-        { IntSize(it.width, initialHeight(it.height)) },
-        animationSpec,
-        clip
-    )
+    return expandIn(animationSpec, expandFrom.toAlignment(), clip) {
+        IntSize(it.width, initialHeight(it.height))
+    }
 }
 
 /**
@@ -563,30 +553,26 @@
  *
  * @sample androidx.compose.animation.samples.HorizontalTransitionSample
  *
- * @param shrinkTowards the ending point of the shrinking bounds, [Alignment.End] by default.
- * @param targetWidth returns the end width of the shrinking bounds, 0 by default.
  * @param animationSpec the animation used for the shrinking animation, [spring] by default.
+ * @param shrinkTowards the ending point of the shrinking bounds, [Alignment.End] by default.
  * @param clip whether the content outside of the animated bounds should be clipped, true by default
+ * @param targetWidth returns the end width of the shrinking bounds, 0 by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun shrinkHorizontally(
-    shrinkTowards: Alignment.Horizontal = Alignment.End,
-    targetWidth: (fullWidth: Int) -> Int = { 0 },
     animationSpec: FiniteAnimationSpec<IntSize> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntSize.VisibilityThreshold
         ),
-    clip: Boolean = true
+    shrinkTowards: Alignment.Horizontal = Alignment.End,
+    clip: Boolean = true,
+    targetWidth: (fullWidth: Int) -> Int = { 0 }
 ): ExitTransition {
     // TODO: Support different animation types
-    return shrinkOut(
-        shrinkTowards.toAlignment(),
-        targetSize = { IntSize(targetWidth(it.width), it.height) },
-        animationSpec = animationSpec,
-        clip = clip
-    )
+    return shrinkOut(animationSpec, shrinkTowards.toAlignment(), clip) {
+        IntSize(targetWidth(it.width), it.height)
+    }
 }
 
 /**
@@ -607,30 +593,26 @@
  *
  * @sample androidx.compose.animation.samples.ExpandShrinkVerticallySample
  *
- * @param shrinkTowards the ending point of the shrinking bounds, [Alignment.Bottom] by default.
- * @param targetHeight returns the end height of the shrinking bounds, 0 by default.
  * @param animationSpec the animation used for the shrinking animation, [spring] by default.
+ * @param shrinkTowards the ending point of the shrinking bounds, [Alignment.Bottom] by default.
  * @param clip whether the content outside of the animated bounds should be clipped, true by default
+ * @param targetHeight returns the end height of the shrinking bounds, 0 by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun shrinkVertically(
-    shrinkTowards: Alignment.Vertical = Alignment.Bottom,
-    targetHeight: (fullHeight: Int) -> Int = { 0 },
     animationSpec: FiniteAnimationSpec<IntSize> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntSize.VisibilityThreshold
         ),
-    clip: Boolean = true
+    shrinkTowards: Alignment.Vertical = Alignment.Bottom,
+    clip: Boolean = true,
+    targetHeight: (fullHeight: Int) -> Int = { 0 },
 ): ExitTransition {
     // TODO: Support different animation types
-    return shrinkOut(
-        shrinkTowards.toAlignment(),
-        targetSize = { IntSize(it.width, targetHeight(it.height)) },
-        animationSpec = animationSpec,
-        clip = clip
-    )
+    return shrinkOut(animationSpec, shrinkTowards.toAlignment(), clip) {
+        IntSize(it.width, targetHeight(it.height))
+    }
 }
 
 /**
@@ -646,19 +628,18 @@
  *
  * @sample androidx.compose.animation.samples.SlideTransition
  *
+ * @param animationSpec the animation used for the slide-in, [spring] by default.
  * @param initialOffsetX a lambda that takes the full width of the content in pixels and returns the
  *                             initial offset for the slide-in, by default it returns `-fullWidth/2`
- * @param animationSpec the animation used for the slide-in, [spring] by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun slideInHorizontally(
-    initialOffsetX: (fullWidth: Int) -> Int = { -it / 2 },
     animationSpec: FiniteAnimationSpec<IntOffset> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntOffset.VisibilityThreshold
         ),
+    initialOffsetX: (fullWidth: Int) -> Int = { -it / 2 },
 ): EnterTransition =
     slideIn(
         initialOffset = { IntOffset(initialOffsetX(it.width), 0) },
@@ -678,19 +659,18 @@
  *
  * @sample androidx.compose.animation.samples.FullyLoadedTransition
  *
+ * @param animationSpec the animation used for the slide-in, [spring] by default.
  * @param initialOffsetY a lambda that takes the full Height of the content and returns the
  *                           initial offset for the slide-in, by default it returns `-fullHeight/2`
- * @param animationSpec the animation used for the slide-in, [spring] by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun slideInVertically(
-    initialOffsetY: (fullHeight: Int) -> Int = { -it / 2 },
     animationSpec: FiniteAnimationSpec<IntOffset> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntOffset.VisibilityThreshold
         ),
+    initialOffsetY: (fullHeight: Int) -> Int = { -it / 2 },
 ): EnterTransition =
     slideIn(
         initialOffset = { IntOffset(0, initialOffsetY(it.height)) },
@@ -710,19 +690,18 @@
  *
  * @sample androidx.compose.animation.samples.SlideTransition
  *
+ * @param animationSpec the animation used for the slide-out, [spring] by default.
  * @param targetOffsetX a lambda that takes the full width of the content and returns the
  *                             initial offset for the slide-in, by default it returns `fullWidth/2`
- * @param animationSpec the animation used for the slide-out, [spring] by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun slideOutHorizontally(
-    targetOffsetX: (fullWidth: Int) -> Int = { -it / 2 },
     animationSpec: FiniteAnimationSpec<IntOffset> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntOffset.VisibilityThreshold
         ),
+    targetOffsetX: (fullWidth: Int) -> Int = { -it / 2 },
 ): ExitTransition =
     slideOut(
         targetOffset = { IntOffset(targetOffsetX(it.width), 0) },
@@ -740,19 +719,18 @@
  * absolute value. It defaults to return half of the negative height, which would slide the content
  * up by half of its Height.
  *
+ * @param animationSpec the animation used for the slide-out, [spring] by default.
  * @param targetOffsetY a lambda that takes the full Height of the content and returns the
  *                         target offset for the slide-out, by default it returns `fullHeight/2`
- * @param animationSpec the animation used for the slide-out, [spring] by default.
  */
 @Stable
-@ExperimentalAnimationApi
 fun slideOutVertically(
-    targetOffsetY: (fullHeight: Int) -> Int = { -it / 2 },
     animationSpec: FiniteAnimationSpec<IntOffset> =
         spring(
             stiffness = Spring.StiffnessMediumLow,
             visibilityThreshold = IntOffset.VisibilityThreshold
         ),
+    targetOffsetY: (fullHeight: Int) -> Int = { -it / 2 },
 ): ExitTransition =
     slideOut(
         targetOffset = { IntOffset(0, targetOffsetY(it.height)) },
@@ -784,11 +762,9 @@
     val animationSpec: FiniteAnimationSpec<Float>
 )
 
-@OptIn(ExperimentalAnimationApi::class)
 @Immutable
 private class EnterTransitionImpl(override val data: TransitionData) : EnterTransition()
 
-@ExperimentalAnimationApi
 @Immutable
 private class ExitTransitionImpl(override val data: TransitionData) : ExitTransition()
 
@@ -932,10 +908,11 @@
     return modifier
 }
 
-private val TransformOriginVectorConverter = TwoWayConverter<TransformOrigin, AnimationVector2D>(
-    convertToVector = { AnimationVector2D(it.pivotFractionX, it.pivotFractionY) },
-    convertFromVector = { TransformOrigin(it.v1, it.v2) }
-)
+private val TransformOriginVectorConverter =
+    TwoWayConverter<TransformOrigin, AnimationVector2D>(
+        convertToVector = { AnimationVector2D(it.pivotFractionX, it.pivotFractionY) },
+        convertFromVector = { TransformOrigin(it.v1, it.v2) }
+    )
 
 private val DefaultAlpha = mutableStateOf(1f)
 private val DefaultAlphaAndScaleSpring = spring<Float>(stiffness = Spring.StiffnessMediumLow)
@@ -980,7 +957,7 @@
     val lazyAnimation: Transition<EnterExitState>.DeferredAnimation<IntOffset, AnimationVector2D>,
     val slideIn: State<Slide?>,
     val slideOut: State<Slide?>
-) : LayoutModifier {
+) : LayoutModifierWithPassThroughIntrinsics() {
     val transitionSpec: Transition.Segment<EnterExitState>.() -> FiniteAnimationSpec<IntOffset> =
         {
             when {
@@ -1080,7 +1057,8 @@
             expandShrinkModifier.currentAlignment = alignment.value ?: Alignment.TopStart
         }
         val disableClip = expand.value?.clip == false || shrink.value?.clip == false
-        this.then(if (disableClip) Modifier else Modifier.clipToBounds()).then(expandShrinkModifier)
+        this.then(if (disableClip) Modifier else Modifier.clipToBounds())
+            .then(expandShrinkModifier)
     } else {
         this
     }
@@ -1097,7 +1075,7 @@
     val expand: State<ChangeSize?>,
     val shrink: State<ChangeSize?>,
     val alignment: State<Alignment?>
-) : LayoutModifier {
+) : LayoutModifierWithPassThroughIntrinsics() {
     var currentAlignment: Alignment? = null
     val sizeTransitionSpec: Transition.Segment<EnterExitState>.() -> FiniteAnimationSpec<IntSize> =
         {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
index 35c60e9..c1be5cc 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
@@ -54,6 +54,7 @@
             4100 to "1.1.0-alpha02",
             4200 to "1.1.0-alpha03",
             4300 to "1.1.0-alpha04",
+            4400 to "1.1.0-alpha05",
         )
 
         /**
@@ -66,7 +67,7 @@
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        const val compilerVersion: String = "1.1.0-alpha04"
+        const val compilerVersion: String = "1.1.0-alpha05"
         private val minimumRuntimeVersion: String
             get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
index 26d96f2..72a675c 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
@@ -32,6 +32,7 @@
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.VerticalAlignmentLine
 import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.layout.positionInParent
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.Ref
@@ -4157,6 +4158,22 @@
         assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
     }
 
+    @Test
+    fun scenarioShouldNotCrash() {
+        val latch = CountDownLatch(1)
+
+        show {
+            Column(modifier = Modifier.width(IntrinsicSize.Max)) {
+                Row(Modifier.width(200.dp)) {
+                    Box(Modifier.weight(0.8f))
+                    Box(Modifier.weight(0.2f).onSizeChanged { latch.countDown() })
+                }
+            }
+        }
+
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+    }
+
     // endregion
 
     // region Modifiers specific tests
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
index 5406975..228c1a3 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
@@ -748,7 +748,13 @@
         if (weight > 0f) {
             crossAxisMax = max(
                 crossAxisMax,
-                child.crossAxisSize((weightUnitSpace * weight).roundToInt())
+                child.crossAxisSize(
+                    if (weightUnitSpace != Constraints.Infinity) {
+                        (weightUnitSpace * weight).roundToInt()
+                    } else {
+                        Constraints.Infinity
+                    }
+                )
             )
         }
     }
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index 7dc5ae8..d6e0cc0 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -59,6 +59,7 @@
         androidTestImplementation(project(":compose:test-utils"))
         androidTestImplementation(project(":compose:ui:ui-test-font"))
         androidTestImplementation(project(":test:screenshot:screenshot"))
+        androidTestImplementation(project(":internal-testutils-runtime"))
         androidTestImplementation(libs.testUiautomator)
         androidTestImplementation(libs.testRules)
         androidTestImplementation(libs.testRunner)
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index f947230..3d87572 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -27,6 +27,7 @@
 import androidx.compose.foundation.gestures.FlingBehavior
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.gestures.animateScrollBy
+import androidx.compose.foundation.horizontalScroll
 import androidx.compose.foundation.interaction.collectIsDraggedAsState
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
@@ -36,13 +37,16 @@
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.widthIn
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.lazy.GridCells
 import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.LazyListScope
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.LazyVerticalGrid
 import androidx.compose.foundation.lazy.items
@@ -53,11 +57,13 @@
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.material.Button
+import androidx.compose.material.Checkbox
 import androidx.compose.material.DropdownMenu
 import androidx.compose.material.DropdownMenuItem
 import androidx.compose.material.Icon
 import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.OutlinedButton
+import androidx.compose.material.RadioButton
 import androidx.compose.material.Text
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.ArrowDropDown
@@ -98,7 +104,7 @@
     ComposableDemo("LazyRow DSL") { LazyRowScope() },
     ComposableDemo("LazyColumn with sticky headers") { StickyHeaderSample() },
     ComposableDemo("Arrangements") { LazyListArrangements() },
-    ComposableDemo("Reverse scroll direction") { ReverseLayout() },
+    ComposableDemo("ReverseLayout and RTL") { ReverseLayoutAndRtlDemo() },
     ComposableDemo("Nested lazy lists") { NestedLazyDemo() },
     ComposableDemo("LazyGrid") { LazyGridDemo() },
     ComposableDemo("LazyGrid with Spacing") { LazyGridWithSpacingDemo() },
@@ -436,72 +442,144 @@
 )
 
 @Composable
-fun ReverseLayout() {
+private fun ReverseLayoutAndRtlDemo() {
+    val backgroundColor = Color(1f, .8f, .8f)
     Column {
         val scrollState = rememberScrollState()
         val lazyState = rememberLazyListState()
-        var count by remember { mutableStateOf(3) }
-        var reverse by remember { mutableStateOf(true) }
-        Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) {
-            Button(onClick = { count -= 5 }) {
+        var count by remember { mutableStateOf(10) }
+        var reverse by remember { mutableStateOf(false) }
+        var rtl by remember { mutableStateOf(false) }
+        var column by remember { mutableStateOf(true) }
+        val direction = if (rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
+
+        Row(
+            modifier = Modifier.padding(10.dp),
+            horizontalArrangement = Arrangement.spacedBy(10.dp),
+            verticalAlignment = Alignment.CenterVertically
+        ) {
+            Button(onClick = { count = max(0, count - 5) }) {
                 Text("--")
             }
             Button(onClick = { count += 5 }) {
                 Text("++")
             }
-            Button(onClick = { reverse = !reverse }) {
-                Text("=!")
-            }
-            Text("Scroll=${scrollState.value.toInt()}")
-            Text(
-                "Lazy=${lazyState.firstVisibleItemIndex}; " +
-                    "${lazyState.firstVisibleItemScrollOffset}"
-            )
-        }
-        Row {
-            val item1 = @Composable { index: Int ->
-                Text(
-                    "$index",
-                    Modifier
-                        .requiredHeight(200.dp)
-                        .fillMaxWidth()
-                        .background(Color.Red)
-                        .border(1.dp, Color.Cyan)
-                )
-            }
-            val item2 = @Composable { index: Int ->
-                Text("After $index")
-            }
-            Column(
-                verticalArrangement = if (reverse) Arrangement.Bottom else Arrangement.Top,
-                modifier = Modifier
-                    .weight(1f)
-                    .fillMaxHeight()
-                    .verticalScroll(scrollState, reverseScrolling = reverse)
-            ) {
-                if (reverse) {
-                    (count - 1 downTo 0).forEach {
-                        item2(it)
-                        item1(it)
-                    }
-                } else {
-                    (0 until count).forEach {
-                        item1(it)
-                        item2(it)
-                    }
+            Column {
+                Row {
+                    Checkbox(checked = reverse, onCheckedChange = { reverse = it })
+                    Text("reverse")
+                }
+                Row {
+                    Checkbox(checked = rtl, onCheckedChange = { rtl = it })
+                    Text("RTL")
                 }
             }
-            LazyColumn(
-                reverseLayout = reverse,
-                state = lazyState,
-                modifier = Modifier.weight(1f).fillMaxHeight()
-            ) {
-                items(count) {
+            Column {
+                Row {
+                    RadioButton(selected = column, { column = true })
+                    Text("Cols")
+                }
+                Row {
+                    RadioButton(selected = !column, { column = false })
+                    Text("Rows")
+                }
+            }
+        }
+
+        val itemModifier = if (column) {
+            Modifier.heightIn(200.dp).fillMaxWidth()
+        } else {
+            Modifier.widthIn(200.dp).fillMaxHeight()
+        }
+        val item1 = @Composable { index: Int ->
+            Text(
+                "${index}A",
+                itemModifier
+                    .background(backgroundColor)
+                    .border(1.dp, Color.Cyan)
+            )
+        }
+        val item2 = @Composable { index: Int ->
+            Text("${index}B")
+        }
+
+        @Composable
+        fun NonLazyContent() {
+            if (reverse) {
+                (count - 1 downTo 0).forEach {
+                    item2(it)
+                    item1(it)
+                }
+            } else {
+                (0 until count).forEach {
                     item1(it)
                     item2(it)
                 }
             }
         }
+        val lazyContent: LazyListScope.() -> Unit = {
+            items(count) {
+                item1(it)
+                item2(it)
+            }
+        }
+
+        if (column) {
+            Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) {
+                Text("Column: scroll=${scrollState.value}", Modifier.weight(1f))
+                Text(
+                    "LazyColumn: index=${lazyState.firstVisibleItemIndex}, " +
+                        "offset=${lazyState.firstVisibleItemScrollOffset}",
+                    Modifier.weight(1f)
+                )
+            }
+            Row {
+                CompositionLocalProvider(LocalLayoutDirection provides direction) {
+                    Column(
+                        verticalArrangement = if (reverse) Arrangement.Bottom else Arrangement.Top,
+                        modifier = Modifier
+                            .weight(1f)
+                            .fillMaxHeight()
+                            .verticalScroll(scrollState, reverseScrolling = reverse)
+                    ) {
+                        NonLazyContent()
+                    }
+                }
+                CompositionLocalProvider(LocalLayoutDirection provides direction) {
+                    LazyColumn(
+                        reverseLayout = reverse,
+                        state = lazyState,
+                        modifier = Modifier.weight(1f).fillMaxHeight(),
+                        content = lazyContent
+                    )
+                }
+            }
+        } else {
+            Text("Row: scroll=${scrollState.value}")
+            CompositionLocalProvider(LocalLayoutDirection provides direction) {
+                Row(
+                    horizontalArrangement = if (reverse) Arrangement.End else Arrangement.Start,
+                    modifier = Modifier
+                        .weight(1f)
+                        .fillMaxWidth()
+                        .horizontalScroll(scrollState, reverseScrolling = reverse)
+                ) {
+                    NonLazyContent()
+                }
+            }
+            Text(
+                "LazyRow: index=${lazyState.firstVisibleItemIndex}, " +
+                    "offset=${lazyState.firstVisibleItemScrollOffset}"
+            )
+            CompositionLocalProvider(LocalLayoutDirection provides direction) {
+                LazyRow(
+                    state = lazyState,
+                    modifier = Modifier.weight(1f).fillMaxWidth(),
+                    reverseLayout = reverse,
+                    content = lazyContent
+                )
+            }
+        }
     }
 }
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollScreenshotTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollScreenshotTest.kt
index b73ffa2..ea71fa3 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollScreenshotTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollScreenshotTest.kt
@@ -46,6 +46,7 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.screenshot.AndroidXScreenshotTestRule
+import androidx.testutils.AnimationDurationScaleRule
 import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
@@ -62,11 +63,16 @@
     @get:Rule
     val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
 
+    @get:Rule
+    val animationScaleRule: AnimationDurationScaleRule =
+        AnimationDurationScaleRule.createForAllTests(1f)
+
     val overScrollTag = "overScrollTag"
 
     @Test
-    @Ignore
+    @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragTop() {
+        animationScaleRule.setAnimationDurationScale(1f)
         rule.setContent {
             VerticalScrollable()
         }
@@ -86,8 +92,9 @@
     }
 
     @Test
-    @Ignore
+    @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragBottom() {
+        animationScaleRule.setAnimationDurationScale(1f)
         rule.setContent {
             VerticalScrollable()
         }
@@ -107,8 +114,9 @@
     }
 
     @Test
-    @Ignore
+    @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragLeft() {
+        animationScaleRule.setAnimationDurationScale(1f)
         rule.setContent {
             HorizontalScrollable()
         }
@@ -128,8 +136,9 @@
     }
 
     @Test
-    @Ignore
+    @Ignore("b/197325932 no animations in screenshot tests")
     fun overscroll_dragRight() {
+        animationScaleRule.setAnimationDurationScale(1f)
         rule.setContent {
             HorizontalScrollable()
         }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/StretchOverscrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/StretchOverscrollTest.kt
index 186959b4..eb7ad6ed 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/StretchOverscrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/StretchOverscrollTest.kt
@@ -22,10 +22,11 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.foundation.lazy.LazyRow
-import androidx.compose.foundation.text.timeNowMillis
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalViewConfiguration
+import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -34,11 +35,12 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
+import androidx.testutils.AnimationDurationScaleRule
 import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import kotlin.math.abs
 
 @MediumTest
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
@@ -47,12 +49,18 @@
     @get:Rule
     val rule = createComposeRule()
 
+    @get:Rule
+    val animationScaleRule: AnimationDurationScaleRule =
+        AnimationDurationScaleRule.createForAllTests(1f)
+
     @Test
-    @Ignore("platform animaiton are turned off. Figure this out in b/197325932")
     fun stretchOverscroll_whenPulled_consumesOppositePreScroll() {
         val color = listOf(Color.Red, Color.Yellow, Color.Blue, Color.Green)
         val lazyState = LazyListState()
+        animationScaleRule.setAnimationDurationScale(1f)
+        var viewConfiguration: ViewConfiguration? = null
         rule.setContent {
+            viewConfiguration = LocalViewConfiguration.current
             LazyRow(
                 state = lazyState,
                 modifier = Modifier.size(300.dp).testTag(OverscrollBox)
@@ -63,29 +71,19 @@
             }
         }
 
-        var now = timeNowMillis()
-        rule.waitUntil(10000) { timeNowMillis() - now > 3000 }
-
         rule.onNodeWithTag(OverscrollBox).performTouchInput {
             down(center)
             moveBy(Offset(200f, 0f))
-            moveBy(Offset(200f, 0f))
-            moveBy(Offset(200f, 0f))
-        }
-
-        now = timeNowMillis()
-        rule.waitUntil(10000) { timeNowMillis() - now > 3000 }
-
-        rule.onNodeWithTag(OverscrollBox).performTouchInput {
             // pull in the opposite direction. Since we pulled overscroll with positive delta
             // it will consume negative delta before scroll happens
             // assert in the ScrollableState lambda will check it
-            moveBy(Offset(-30f, 0f))
+            moveBy(Offset(-200f + (viewConfiguration?.touchSlop ?: 0f), 0f))
             up()
         }
+
         rule.runOnIdle {
             // no scroll happened as it was consumed by the overscroll logic
-            assertThat(lazyState.firstVisibleItemScrollOffset).isEqualTo(0)
+            assertThat(abs(lazyState.firstVisibleItemScrollOffset)).isLessThan(2) // round error
             assertThat(lazyState.firstVisibleItemIndex).isEqualTo(0)
         }
     }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
index c556da3..c22018e 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyArrangementsTest.kt
@@ -16,15 +16,22 @@
 
 package androidx.compose.foundation.lazy
 
+import androidx.compose.foundation.gestures.scrollBy
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
@@ -33,6 +40,8 @@
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -274,6 +283,152 @@
             .assertLeftPositionInRootIsEqualTo(itemSize * 2.5f)
     }
 
+    @Test
+    fun column_scrollingByExactlyTheItemSizePlusSpacer_switchesTheFirstVisibleItem() {
+        val itemSizePx = 30
+        val spacingSizePx = 4
+        val itemSize = with(rule.density) { itemSizePx.toDp() }
+        val spacingSize = with(rule.density) { spacingSizePx.toDp() }
+        lateinit var state: LazyListState
+        rule.setContentWithTestViewConfiguration {
+            LazyColumn(
+                Modifier.size(itemSize * 3),
+                state = rememberLazyListState().also { state = it },
+                verticalArrangement = Arrangement.spacedBy(spacingSize)
+            ) {
+                items(5) {
+                    Spacer(
+                        Modifier.size(itemSize).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy((itemSizePx + spacingSizePx).toFloat())
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsNotDisplayed()
+
+        rule.runOnIdle {
+            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
+        }
+    }
+
+    @Test
+    fun column_scrollingByExactlyTheItemSizePlusHalfTheSpacer_staysOnTheSameItem() {
+        val itemSizePx = 30
+        val spacingSizePx = 4
+        val itemSize = with(rule.density) { itemSizePx.toDp() }
+        val spacingSize = with(rule.density) { spacingSizePx.toDp() }
+        lateinit var state: LazyListState
+        rule.setContentWithTestViewConfiguration {
+            LazyColumn(
+                Modifier.size(itemSize * 3),
+                state = rememberLazyListState().also { state = it },
+                verticalArrangement = Arrangement.spacedBy(spacingSize)
+            ) {
+                items(5) {
+                    Spacer(
+                        Modifier.size(itemSize).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat())
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsNotDisplayed()
+
+        rule.runOnIdle {
+            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
+            assertThat(state.firstVisibleItemScrollOffset)
+                .isEqualTo(itemSizePx + spacingSizePx / 2)
+        }
+    }
+
+    @Test
+    fun row_scrollingByExactlyTheItemSizePlusSpacer_switchesTheFirstVisibleItem() {
+        val itemSizePx = 30
+        val spacingSizePx = 4
+        val itemSize = with(rule.density) { itemSizePx.toDp() }
+        val spacingSize = with(rule.density) { spacingSizePx.toDp() }
+        lateinit var state: LazyListState
+        rule.setContentWithTestViewConfiguration {
+            LazyRow(
+                Modifier.size(itemSize * 3),
+                state = rememberLazyListState().also { state = it },
+                horizontalArrangement = Arrangement.spacedBy(spacingSize)
+            ) {
+                items(5) {
+                    Spacer(
+                        Modifier.size(itemSize).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy((itemSizePx + spacingSizePx).toFloat())
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsNotDisplayed()
+
+        rule.runOnIdle {
+            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
+        }
+    }
+
+    @Test
+    fun row_scrollingByExactlyTheItemSizePlusHalfTheSpacer_staysOnTheSameItem() {
+        val itemSizePx = 30
+        val spacingSizePx = 4
+        val itemSize = with(rule.density) { itemSizePx.toDp() }
+        val spacingSize = with(rule.density) { spacingSizePx.toDp() }
+        lateinit var state: LazyListState
+        rule.setContentWithTestViewConfiguration {
+            LazyRow(
+                Modifier.size(itemSize * 3),
+                state = rememberLazyListState().also { state = it },
+                horizontalArrangement = Arrangement.spacedBy(spacingSize)
+            ) {
+                items(5) {
+                    Spacer(
+                        Modifier.size(itemSize).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy((itemSizePx + spacingSizePx / 2).toFloat())
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsNotDisplayed()
+
+        rule.runOnIdle {
+            assertThat(state.firstVisibleItemIndex).isEqualTo(0)
+            assertThat(state.firstVisibleItemScrollOffset)
+                .isEqualTo(itemSizePx + spacingSizePx / 2)
+        }
+    }
+
     // with reverseLayout == true
 
     @Test
@@ -310,6 +465,52 @@
         )
     }
 
+    @Test
+    fun column_whenArrangementChanges() {
+        var arrangement by mutableStateOf(Arrangement.Top)
+        rule.setContent {
+            LazyColumn(
+                modifier = Modifier.requiredSize(containerSize),
+                verticalArrangement = arrangement
+            ) {
+                items(2) {
+                    Item(it)
+                }
+            }
+        }
+
+        assertArrangementForTwoItems(Arrangement.Top)
+
+        rule.runOnIdle {
+            arrangement = Arrangement.Bottom
+        }
+
+        assertArrangementForTwoItems(Arrangement.Bottom)
+    }
+
+    @Test
+    fun row_whenArrangementChanges() {
+        var arrangement by mutableStateOf(Arrangement.Start)
+        rule.setContent {
+            LazyRow(
+                modifier = Modifier.requiredSize(containerSize),
+                horizontalArrangement = arrangement
+            ) {
+                items(2) {
+                    Item(it)
+                }
+            }
+        }
+
+        assertArrangementForTwoItems(Arrangement.Start, LayoutDirection.Ltr)
+
+        rule.runOnIdle {
+            arrangement = Arrangement.End
+        }
+
+        assertArrangementForTwoItems(Arrangement.End, LayoutDirection.Ltr)
+    }
+
     fun composeColumnWith(arrangement: Arrangement.Vertical) {
         rule.setContent {
             LazyColumn(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListTest.kt
index d433865..e48ffbb 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListTest.kt
@@ -1487,6 +1487,34 @@
         rule.onNodeWithTag("0").assertDoesNotExist()
     }
 
+    @Test
+    fun scrollingByExactlyTheItemSize_switchesTheFirstVisibleItem() {
+        val itemSize = with(rule.density) { 30.toDp() }
+        lateinit var state: LazyListState
+        rule.setContentWithTestViewConfiguration {
+            LazyColumnOrRow(
+                Modifier.mainAxisSize(itemSize * 3),
+                state = rememberLazyListState().also { state = it },
+            ) {
+                items(5) {
+                    Spacer(
+                        Modifier.size(itemSize).testTag("$it")
+                    )
+                }
+            }
+        }
+
+        state.scrollBy(itemSize)
+
+        rule.onNodeWithTag("0")
+            .assertIsNotDisplayed()
+
+        rule.runOnIdle {
+            assertThat(state.firstVisibleItemIndex).isEqualTo(1)
+            assertThat(state.firstVisibleItemScrollOffset).isEqualTo(0)
+        }
+    }
+
     // ********************* END OF TESTS *********************
     // Helper functions, etc. live below here
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt
index e7e1ae7..8ad1b08 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListsReverseLayoutTest.kt
@@ -19,6 +19,9 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
@@ -439,4 +442,62 @@
         rule.onNodeWithTag("2")
             .assertLeftPositionInRootIsEqualTo(itemSize * 2 - scrolled)
     }
+
+    @Test
+    fun column_whenParameterChanges() {
+        var reverse by mutableStateOf(true)
+        rule.setContentWithTestViewConfiguration {
+            LazyColumn(
+                reverseLayout = reverse
+            ) {
+                item {
+                    Box(Modifier.requiredSize(itemSize).testTag("0"))
+                    Box(Modifier.requiredSize(itemSize).testTag("1"))
+                }
+            }
+        }
+
+        rule.onNodeWithTag("1")
+            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0")
+            .assertTopPositionInRootIsEqualTo(itemSize)
+
+        rule.runOnIdle {
+            reverse = false
+        }
+
+        rule.onNodeWithTag("0")
+            .assertTopPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1")
+            .assertTopPositionInRootIsEqualTo(itemSize)
+    }
+
+    @Test
+    fun row_whenParameterChanges() {
+        var reverse by mutableStateOf(true)
+        rule.setContentWithTestViewConfiguration {
+            LazyRow(
+                reverseLayout = reverse
+            ) {
+                item {
+                    Box(Modifier.requiredSize(itemSize).testTag("0"))
+                    Box(Modifier.requiredSize(itemSize).testTag("1"))
+                }
+            }
+        }
+
+        rule.onNodeWithTag("1")
+            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("0")
+            .assertLeftPositionInRootIsEqualTo(itemSize)
+
+        rule.runOnIdle {
+            reverse = false
+        }
+
+        rule.onNodeWithTag("0")
+            .assertLeftPositionInRootIsEqualTo(0.dp)
+        rule.onNodeWithTag("1")
+            .assertLeftPositionInRootIsEqualTo(itemSize)
+    }
 }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher.android.kt
index 4d2f45d..aeb1150 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher.android.kt
@@ -24,10 +24,8 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.layout.SubcomposeLayoutState
 import androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle
-import androidx.compose.ui.layout.SubcomposeMeasureScope
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.util.fastAny
-import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.trace
 import java.util.concurrent.TimeUnit
 
@@ -260,23 +258,20 @@
         }
     }
 
-    override fun SubcomposeMeasureScope.onPostMeasure(result: LazyLayoutMeasureResult) {
+    override fun onPostMeasure(
+        result: LazyLayoutMeasureResult,
+        placeablesProvider: LazyLayoutPlaceablesProvider
+    ) {
         val index = indexToPrefetch
         if (premeasuringIsNeeded && index != -1) {
             check(isActive)
             val itemsProvider = state.itemsProvider()
             if (index < itemsProvider.itemsCount) {
                 val isVisibleAlready = result.visibleItemsInfo.fastAny { it.index == index }
-                val composedButNotVisible = result.composedButNotVisibleItemsIndices != null &&
-                    result.composedButNotVisibleItemsIndices!!.fastAny { it == index }
-                if (isVisibleAlready || composedButNotVisible) {
+                if (isVisibleAlready) {
                     premeasuringIsNeeded = false
                 } else {
-                    val key = itemsProvider.getKey(index)
-                    val content = itemContentFactory.getContent(index, key)
-                    subcompose(key, content).fastForEach {
-                        it.measure(prefetchPolicy.constraints)
-                    }
+                    placeablesProvider.getAndMeasure(index, prefetchPolicy.constraints)
                 }
             }
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index 76b6712..16532b7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -89,9 +89,9 @@
         reverseLayout,
         isVertical,
         horizontalAlignment,
-        verticalArrangement,
         verticalAlignment,
-        horizontalArrangement
+        horizontalArrangement,
+        verticalArrangement
     )
 
     state.prefetchPolicy = rememberLazyLayoutPrefetchPolicy()
@@ -218,14 +218,24 @@
     isVertical: Boolean,
     /** The alignment to align items horizontally. Required when isVertical is true */
     horizontalAlignment: Alignment.Horizontal? = null,
-    /** The vertical arrangement for items. Required when isVertical is true */
-    verticalArrangement: Arrangement.Vertical? = null,
     /** The alignment to align items vertically. Required when isVertical is false */
     verticalAlignment: Alignment.Vertical? = null,
     /** The horizontal arrangement for items. Required when isVertical is false */
-    horizontalArrangement: Arrangement.Horizontal? = null
-) = remember {
-    LazyMeasurePolicy { measurables, constraints ->
+    horizontalArrangement: Arrangement.Horizontal? = null,
+    /** The vertical arrangement for items. Required when isVertical is true */
+    verticalArrangement: Arrangement.Vertical? = null
+) = remember(
+    state,
+    overScrollController,
+    contentPadding,
+    reverseLayout,
+    isVertical,
+    horizontalAlignment,
+    verticalAlignment,
+    horizontalArrangement,
+    verticalArrangement
+) {
+    LazyMeasurePolicy { placeablesProvider, constraints ->
         constraints.assertNotNestingScrollableContainers(isVertical)
 
         val itemsProvider = stateOfItemsProvider.value
@@ -261,7 +271,7 @@
             constraints,
             isVertical,
             itemsProvider,
-            measurables
+            placeablesProvider
         ) { index, key, placeables ->
             // we add spaceBetweenItems as an extra spacing for all items apart from the last one so
             // the lazy list measuring logic will take it into account.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
index ebe64e6..044999d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation.lazy
 
-import androidx.compose.ui.util.fastFirstOrNull
 import androidx.compose.ui.util.fastForEach
 
 /**
@@ -24,15 +23,12 @@
  *
  * @param composedVisibleItems list of items already composed and expected to be visible. if the
  * header wasn't in this list but is needed the header will be added as the first item in this list.
- * @param notUsedButComposedItems list of items already composed, but not going to be visible as
- * their position is not within the viewport. in some conditions the header could be in this list.
  * @param itemProvider the provider so we can compose a header if it wasn't composed already
  * @param headerIndexes list of indexes of headers. Must be sorted.
  * @param startContentPadding the padding before the first item in the list
  */
 internal fun findOrComposeLazyListHeader(
     composedVisibleItems: MutableList<LazyMeasuredItem>,
-    notUsedButComposedItems: List<LazyMeasuredItem>?,
     itemProvider: LazyMeasuredItemProvider,
     headerIndexes: List<Int>,
     startContentPadding: Int
@@ -73,10 +69,6 @@
     }
 
     val headerItem = alreadyVisibleHeaderItem
-        ?: notUsedButComposedItems?.fastFirstOrNull { it.index == currentHeaderListPosition }
-            ?.also {
-                composedVisibleItems.add(0, it)
-            }
         ?: itemProvider.getAndMeasure(DataIndex(currentHeaderListPosition)).also {
             composedVisibleItems.add(0, it)
         }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
index e121f8b..3da26e5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
@@ -61,7 +61,6 @@
             firstVisibleItemScrollOffset = 0,
             canScrollForward = false,
             consumedScroll = 0f,
-            composedButNotVisibleItems = null,
             measureResult = layout(constraints.minWidth, constraints.minHeight) {},
             visibleItemsInfo = emptyList(),
             viewportStartOffset = -startContentPadding,
@@ -126,11 +125,6 @@
         // neutralize previously added start padding as we stopped filling the start padding area
         currentFirstItemScrollOffset += startContentPadding
 
-        // remembers the composed MeasuredItem which we are not currently placing as they are out
-        // of screen. it is possible we will need to place them if the remaining items will
-        // not fill the whole viewport and we will need to scroll back
-        var notUsedButComposedItems: MutableList<LazyMeasuredItem>? = null
-
         var index = currentFirstItemIndex
         val maxMainAxis = maxOffset + endContentPadding
         var mainAxisUsed = -currentFirstItemScrollOffset
@@ -146,16 +140,10 @@
             val measuredItem = itemProvider.getAndMeasure(index)
             mainAxisUsed += measuredItem.sizeWithSpacings
 
-            if (mainAxisUsed < minOffset) {
+            if (mainAxisUsed <= minOffset) {
                 // this item is offscreen and will not be placed. advance firstVisibleItemIndex
                 currentFirstItemIndex = index + 1
                 currentFirstItemScrollOffset -= measuredItem.sizeWithSpacings
-                // but remember the corresponding placeables in case we will be forced to
-                // scroll back as there were not enough items to fill the viewport
-                if (notUsedButComposedItems == null) {
-                    notUsedButComposedItems = mutableListOf()
-                }
-                notUsedButComposedItems.add(measuredItem)
             } else {
                 maxCrossAxis = maxOf(maxCrossAxis, measuredItem.crossAxisSize)
                 visibleItems.add(measuredItem)
@@ -171,17 +159,12 @@
             currentFirstItemScrollOffset -= toScrollBack
             mainAxisUsed += toScrollBack
             while (currentFirstItemScrollOffset < 0 && currentFirstItemIndex > DataIndex(0)) {
-                val previous = DataIndex(currentFirstItemIndex.value - 1)
-                val alreadyComposedIndex = notUsedButComposedItems?.lastIndex ?: -1
-                val measuredItem = if (alreadyComposedIndex >= 0) {
-                    notUsedButComposedItems!!.removeAt(alreadyComposedIndex)
-                } else {
-                    itemProvider.getAndMeasure(previous)
-                }
+                val previousIndex = DataIndex(currentFirstItemIndex.value - 1)
+                val measuredItem = itemProvider.getAndMeasure(previousIndex)
                 visibleItems.add(0, measuredItem)
                 maxCrossAxis = maxOf(maxCrossAxis, measuredItem.crossAxisSize)
                 currentFirstItemScrollOffset += measuredItem.sizeWithSpacings
-                currentFirstItemIndex = previous
+                currentFirstItemIndex = previousIndex
             }
             scrollDelta += toScrollBack
             if (currentFirstItemScrollOffset < 0) {
@@ -242,7 +225,6 @@
         val headerItem = if (headerIndexes.isNotEmpty()) {
             findOrComposeLazyListHeader(
                 composedVisibleItems = visibleItems,
-                notUsedButComposedItems = notUsedButComposedItems,
                 itemProvider = itemProvider,
                 headerIndexes = headerIndexes,
                 startContentPadding = startContentPadding
@@ -258,7 +240,6 @@
             firstVisibleItemScrollOffset = currentFirstItemScrollOffset,
             canScrollForward = mainAxisUsed > maxOffset,
             consumedScroll = consumedScroll,
-            composedButNotVisibleItems = notUsedButComposedItems,
             measureResult = layout(layoutWidth, layoutHeight) {
                 visibleItems.fastForEach {
                     if (it !== headerItem) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
index 9378177..a1c3315 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
@@ -34,11 +34,9 @@
     val canScrollForward: Boolean,
     /** The amount of scroll consumed during the measure pass.*/
     val consumedScroll: Float,
-    /** List of items which were composed, but are not a part of [visibleItemsInfo].*/
-    val composedButNotVisibleItems: List<LazyMeasuredItem>?,
-    // MeasureResult defining the layout
+    /** MeasureResult defining the layout.*/
     val measureResult: MeasureResult,
-    // properties representing the info needed for LazyListLayoutInfo
+    // properties representing the info needed for LazyListLayoutInfo:
     /** see [LazyListLayoutInfo.visibleItemsInfo] */
     override val visibleItemsInfo: List<LazyListItemInfo>,
     /** see [LazyListLayoutInfo.viewportStartOffset] */
@@ -57,7 +55,5 @@
                         override val key: Any get() = it.key
                     }
                 }
-            override val composedButNotVisibleItemsIndices: List<Int>?
-                get() = composedButNotVisibleItems?.fastMap { it.index }
         }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 8438ae5..d5f755d0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -30,7 +30,6 @@
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.listSaver
 import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import kotlin.math.abs
 
@@ -347,12 +346,6 @@
                 )
             }
         )
-
-        /**
-         * Pre-allocated initial value for [LazyItemScopeImpl] to not have it nullable and
-         * avoid using late init.
-         */
-        private val InitialLazyItemsScopeImpl = LazyItemScopeImpl(Density(0f, 0f), Constraints())
     }
 }
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItemProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItemProvider.kt
index ebecce6..c76c48c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItemProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItemProvider.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.foundation.lazy
 
-import androidx.compose.foundation.lazy.layout.LazyMeasurablesProvider
+import androidx.compose.foundation.lazy.layout.LazyLayoutPlaceablesProvider
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.unit.Constraints
 
@@ -27,7 +27,7 @@
     constraints: Constraints,
     isVertical: Boolean,
     private val itemsProvider: LazyListItemsProvider,
-    private val measurables: LazyMeasurablesProvider,
+    private val placeablesProvider: LazyLayoutPlaceablesProvider,
     private val measuredItemFactory: MeasuredItemFactory
 ) {
     // the constraints we will measure child with. the main axis is not restricted
@@ -39,14 +39,10 @@
     /**
      * Used to subcompose items of lazy lists. Composed placeables will be measured with the
      * correct constraints and wrapped into [LazyMeasuredItem].
-     * This method can be called only once with each [index] per the measure pass.
      */
     fun getAndMeasure(index: DataIndex): LazyMeasuredItem {
         val key = itemsProvider.getKey(index.value)
-        val measurables = measurables[index.value]
-        val placeables = Array(measurables.size) {
-            measurables[it].measure(childConstraints)
-        }
+        val placeables = placeablesProvider.getAndMeasure(index.value, childConstraints)
         return measuredItemFactory.createItem(index, key, placeables)
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
index 0eb750b..4ad43a3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
@@ -47,14 +47,14 @@
     ) { constraints ->
         itemContentFactory.onBeforeMeasure(this, constraints)
 
-        val measurables = LazyMeasurablesProvider(
+        val placeablesProvider = LazyLayoutPlaceablesProvider(
             state.itemsProvider(),
             itemContentFactory,
             this
         )
-        val measureResult = with(measurePolicy) { measure(measurables, constraints) }
+        val measureResult = with(measurePolicy) { measure(placeablesProvider, constraints) }
 
-        state.onPostMeasureListener?.apply { onPostMeasure(measureResult) }
+        state.onPostMeasureListener?.apply { onPostMeasure(measureResult, placeablesProvider) }
         state.layoutInfoState.value = measureResult
         state.layoutInfoNonObservable = measureResult
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureResult.kt
index 5391b0d..187f961 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutMeasureResult.kt
@@ -23,7 +23,4 @@
      * The list of [LazyLayoutItemInfo] representing all the currently visible items.
      */
     override val visibleItemsInfo: List<LazyLayoutItemInfo>
-
-    // TODO(popam): this should really be removed / derived implicitly from the placement block.
-    val composedButNotVisibleItemsIndices: List<Int>?
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt
index 2ed35e0..f92a348 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt
@@ -22,7 +22,6 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.layout.Remeasurement
 import androidx.compose.ui.layout.RemeasurementModifier
-import androidx.compose.ui.layout.SubcomposeMeasureScope
 
 /**
  * Creates a [LazyLayoutState] that is remembered across recompositions.
@@ -90,7 +89,10 @@
 }
 
 internal interface LazyLayoutOnPostMeasureListener {
-    fun SubcomposeMeasureScope.onPostMeasure(result: LazyLayoutMeasureResult)
+    fun onPostMeasure(
+        result: LazyLayoutMeasureResult,
+        placeablesProvider: LazyLayoutPlaceablesProvider
+    )
 }
 
 private object NoItemsProvider : LazyLayoutItemsProvider {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyMeasurePolicy.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyMeasurePolicy.kt
index 115410b..1d76738 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyMeasurePolicy.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyMeasurePolicy.kt
@@ -17,8 +17,8 @@
 package androidx.compose.foundation.lazy.layout
 
 import androidx.compose.runtime.Stable
-import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.SubcomposeMeasureScope
 import androidx.compose.ui.unit.Constraints
 
@@ -28,21 +28,40 @@
 @Stable
 internal fun interface LazyMeasurePolicy {
     fun MeasureScope.measure(
-        measurables: LazyMeasurablesProvider,
+        placeablesProvider: LazyLayoutPlaceablesProvider,
         constraints: Constraints
     ): LazyLayoutMeasureResult
 }
 
-/** A lazily evaluated "list" of [Measurable]s. */
 @Stable
-internal class LazyMeasurablesProvider internal constructor(
+internal class LazyLayoutPlaceablesProvider internal constructor(
     private val itemsProvider: LazyLayoutItemsProvider,
     private val itemContentFactory: LazyLayoutItemContentFactory,
     private val subcomposeMeasureScope: SubcomposeMeasureScope
 ) {
-    operator fun get(index: Int): List<Measurable> {
-        val key = itemsProvider.getKey(index)
-        val itemContent = itemContentFactory.getContent(index, key)
-        return subcomposeMeasureScope.subcompose(key, itemContent)
+
+    /**
+     * A cache of the previously composed items. It allows us to support [get]
+     * re-executions with the same index during the same measure pass.
+     */
+    private val placeablesCache = hashMapOf<Int, Array<Placeable>>()
+
+    /**
+     * Used to subcompose and measure the items of lazy layout.
+     */
+    fun getAndMeasure(index: Int, constraints: Constraints): Array<Placeable> {
+        val cachedPlaceable = placeablesCache[index]
+        return if (cachedPlaceable != null) {
+            cachedPlaceable
+        } else {
+            val key = itemsProvider.getKey(index)
+            val itemContent = itemContentFactory.getContent(index, key)
+            val measurables = subcomposeMeasureScope.subcompose(key, itemContent)
+            Array(measurables.size) {
+                measurables[it].measure(constraints)
+            }.also {
+                placeablesCache[index] = it
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt
index c82e59b..025cbf2 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.foundation.text
 
-import org.jetbrains.skija.BreakIterator
+import org.jetbrains.skia.BreakIterator
 
 internal actual fun String.findPrecedingBreak(index: Int): Int {
     val it = BreakIterator.makeCharacterInstance()
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/animation/Animation.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/animation/Animation.kt
index aec9435..ba25b0c 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/animation/Animation.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/animation/Animation.kt
@@ -154,10 +154,10 @@
     val density = LocalDensity.current
     AnimatedVisibility(
         visible = visible,
-        enter = slideInVertically(
+        enter = slideInVertically {
             // Slide in from 40 dp from the top.
-            initialOffsetY = { with(density) { -40.dp.roundToPx() } }
-        ) + expandVertically(
+            with(density) { -40.dp.roundToPx() }
+        } + expandVertically(
             // Expand from the top.
             expandFrom = Alignment.Top
         ) + fadeIn(
@@ -267,13 +267,13 @@
             if (targetState > initialState) {
                 // If the target number is larger, it slides up and fades in
                 // while the initial (smaller) number slides up and fades out.
-                slideInVertically({ height -> height }) + fadeIn() with
-                    slideOutVertically({ height -> -height }) + fadeOut()
+                slideInVertically { height -> height } + fadeIn() with
+                    slideOutVertically { height -> -height } + fadeOut()
             } else {
                 // If the target number is smaller, it slides down and fades in
                 // while the initial number slides down and fades out.
-                slideInVertically({ height -> -height }) + fadeIn() with
-                    slideOutVertically({ height -> height }) + fadeOut()
+                slideInVertically { height -> -height } + fadeIn() with
+                    slideOutVertically { height -> height } + fadeOut()
             }.using(
                 // Disable clipping since the faded slide-in/out should
                 // be displayed out of bounds.
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
index c70a8db..94f174c 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
@@ -43,8 +43,8 @@
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
 import androidx.navigation.compose.currentBackStackEntryAsState
-import androidx.navigation.compose.navArgument
 import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navArgument
 import androidx.navigation.navDeepLink
 
 /**
diff --git a/compose/material/material/api/public_plus_experimental_current.txt b/compose/material/material/api/public_plus_experimental_current.txt
index 3b0ae6f..dd91948 100644
--- a/compose/material/material/api/public_plus_experimental_current.txt
+++ b/compose/material/material/api/public_plus_experimental_current.txt
@@ -751,6 +751,11 @@
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError);
   }
 
+  @androidx.compose.material.ExperimentalMaterialApi public interface TextFieldColorsWithIcons extends androidx.compose.material.TextFieldColors {
+    method @androidx.compose.runtime.Composable public default androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public default androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
   public final class TextFieldDefaults {
     method public float getMinHeight();
     method public float getMinWidth();
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt
index e690e58..5c41cda 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt
@@ -26,8 +26,8 @@
 import androidx.navigation.NavType
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
-import androidx.navigation.compose.navArgument
 import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navArgument
 
 @Composable
 fun NavGraph(
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
index aff18f5..2a56c7b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
@@ -123,6 +123,48 @@
 }
 
 /**
+ * Temporary experimental interface, to expose interactionSource to
+ * leadingIconColor and trailingIconColor.
+ * TODO: Should be removed when b/198571248 is fixed.
+ */
+@ExperimentalMaterialApi
+interface TextFieldColorsWithIcons : TextFieldColors {
+    /**
+     * Represents the color used for the leading icon of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
+    @Composable
+    fun leadingIconColor(
+        enabled: Boolean,
+        isError: Boolean,
+        interactionSource: InteractionSource
+    ): State<Color> {
+        return leadingIconColor(enabled, isError)
+    }
+
+    /**
+     * Represents the color used for the trailing icon of this text field.
+     *
+     * @param enabled whether the text field is enabled
+     * @param isError whether the text field's current value is in error
+     * @param interactionSource the [InteractionSource] of this text field. Helps to determine if
+     * the text field is in focus or not
+     */
+    @Composable
+    fun trailingIconColor(
+        enabled: Boolean,
+        isError: Boolean,
+        interactionSource: InteractionSource
+    ): State<Color> {
+        return trailingIconColor(enabled, isError)
+    }
+}
+
+/**
  * Contains the default values used by [TextField] and [OutlinedTextField].
  */
 object TextFieldDefaults {
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index 817c407..2cbe14b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -56,6 +56,7 @@
 /**
  * Implementation of the [TextField] and [OutlinedTextField]
  */
+@OptIn(ExperimentalMaterialApi::class)
 @Composable
 internal fun TextFieldImpl(
     type: TextFieldType,
@@ -156,6 +157,19 @@
         // it.
         val defaultErrorMessage = getString(DefaultErrorMessage)
         val textFieldModifier = modifier.semantics { if (isError) error(defaultErrorMessage) }
+
+        val leadingIconColor = if (colors is TextFieldColorsWithIcons) {
+            colors.leadingIconColor(enabled, isError, interactionSource).value
+        } else {
+            colors.leadingIconColor(enabled, isError).value
+        }
+
+        val trailingIconColor = if (colors is TextFieldColorsWithIcons) {
+            colors.trailingIconColor(enabled, isError, interactionSource).value
+        } else {
+            colors.trailingIconColor(enabled, isError).value
+        }
+
         when (type) {
             TextFieldType.Filled -> {
                 TextFieldLayout(
@@ -175,8 +189,8 @@
                     decoratedLabel = decoratedLabel,
                     leading = leading,
                     trailing = trailing,
-                    leadingColor = colors.leadingIconColor(enabled, isError).value,
-                    trailingColor = colors.trailingIconColor(enabled, isError).value,
+                    leadingColor = leadingIconColor,
+                    trailingColor = trailingIconColor,
                     labelProgress = labelProgress,
                     indicatorWidth = indicatorWidth,
                     indicatorColor =
@@ -204,8 +218,8 @@
                     decoratedLabel = decoratedLabel,
                     leading = leading,
                     trailing = trailing,
-                    leadingColor = colors.leadingIconColor(enabled, isError).value,
-                    trailingColor = colors.trailingIconColor(enabled, isError).value,
+                    leadingColor = leadingIconColor,
+                    trailingColor = trailingIconColor,
                     labelProgress = labelProgress,
                     indicatorWidth = indicatorWidth,
                     indicatorColor =
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index ebf5a96..9dcbd45 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -77,6 +77,10 @@
     method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
   }
 
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
   public final class DynamicTonalPaletteKt {
   }
 
@@ -110,6 +114,8 @@
 
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
   }
 
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index ebf5a96..9dcbd45 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -77,6 +77,10 @@
     method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
   }
 
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
   public final class DynamicTonalPaletteKt {
   }
 
@@ -110,6 +114,8 @@
 
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
   }
 
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index ebf5a96..9dcbd45 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -77,6 +77,10 @@
     method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
   }
 
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
   public final class DynamicTonalPaletteKt {
   }
 
@@ -110,6 +114,8 @@
 
   public final class TextKt {
     method @androidx.compose.runtime.Composable public static void ProvideTextStyle(androidx.compose.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
+    method @androidx.compose.runtime.Composable public static void Text(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.ui.text.TextStyle style);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
   }
 
diff --git a/compose/material3/material3/build.gradle b/compose/material3/material3/build.gradle
index 39c522e..c69958d 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -40,6 +40,7 @@
 
         api("androidx.compose.foundation:foundation:1.0.1")
         api("androidx.compose.runtime:runtime:1.0.1")
+        api("androidx.compose.material:material-ripple:1.0.0")
         api("androidx.compose.ui:ui-graphics:1.0.1")
         api("androidx.compose.ui:ui-text:1.0.1")
 
@@ -76,6 +77,7 @@
                 implementation(libs.kotlinStdlibCommon)
 
                 api(project(":compose:foundation:foundation"))
+                api(project(":compose:material:material-ripple"))
                 api(project(":compose:runtime:runtime"))
                 api(project(":compose:ui:ui-graphics"))
                 api(project(":compose:ui:ui-text"))
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextTest.kt
new file mode 100644
index 0000000..a945ab4
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TextTest.kt
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2021 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.compose.material3
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.test.assertTextEquals
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performSemanticsAction
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.em
+import androidx.compose.ui.unit.sp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class TextTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    private val ExpectedTextStyle = TextStyle(
+        color = Color.Blue,
+        textAlign = TextAlign.End,
+        fontSize = 32.sp,
+        fontStyle = FontStyle.Italic,
+        letterSpacing = 0.3.em
+    )
+
+    private val TestText = "TestText"
+
+    @Test
+    fun inheritsThemeTextStyle() {
+        var textColor: Color? = null
+        var textAlign: TextAlign? = null
+        var fontSize: TextUnit? = null
+        var fontStyle: FontStyle? = null
+        var letterSpacing: TextUnit? = null
+        rule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(Modifier.background(Color.White)) {
+                    Text(
+                        TestText,
+                        onTextLayout = {
+                            textColor = it.layoutInput.style.color
+                            textAlign = it.layoutInput.style.textAlign
+                            fontSize = it.layoutInput.style.fontSize
+                            fontStyle = it.layoutInput.style.fontStyle
+                            letterSpacing = it.layoutInput.style.letterSpacing
+                        }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            Truth.assertThat(textColor).isEqualTo(ExpectedTextStyle.color)
+            Truth.assertThat(textAlign).isEqualTo(ExpectedTextStyle.textAlign)
+            Truth.assertThat(fontSize).isEqualTo(ExpectedTextStyle.fontSize)
+            Truth.assertThat(fontStyle).isEqualTo(ExpectedTextStyle.fontStyle)
+            Truth.assertThat(letterSpacing).isEqualTo(ExpectedTextStyle.letterSpacing)
+        }
+    }
+
+    @Test
+    fun settingCustomTextStyle() {
+        var textColor: Color? = null
+        var textAlign: TextAlign? = null
+        var fontSize: TextUnit? = null
+        var fontStyle: FontStyle? = null
+        var letterSpacing: TextUnit? = null
+        val testStyle = TextStyle(
+            color = Color.Green,
+            textAlign = TextAlign.Center,
+            fontSize = 16.sp,
+            fontStyle = FontStyle.Normal,
+            letterSpacing = 0.6.em
+        )
+        rule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(Modifier.background(Color.White)) {
+                    Text(
+                        TestText,
+                        style = testStyle,
+                        onTextLayout = {
+                            textColor = it.layoutInput.style.color
+                            textAlign = it.layoutInput.style.textAlign
+                            fontSize = it.layoutInput.style.fontSize
+                            fontStyle = it.layoutInput.style.fontStyle
+                            letterSpacing = it.layoutInput.style.letterSpacing
+                        }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            Truth.assertThat(textColor).isEqualTo(testStyle.color)
+            Truth.assertThat(textAlign).isEqualTo(testStyle.textAlign)
+            Truth.assertThat(fontSize).isEqualTo(testStyle.fontSize)
+            Truth.assertThat(fontStyle).isEqualTo(testStyle.fontStyle)
+            Truth.assertThat(letterSpacing).isEqualTo(testStyle.letterSpacing)
+        }
+    }
+
+    @Test
+    fun settingParametersExplicitly() {
+        var textColor: Color? = null
+        var textAlign: TextAlign? = null
+        var fontSize: TextUnit? = null
+        var fontStyle: FontStyle? = null
+        var letterSpacing: TextUnit? = null
+        val expectedColor = Color.Green
+        val expectedTextAlign = TextAlign.Center
+        val expectedFontSize = 16.sp
+        val expectedFontStyle = FontStyle.Normal
+        val expectedLetterSpacing = 0.6.em
+
+        rule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(Modifier.background(Color.White)) {
+                    Text(
+                        TestText,
+                        color = expectedColor,
+                        textAlign = expectedTextAlign,
+                        fontSize = expectedFontSize,
+                        fontStyle = expectedFontStyle,
+                        letterSpacing = expectedLetterSpacing,
+                        onTextLayout = {
+                            textColor = it.layoutInput.style.color
+                            textAlign = it.layoutInput.style.textAlign
+                            fontSize = it.layoutInput.style.fontSize
+                            fontStyle = it.layoutInput.style.fontStyle
+                            letterSpacing = it.layoutInput.style.letterSpacing
+                        }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            // explicit parameters should override values from the style.
+            Truth.assertThat(textColor).isEqualTo(expectedColor)
+            Truth.assertThat(textAlign).isEqualTo(expectedTextAlign)
+            Truth.assertThat(fontSize).isEqualTo(expectedFontSize)
+            Truth.assertThat(fontStyle).isEqualTo(expectedFontStyle)
+            Truth.assertThat(letterSpacing).isEqualTo(expectedLetterSpacing)
+        }
+    }
+
+    // Not really an expected use-case, but we should ensure the behavior here is consistent.
+    @Test
+    fun settingColorAndTextStyle() {
+        var textColor: Color? = null
+        var textAlign: TextAlign? = null
+        var fontSize: TextUnit? = null
+        var fontStyle: FontStyle? = null
+        var letterSpacing: TextUnit? = null
+        val expectedColor = Color.Green
+        val expectedTextAlign = TextAlign.Center
+        val expectedFontSize = 16.sp
+        val expectedFontStyle = FontStyle.Normal
+        val expectedLetterSpacing = 0.6.em
+        rule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(Modifier.background(Color.White)) {
+                    // Set both color and style
+                    Text(
+                        TestText,
+                        color = expectedColor,
+                        textAlign = expectedTextAlign,
+                        fontSize = expectedFontSize,
+                        fontStyle = expectedFontStyle,
+                        letterSpacing = expectedLetterSpacing,
+                        style = ExpectedTextStyle,
+                        onTextLayout = {
+                            textColor = it.layoutInput.style.color
+                            textAlign = it.layoutInput.style.textAlign
+                            fontSize = it.layoutInput.style.fontSize
+                            fontStyle = it.layoutInput.style.fontStyle
+                            letterSpacing = it.layoutInput.style.letterSpacing
+                        }
+                    )
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            // explicit parameters should override values from the style.
+            Truth.assertThat(textColor).isEqualTo(expectedColor)
+            Truth.assertThat(textAlign).isEqualTo(expectedTextAlign)
+            Truth.assertThat(fontSize).isEqualTo(expectedFontSize)
+            Truth.assertThat(fontStyle).isEqualTo(expectedFontStyle)
+            Truth.assertThat(letterSpacing).isEqualTo(expectedLetterSpacing)
+        }
+    }
+
+    @Test
+    fun testSemantics() {
+        rule.setContent {
+            ProvideTextStyle(ExpectedTextStyle) {
+                Box(Modifier.background(Color.White)) {
+                    Text(
+                        TestText,
+                        modifier = Modifier.testTag("text")
+                    )
+                }
+            }
+        }
+
+        val textLayoutResults = mutableListOf<TextLayoutResult>()
+        rule.onNodeWithTag("text")
+            .assertTextEquals(TestText)
+            .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
+        assert(textLayoutResults.size == 1) { "TextLayoutResult is null" }
+    }
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
index 47fa4f5..1b09586 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
@@ -618,3 +618,8 @@
  * [MaterialTheme.colorScheme].
  */
 internal val LocalColorScheme = staticCompositionLocalOf { lightColorScheme() }
+
+/**
+ * A low level of alpha used to represent disabled components, such as text in a disabled Button.
+ */
+internal const val DisabledAlpha = 0.38f
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ContentColor.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ContentColor.kt
new file mode 100644
index 0000000..f888572
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ContentColor.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2021 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.compose.material3
+
+import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.ui.graphics.Color
+
+/**
+ * CompositionLocal containing the preferred content color for a given position in the hierarchy.
+ * This typically represents the `on` color for a color in [ColorScheme]. For example, if the
+ * background color is [ColorScheme.surface], this color is typically set to
+ * [ColorScheme.onSurface].
+ *
+ * This color should be used for any typography / iconography, to ensure that the color of these
+ * adjusts when the background color changes. For example, on a dark background, text should be
+ * light, and on a light background, text should be dark.
+ *
+ * Defaults to [Color.Black] if no color has been explicitly set.
+ */
+val LocalContentColor = compositionLocalOf { Color.Black }
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
index 6e5b7f3..46117af 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
@@ -16,8 +16,13 @@
 
 package androidx.compose.material3
 
+import androidx.compose.material.ripple.LocalRippleTheme
+import androidx.compose.material.ripple.RippleAlpha
+import androidx.compose.material.ripple.RippleTheme
+import androidx.compose.material3.tokens.State
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.ReadOnlyComposable
 import androidx.compose.runtime.remember
 
@@ -62,6 +67,7 @@
     CompositionLocalProvider(
         LocalColorScheme provides rememberedColorScheme,
         LocalTypography provides typography,
+        LocalRippleTheme provides MaterialRippleTheme,
         LocalShapes provides shapes,
     ) {
         ProvideTextStyle(value = typography.bodyLarge, content = content)
@@ -97,3 +103,19 @@
         @ReadOnlyComposable
         get() = LocalShapes.current
 }
+
+@Immutable
+private object MaterialRippleTheme : RippleTheme {
+    @Composable
+    override fun defaultColor() = LocalContentColor.current
+
+    @Composable
+    override fun rippleAlpha() = DefaultRippleAlpha
+}
+
+private val DefaultRippleAlpha = RippleAlpha(
+    pressedAlpha = State.PressedStateLayerOpacity,
+    focusedAlpha = State.FocusStateLayerOpacity,
+    draggedAlpha = State.DraggedStateLayerOpacity,
+    hoveredAlpha = State.HoverStateLayerOpacity
+)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt
index 7844a4b..81cbb27 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Text.kt
@@ -16,13 +16,214 @@
 
 package androidx.compose.material3
 
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.foundation.text.InlineTextContent
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.takeOrElse
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Paragraph
+import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.TextUnit
 
-// TODO(b/197552877): Add M3 Text functionality.
+/**
+ * High level element that displays text and provides semantics / accessibility information.
+ *
+ * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
+ * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * attributes you want to override.
+ *
+ * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
+ * precedence is as follows:
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
+ * then this parameter will always be used.
+ * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
+ * from [style] will be used instead.
+ *
+ * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
+ * [LocalContentColor] will be used.
+ *
+ * @param text The text to be displayed.
+ * @param modifier [Modifier] to apply to this layout node.
+ * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
+ * this will be [LocalContentColor].
+ * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
+ * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
+ * See [TextStyle.fontStyle].
+ * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
+ * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily].
+ * @param letterSpacing The amount of space to add between each letter.
+ * See [TextStyle.letterSpacing].
+ * @param textDecoration The decorations to paint on the text (e.g., an underline).
+ * See [TextStyle.textDecoration].
+ * @param textAlign The alignment of the text within the lines of the paragraph.
+ * See [TextStyle.textAlign].
+ * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
+ * See [TextStyle.lineHeight].
+ * @param overflow How visual overflow should be handled.
+ * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
+ * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ * [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated according to
+ * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param onTextLayout Callback that is executed when a new text layout is calculated. A
+ * [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ * text, baselines and other details. The callback can be used to add additional decoration or
+ * functionality to the text. For example, to draw selection around the text.
+ * @param style Style configuration for the text such as color, font, line height etc.
+ */
+@Composable
+fun Text(
+    text: String,
+    modifier: Modifier = Modifier,
+    color: Color = Color.Unspecified,
+    fontSize: TextUnit = TextUnit.Unspecified,
+    fontStyle: FontStyle? = null,
+    fontWeight: FontWeight? = null,
+    fontFamily: FontFamily? = null,
+    letterSpacing: TextUnit = TextUnit.Unspecified,
+    textDecoration: TextDecoration? = null,
+    textAlign: TextAlign? = null,
+    lineHeight: TextUnit = TextUnit.Unspecified,
+    overflow: TextOverflow = TextOverflow.Clip,
+    softWrap: Boolean = true,
+    maxLines: Int = Int.MAX_VALUE,
+    onTextLayout: (TextLayoutResult) -> Unit = {},
+    style: TextStyle = LocalTextStyle.current
+) {
+    Text(
+        AnnotatedString(text),
+        modifier,
+        color,
+        fontSize,
+        fontStyle,
+        fontWeight,
+        fontFamily,
+        letterSpacing,
+        textDecoration,
+        textAlign,
+        lineHeight,
+        overflow,
+        softWrap,
+        maxLines,
+        emptyMap(),
+        onTextLayout,
+        style
+    )
+}
+
+/**
+ * High level element that displays text and provides semantics / accessibility information.
+ *
+ * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
+ * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * attributes you want to override.
+ *
+ * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
+ * precedence is as follows:
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
+ * then this parameter will always be used.
+ * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
+ * from [style] will be used instead.
+ *
+ * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
+ * [LocalContentColor] will be used.
+ *
+ * @param text The text to be displayed.
+ * @param modifier [Modifier] to apply to this layout node.
+ * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
+ * this will be [LocalContentColor].
+ * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
+ * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
+ * See [TextStyle.fontStyle].
+ * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
+ * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily].
+ * @param letterSpacing The amount of space to add between each letter.
+ * See [TextStyle.letterSpacing].
+ * @param textDecoration The decorations to paint on the text (e.g., an underline).
+ * See [TextStyle.textDecoration].
+ * @param textAlign The alignment of the text within the lines of the paragraph.
+ * See [TextStyle.textAlign].
+ * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
+ * See [TextStyle.lineHeight].
+ * @param overflow How visual overflow should be handled.
+ * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
+ * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ * [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated according to
+ * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param inlineContent A map store composables that replaces certain ranges of the text. It's
+ * used to insert composables into text layout. Check [InlineTextContent] for more information.
+ * @param onTextLayout Callback that is executed when a new text layout is calculated. A
+ * [TextLayoutResult] object that callback provides contains paragraph information, size of the
+ * text, baselines and other details. The callback can be used to add additional decoration or
+ * functionality to the text. For example, to draw selection around the text.
+ * @param style Style configuration for the text such as color, font, line height etc.
+ */
+@Composable
+fun Text(
+    text: AnnotatedString,
+    modifier: Modifier = Modifier,
+    color: Color = Color.Unspecified,
+    fontSize: TextUnit = TextUnit.Unspecified,
+    fontStyle: FontStyle? = null,
+    fontWeight: FontWeight? = null,
+    fontFamily: FontFamily? = null,
+    letterSpacing: TextUnit = TextUnit.Unspecified,
+    textDecoration: TextDecoration? = null,
+    textAlign: TextAlign? = null,
+    lineHeight: TextUnit = TextUnit.Unspecified,
+    overflow: TextOverflow = TextOverflow.Clip,
+    softWrap: Boolean = true,
+    maxLines: Int = Int.MAX_VALUE,
+    inlineContent: Map<String, InlineTextContent> = mapOf(),
+    onTextLayout: (TextLayoutResult) -> Unit = {},
+    style: TextStyle = LocalTextStyle.current
+) {
+    val textColor = color.takeOrElse {
+        style.color.takeOrElse {
+            LocalContentColor.current
+        }
+    }
+    val mergedStyle = style.merge(
+        TextStyle(
+            color = textColor,
+            fontSize = fontSize,
+            fontWeight = fontWeight,
+            textAlign = textAlign,
+            lineHeight = lineHeight,
+            fontFamily = fontFamily,
+            textDecoration = textDecoration,
+            fontStyle = fontStyle,
+            letterSpacing = letterSpacing
+        )
+    )
+    BasicText(
+        text,
+        modifier,
+        mergedStyle,
+        onTextLayout,
+        overflow,
+        softWrap,
+        maxLines,
+        inlineContent
+    )
+}
 
 /**
  * CompositionLocal containing the preferred [TextStyle] that will be used by [Text] components by
@@ -33,7 +234,7 @@
  */
 val LocalTextStyle = compositionLocalOf(structuralEqualityPolicy()) { TextStyle.Default }
 
-// TODO(b//156598010): remove this and replace with fold definition on the backing CompositionLocal
+// TODO(b/156598010): remove this and replace with fold definition on the backing CompositionLocal
 /**
  * This function is used to set the current value of [LocalTextStyle], merging the given style
  * with the current style values for any missing attributes. Any [Text] components included in
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/State.kt
similarity index 62%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/State.kt
index f7ebdc2..34612a7 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/State.kt
@@ -13,16 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+// GENERATED CODE - DO NOT MODIFY BY HAND
 
-package androidx.fragment.app.strictmode;
+package androidx.compose.material3.tokens
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+internal object State {
+    const val DraggedStateLayerOpacity = 0.16f
+    const val FocusStateLayerOpacity = 0.12f
+    const val HoverStateLayerOpacity = 0.08f
+    const val PressedStateLayerOpacity = 0.12f
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/api/1.0.0-beta02.txt b/compose/runtime/runtime/api/1.0.0-beta02.txt
index d6af1b3..279b41d 100644
--- a/compose/runtime/runtime/api/1.0.0-beta02.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta02.txt
@@ -448,21 +448,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta03.txt b/compose/runtime/runtime/api/1.0.0-beta03.txt
index 9b0488a9..0b2ba00 100644
--- a/compose/runtime/runtime/api/1.0.0-beta03.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta03.txt
@@ -452,21 +452,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta04.txt b/compose/runtime/runtime/api/1.0.0-beta04.txt
index 9b0488a9..0b2ba00 100644
--- a/compose/runtime/runtime/api/1.0.0-beta04.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta04.txt
@@ -452,21 +452,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta05.txt b/compose/runtime/runtime/api/1.0.0-beta05.txt
index b140d31..ec229ae 100644
--- a/compose/runtime/runtime/api/1.0.0-beta05.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta05.txt
@@ -455,21 +455,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta06.txt b/compose/runtime/runtime/api/1.0.0-beta06.txt
index 9f3a118..5b801fe 100644
--- a/compose/runtime/runtime/api/1.0.0-beta06.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta06.txt
@@ -521,21 +521,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta07.txt b/compose/runtime/runtime/api/1.0.0-beta07.txt
index f23b848..a0c0888 100644
--- a/compose/runtime/runtime/api/1.0.0-beta07.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta07.txt
@@ -533,21 +533,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta08.txt b/compose/runtime/runtime/api/1.0.0-beta08.txt
index e871a75..5a9f21f 100644
--- a/compose/runtime/runtime/api/1.0.0-beta08.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta08.txt
@@ -579,21 +579,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta09.txt b/compose/runtime/runtime/api/1.0.0-beta09.txt
index e871a75..5a9f21f 100644
--- a/compose/runtime/runtime/api/1.0.0-beta09.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta09.txt
@@ -579,21 +579,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/1.0.0-beta10.txt b/compose/runtime/runtime/api/1.0.0-beta10.txt
index b017db0..13fa4c7 100644
--- a/compose/runtime/runtime/api/1.0.0-beta10.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta10.txt
@@ -579,21 +579,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index b017db0..13fa4c7 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -579,21 +579,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta02.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta02.txt
index a639f61..8f38ac0 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta02.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta02.txt
@@ -536,21 +536,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta03.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta03.txt
index 5fa6426..5d83609 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta03.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta03.txt
@@ -540,21 +540,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta04.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta04.txt
index 5fa6426..5d83609 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta04.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta04.txt
@@ -540,21 +540,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta05.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta05.txt
index 81f0793..7b81b3a 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta05.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta05.txt
@@ -556,21 +556,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt
index 1746ff7..1d10146 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt
@@ -556,21 +556,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt
index d93980e..23af99a 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt
@@ -568,21 +568,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt
index 10d1308..614a375 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt
@@ -614,21 +614,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta09.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta09.txt
index 10d1308..614a375 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta09.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta09.txt
@@ -614,21 +614,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta10.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta10.txt
index a6db904..b2c5255 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta10.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta10.txt
@@ -614,21 +614,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index a6db904..b2c5255 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -614,21 +614,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta02.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta02.txt
index 82a2315..1fbbdc0 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta02.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta02.txt
@@ -475,21 +475,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta03.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta03.txt
index ffbf0ab..deb923d 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta03.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta03.txt
@@ -479,21 +479,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta04.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta04.txt
index ffbf0ab..deb923d 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta04.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta04.txt
@@ -479,21 +479,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta05.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta05.txt
index 7128480..eb389ed 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta05.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta05.txt
@@ -482,21 +482,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt
index 1657a72..42bc032 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt
@@ -548,21 +548,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt
index 4ef8743..d921033 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt
@@ -561,21 +561,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt
index 3f9181d..b3a779d 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt
@@ -607,21 +607,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta09.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta09.txt
index 3f9181d..b3a779d 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta09.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta09.txt
@@ -607,21 +607,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta10.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta10.txt
index 1d64300..cb3b5bd 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta10.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta10.txt
@@ -607,21 +607,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index 1d64300..cb3b5bd 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -607,21 +607,13 @@
 
   public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
     method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
-    method public void close$metalava_module();
-    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver();
     method public boolean getReadOnly();
     method public androidx.compose.runtime.snapshots.Snapshot getRoot();
     method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver();
     method public boolean hasPendingChanges();
-    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
-    method public void notifyObjectsInitialized$metalava_module();
-    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
-    method public void setModified$metalava_module(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified);
     method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
     method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
-    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
     property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
     property public boolean readOnly;
     property public androidx.compose.runtime.snapshots.Snapshot root;
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
index 1803ab1..1a0e7f6 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
@@ -28,5 +28,5 @@
      * IMPORTANT: Whenever updating this value, please make sure to also update `versionTable` and
      * `minimumRuntimeVersionInt` in `VersionChecker.kt` of the compiler.
      */
-    const val version: Int = 4300
+    const val version: Int = 4400
 }
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt
index 752605d..4bd3882 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt
@@ -16,36 +16,36 @@
 
 package androidx.compose.ui.graphics
 
-internal fun BlendMode.toSkija() = when (this) {
-    BlendMode.Clear -> org.jetbrains.skija.BlendMode.CLEAR
-    BlendMode.Src -> org.jetbrains.skija.BlendMode.SRC
-    BlendMode.Dst -> org.jetbrains.skija.BlendMode.DST
-    BlendMode.SrcOver -> org.jetbrains.skija.BlendMode.SRC_OVER
-    BlendMode.DstOver -> org.jetbrains.skija.BlendMode.DST_OVER
-    BlendMode.SrcIn -> org.jetbrains.skija.BlendMode.SRC_IN
-    BlendMode.DstIn -> org.jetbrains.skija.BlendMode.DST_IN
-    BlendMode.SrcOut -> org.jetbrains.skija.BlendMode.SRC_OUT
-    BlendMode.DstOut -> org.jetbrains.skija.BlendMode.DST_OUT
-    BlendMode.SrcAtop -> org.jetbrains.skija.BlendMode.SRC_ATOP
-    BlendMode.DstAtop -> org.jetbrains.skija.BlendMode.DST_ATOP
-    BlendMode.Xor -> org.jetbrains.skija.BlendMode.XOR
-    BlendMode.Plus -> org.jetbrains.skija.BlendMode.PLUS
-    BlendMode.Modulate -> org.jetbrains.skija.BlendMode.MODULATE
-    BlendMode.Screen -> org.jetbrains.skija.BlendMode.SCREEN
-    BlendMode.Overlay -> org.jetbrains.skija.BlendMode.OVERLAY
-    BlendMode.Darken -> org.jetbrains.skija.BlendMode.DARKEN
-    BlendMode.Lighten -> org.jetbrains.skija.BlendMode.LIGHTEN
-    BlendMode.ColorDodge -> org.jetbrains.skija.BlendMode.COLOR_DODGE
-    BlendMode.ColorBurn -> org.jetbrains.skija.BlendMode.COLOR_BURN
-    BlendMode.Hardlight -> org.jetbrains.skija.BlendMode.HARD_LIGHT
-    BlendMode.Softlight -> org.jetbrains.skija.BlendMode.SOFT_LIGHT
-    BlendMode.Difference -> org.jetbrains.skija.BlendMode.DIFFERENCE
-    BlendMode.Exclusion -> org.jetbrains.skija.BlendMode.EXCLUSION
-    BlendMode.Multiply -> org.jetbrains.skija.BlendMode.MULTIPLY
-    BlendMode.Hue -> org.jetbrains.skija.BlendMode.HUE
-    BlendMode.Saturation -> org.jetbrains.skija.BlendMode.SATURATION
-    BlendMode.Color -> org.jetbrains.skija.BlendMode.COLOR
-    BlendMode.Luminosity -> org.jetbrains.skija.BlendMode.LUMINOSITY
+internal fun BlendMode.toSkia() = when (this) {
+    BlendMode.Clear -> org.jetbrains.skia.BlendMode.CLEAR
+    BlendMode.Src -> org.jetbrains.skia.BlendMode.SRC
+    BlendMode.Dst -> org.jetbrains.skia.BlendMode.DST
+    BlendMode.SrcOver -> org.jetbrains.skia.BlendMode.SRC_OVER
+    BlendMode.DstOver -> org.jetbrains.skia.BlendMode.DST_OVER
+    BlendMode.SrcIn -> org.jetbrains.skia.BlendMode.SRC_IN
+    BlendMode.DstIn -> org.jetbrains.skia.BlendMode.DST_IN
+    BlendMode.SrcOut -> org.jetbrains.skia.BlendMode.SRC_OUT
+    BlendMode.DstOut -> org.jetbrains.skia.BlendMode.DST_OUT
+    BlendMode.SrcAtop -> org.jetbrains.skia.BlendMode.SRC_ATOP
+    BlendMode.DstAtop -> org.jetbrains.skia.BlendMode.DST_ATOP
+    BlendMode.Xor -> org.jetbrains.skia.BlendMode.XOR
+    BlendMode.Plus -> org.jetbrains.skia.BlendMode.PLUS
+    BlendMode.Modulate -> org.jetbrains.skia.BlendMode.MODULATE
+    BlendMode.Screen -> org.jetbrains.skia.BlendMode.SCREEN
+    BlendMode.Overlay -> org.jetbrains.skia.BlendMode.OVERLAY
+    BlendMode.Darken -> org.jetbrains.skia.BlendMode.DARKEN
+    BlendMode.Lighten -> org.jetbrains.skia.BlendMode.LIGHTEN
+    BlendMode.ColorDodge -> org.jetbrains.skia.BlendMode.COLOR_DODGE
+    BlendMode.ColorBurn -> org.jetbrains.skia.BlendMode.COLOR_BURN
+    BlendMode.Hardlight -> org.jetbrains.skia.BlendMode.HARD_LIGHT
+    BlendMode.Softlight -> org.jetbrains.skia.BlendMode.SOFT_LIGHT
+    BlendMode.Difference -> org.jetbrains.skia.BlendMode.DIFFERENCE
+    BlendMode.Exclusion -> org.jetbrains.skia.BlendMode.EXCLUSION
+    BlendMode.Multiply -> org.jetbrains.skia.BlendMode.MULTIPLY
+    BlendMode.Hue -> org.jetbrains.skia.BlendMode.HUE
+    BlendMode.Saturation -> org.jetbrains.skia.BlendMode.SATURATION
+    BlendMode.Color -> org.jetbrains.skia.BlendMode.COLOR
+    BlendMode.Luminosity -> org.jetbrains.skia.BlendMode.LUMINOSITY
     // Always fallback to default blendmode of src over
-    else -> org.jetbrains.skija.BlendMode.SRC_OVER
+    else -> org.jetbrains.skia.BlendMode.SRC_OVER
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
index 6b80b7c..5fe9454 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
@@ -23,94 +23,94 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
-import org.jetbrains.skija.CubicResampler
-import org.jetbrains.skija.FilterMipmap
-import org.jetbrains.skija.FilterMode
-import org.jetbrains.skija.Image
-import org.jetbrains.skija.Matrix44
-import org.jetbrains.skija.MipmapMode
-import org.jetbrains.skija.SamplingMode
-import org.jetbrains.skija.impl.Native
-import org.jetbrains.skija.ClipMode as SkijaClipMode
-import org.jetbrains.skija.RRect as SkijaRRect
-import org.jetbrains.skija.Rect as SkijaRect
+import org.jetbrains.skia.CubicResampler
+import org.jetbrains.skia.FilterMipmap
+import org.jetbrains.skia.FilterMode
+import org.jetbrains.skia.Image
+import org.jetbrains.skia.Matrix44
+import org.jetbrains.skia.MipmapMode
+import org.jetbrains.skia.SamplingMode
+import org.jetbrains.skia.impl.getPtr
+import org.jetbrains.skia.ClipMode as SkiaClipMode
+import org.jetbrains.skia.RRect as SkiaRRect
+import org.jetbrains.skia.Rect as SkiaRect
 
-actual typealias NativeCanvas = org.jetbrains.skija.Canvas
+actual typealias NativeCanvas = org.jetbrains.skia.Canvas
 
 internal actual fun ActualCanvas(image: ImageBitmap): Canvas {
-    val skijaBitmap = image.asDesktopBitmap()
-    require(!skijaBitmap.isImmutable) {
+    val skiaBitmap = image.asDesktopBitmap()
+    require(!skiaBitmap.isImmutable) {
         "Cannot draw on immutable ImageBitmap"
     }
-    return DesktopCanvas(org.jetbrains.skija.Canvas(skijaBitmap))
+    return DesktopCanvas(org.jetbrains.skia.Canvas(skiaBitmap))
 }
 
-actual val Canvas.nativeCanvas: NativeCanvas get() = (this as DesktopCanvas).skija
+actual val Canvas.nativeCanvas: NativeCanvas get() = (this as DesktopCanvas).skia
 
-class DesktopCanvas(val skija: org.jetbrains.skija.Canvas) : Canvas {
-    private val Paint.skija get() = (this as DesktopPaint).skija
+class DesktopCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
+    private val Paint.skia get() = (this as DesktopPaint).skia
 
     override fun save() {
-        skija.save()
+        skia.save()
     }
 
     override fun restore() {
-        skija.restore()
+        skia.restore()
     }
 
     override fun saveLayer(bounds: Rect, paint: Paint) {
-        skija.saveLayer(
+        skia.saveLayer(
             bounds.left,
             bounds.top,
             bounds.right,
             bounds.bottom,
-            paint.skija
+            paint.skia
         )
     }
 
     override fun translate(dx: Float, dy: Float) {
-        skija.translate(dx, dy)
+        skia.translate(dx, dy)
     }
 
     override fun scale(sx: Float, sy: Float) {
-        skija.scale(sx, sy)
+        skia.scale(sx, sy)
     }
 
     override fun rotate(degrees: Float) {
-        skija.rotate(degrees)
+        skia.rotate(degrees)
     }
 
     override fun skew(sx: Float, sy: Float) {
-        skija.skew(sx, sy)
+        skia.skew(sx, sy)
     }
 
     override fun concat(matrix: Matrix) {
         if (!matrix.isIdentity()) {
-            skija.concat(matrix.toSkija())
+            skia.concat(matrix.toSkia())
         }
     }
 
     override fun clipRect(left: Float, top: Float, right: Float, bottom: Float, clipOp: ClipOp) {
         val antiAlias = true
-        skija.clipRect(SkijaRect.makeLTRB(left, top, right, bottom), clipOp.toSkija(), antiAlias)
+        skia.clipRect(SkiaRect.makeLTRB(left, top, right, bottom), clipOp.toSkia(), antiAlias)
     }
 
     fun clipRoundRect(rect: RoundRect, clipOp: ClipOp = ClipOp.Intersect) {
         val antiAlias = true
-        skija.clipRRect(rect.toSkijaRRect(), clipOp.toSkija(), antiAlias)
+        skia.clipRRect(rect.toSkiaRRect(), clipOp.toSkia(), antiAlias)
     }
 
     override fun clipPath(path: Path, clipOp: ClipOp) {
         val antiAlias = true
-        skija.clipPath(path.asDesktopPath(), clipOp.toSkija(), antiAlias)
+        skia.clipPath(path.asDesktopPath(), clipOp.toSkia(), antiAlias)
     }
 
     override fun drawLine(p1: Offset, p2: Offset, paint: Paint) {
-        skija.drawLine(p1.x, p1.y, p2.x, p2.y, paint.skija)
+        skia.drawLine(p1.x, p1.y, p2.x, p2.y, paint.skia)
     }
 
     override fun drawRect(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) {
-        skija.drawRect(SkijaRect.makeLTRB(left, top, right, bottom), paint.skija)
+        skia.drawRect(SkiaRect.makeLTRB(left, top, right, bottom), paint.skia)
     }
 
     override fun drawRoundRect(
@@ -122,8 +122,8 @@
         radiusY: Float,
         paint: Paint
     ) {
-        skija.drawRRect(
-            SkijaRRect.makeLTRB(
+        skia.drawRRect(
+            SkiaRRect.makeLTRB(
                 left,
                 top,
                 right,
@@ -131,16 +131,16 @@
                 radiusX,
                 radiusY
             ),
-            paint.skija
+            paint.skia
         )
     }
 
     override fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) {
-        skija.drawOval(SkijaRect.makeLTRB(left, top, right, bottom), paint.skija)
+        skia.drawOval(SkiaRect.makeLTRB(left, top, right, bottom), paint.skia)
     }
 
     override fun drawCircle(center: Offset, radius: Float, paint: Paint) {
-        skija.drawCircle(center.x, center.y, radius, paint.skija)
+        skia.drawCircle(center.x, center.y, radius, paint.skia)
     }
 
     override fun drawArc(
@@ -153,7 +153,7 @@
         useCenter: Boolean,
         paint: Paint
     ) {
-        skija.drawArc(
+        skia.drawArc(
             left,
             top,
             right,
@@ -161,12 +161,12 @@
             startAngle,
             sweepAngle,
             useCenter,
-            paint.skija
+            paint.skia
         )
     }
 
     override fun drawPath(path: Path, paint: Paint) {
-        skija.drawPath(path.asDesktopPath(), paint.skija)
+        skia.drawPath(path.asDesktopPath(), paint.skia)
     }
 
     override fun drawImage(image: ImageBitmap, topLeftOffset: Offset, paint: Paint) {
@@ -202,23 +202,23 @@
         paint: Paint
     ) {
         val bitmap = image.asDesktopBitmap()
-        Image.makeFromBitmap(bitmap).use { skijaImage ->
-            skija.drawImageRect(
-                skijaImage,
-                SkijaRect.makeXYWH(
+        Image.makeFromBitmap(bitmap).use { skiaImage ->
+            skia.drawImageRect(
+                skiaImage,
+                SkiaRect.makeXYWH(
                     srcOffset.x,
                     srcOffset.y,
                     srcSize.width,
                     srcSize.height
                 ),
-                SkijaRect.makeXYWH(
+                SkiaRect.makeXYWH(
                     dstOffset.x,
                     dstOffset.y,
                     dstSize.width,
                     dstSize.height
                 ),
-                paint.filterQuality.toSkija(),
-                paint.skija,
+                paint.filterQuality.toSkia(),
+                paint.skia,
                 true
             )
         }
@@ -244,10 +244,10 @@
 
     private fun drawPoints(points: List<Offset>, paint: Paint) {
         points.fastForEach { point ->
-            skija.drawPoint(
+            skia.drawPoint(
                 point.x,
                 point.y,
-                paint.skija
+                paint.skia
             )
         }
     }
@@ -269,12 +269,12 @@
             for (i in 0 until points.size - 1 step stepBy) {
                 val p1 = points[i]
                 val p2 = points[i + 1]
-                skija.drawLine(
+                skia.drawLine(
                     p1.x,
                     p1.y,
                     p2.x,
                     p2.y,
-                    paint.skija
+                    paint.skia
                 )
             }
         }
@@ -299,7 +299,7 @@
             for (i in 0 until points.size - 1 step stepBy) {
                 val x = points[i]
                 val y = points[i + 1]
-                skija.drawPoint(x, y, paint.skija)
+                skia.drawPoint(x, y, paint.skia)
             }
         }
     }
@@ -326,37 +326,37 @@
                 val y1 = points[i + 1]
                 val x2 = points[i + 2]
                 val y2 = points[i + 3]
-                skija.drawLine(
+                skia.drawLine(
                     x1,
                     y1,
                     x2,
                     y2,
-                    paint.skija
+                    paint.skia
                 )
             }
         }
     }
 
     override fun drawVertices(vertices: Vertices, blendMode: BlendMode, paint: Paint) {
-        org.jetbrains.skija.Canvas._nDrawVertices(
-            skija._ptr,
+        org.jetbrains.skia.Canvas._nDrawVertices(
+            skia._ptr,
             vertices.vertexMode.toDesktopVertexMode(),
             vertices.positions,
             vertices.colors,
             vertices.textureCoordinates,
             vertices.indices,
-            blendMode.toSkija().ordinal,
-            Native.getPtr(paint.asFrameworkPaint())
+            blendMode.toSkia().ordinal,
+            getPtr(paint.asFrameworkPaint())
         )
     }
 
-    private fun ClipOp.toSkija() = when (this) {
-        ClipOp.Difference -> SkijaClipMode.DIFFERENCE
-        ClipOp.Intersect -> SkijaClipMode.INTERSECT
-        else -> SkijaClipMode.INTERSECT
+    private fun ClipOp.toSkia() = when (this) {
+        ClipOp.Difference -> SkiaClipMode.DIFFERENCE
+        ClipOp.Intersect -> SkiaClipMode.INTERSECT
+        else -> SkiaClipMode.INTERSECT
     }
 
-    private fun Matrix.toSkija() = Matrix44(
+    private fun Matrix.toSkia() = Matrix44(
         this[0, 0],
         this[1, 0],
         this[2, 0],
@@ -381,7 +381,7 @@
     // These constants are chosen to correspond the old implementation of SkFilterQuality:
     // https://github.com/google/skia/blob/1f193df9b393d50da39570dab77a0bb5d28ec8ef/src/image/SkImage.cpp#L809
     // https://github.com/google/skia/blob/1f193df9b393d50da39570dab77a0bb5d28ec8ef/include/core/SkSamplingOptions.h#L86
-    private fun FilterQuality.toSkija(): SamplingMode = when (this) {
+    private fun FilterQuality.toSkia(): SamplingMode = when (this) {
         FilterQuality.Low -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NONE)
         FilterQuality.Medium -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NEAREST)
         FilterQuality.High -> CubicResampler(1 / 3.0f, 1 / 3.0f)
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
index 28b9182..e8e5edf 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
@@ -16,26 +16,26 @@
 
 package androidx.compose.ui.graphics
 
-import org.jetbrains.skija.ColorFilter as SkijaColorFilter
+import org.jetbrains.skia.ColorFilter as SkiaColorFilter
 
-actual typealias NativeColorFilter = SkijaColorFilter
+actual typealias NativeColorFilter = SkiaColorFilter
 
 /**
  * Obtain a reference to the desktop ColorFilter type
  */
-fun ColorFilter.asDesktopColorFilter(): SkijaColorFilter = nativeColorFilter
+fun ColorFilter.asDesktopColorFilter(): SkiaColorFilter = nativeColorFilter
 
-fun org.jetbrains.skija.ColorFilter.toComposeColorFilter(): ColorFilter = ColorFilter(this)
+fun org.jetbrains.skia.ColorFilter.toComposeColorFilter(): ColorFilter = ColorFilter(this)
 
 internal actual fun actualTintColorFilter(color: Color, blendMode: BlendMode): ColorFilter =
-    ColorFilter(SkijaColorFilter.makeBlend(color.toArgb(), blendMode.toSkija()))
+    ColorFilter(SkiaColorFilter.makeBlend(color.toArgb(), blendMode.toSkia()))
 
 internal actual fun actualColorMatrixColorFilter(colorMatrix: ColorMatrix): ColorFilter =
     ColorFilter(
-        SkijaColorFilter.makeMatrix(
-            org.jetbrains.skija.ColorMatrix(*colorMatrix.values)
+        SkiaColorFilter.makeMatrix(
+            org.jetbrains.skia.ColorMatrix(*colorMatrix.values)
         )
     )
 
 internal actual fun actualLightingColorFilter(multiply: Color, add: Color): ColorFilter =
-    ColorFilter(SkijaColorFilter.makeLighting(multiply.toArgb(), add.toArgb()))
\ No newline at end of file
+    ColorFilter(SkiaColorFilter.makeLighting(multiply.toArgb(), add.toArgb()))
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
index 5649f02..457a3fb 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
@@ -18,12 +18,12 @@
 
 import androidx.compose.ui.graphics.colorspace.ColorSpace
 import androidx.compose.ui.graphics.colorspace.ColorSpaces
-import org.jetbrains.skija.Bitmap
-import org.jetbrains.skija.ColorAlphaType
-import org.jetbrains.skija.ColorInfo
-import org.jetbrains.skija.ColorType
-import org.jetbrains.skija.Image
-import org.jetbrains.skija.ImageInfo
+import org.jetbrains.skia.Bitmap
+import org.jetbrains.skia.ColorAlphaType
+import org.jetbrains.skia.ColorInfo
+import org.jetbrains.skia.ColorType
+import org.jetbrains.skia.Image
+import org.jetbrains.skia.ImageInfo
 import java.nio.ByteBuffer
 import java.nio.ByteOrder
 import kotlin.math.abs
@@ -43,7 +43,7 @@
 private fun Image.toBitmap(): Bitmap {
     val bitmap = Bitmap()
     bitmap.allocPixels(ImageInfo.makeN32(width, height, ColorAlphaType.PREMUL))
-    val canvas = org.jetbrains.skija.Canvas(bitmap)
+    val canvas = org.jetbrains.skia.Canvas(bitmap)
     canvas.drawImage(this, 0f, 0f)
     bitmap.setImmutable()
     return bitmap
@@ -56,10 +56,10 @@
     hasAlpha: Boolean,
     colorSpace: ColorSpace
 ): ImageBitmap {
-    val colorType = config.toSkijaColorType()
+    val colorType = config.toSkiaColorType()
     val alphaType = if (hasAlpha) ColorAlphaType.PREMUL else ColorAlphaType.OPAQUE
-    val skijaColorSpace = colorSpace.toSkijaColorSpace()
-    val colorInfo = ColorInfo(colorType, alphaType, skijaColorSpace)
+    val skiaColorSpace = colorSpace.toSkiaColorSpace()
+    val colorInfo = ColorInfo(colorType, alphaType, skiaColorSpace)
     val imageInfo = ImageInfo(colorInfo, width, height)
     val bitmap = Bitmap()
     bitmap.allocPixels(imageInfo)
@@ -92,12 +92,12 @@
 
 /**
  * @Throws UnsupportedOperationException if this [ImageBitmap] is not backed by an
- * org.jetbrains.skija.Image
+ * org.jetbrains.skia.Image
  */
 fun ImageBitmap.asDesktopBitmap(): Bitmap =
     when (this) {
         is DesktopImageBitmap -> bitmap
-        else -> throw UnsupportedOperationException("Unable to obtain org.jetbrains.skija.Image")
+        else -> throw UnsupportedOperationException("Unable to obtain org.jetbrains.skia.Image")
     }
 
 private class DesktopImageBitmap(val bitmap: Bitmap) : ImageBitmap {
@@ -130,7 +130,7 @@
         val colorInfo = ColorInfo(
             ColorType.BGRA_8888,
             ColorAlphaType.UNPREMUL,
-            org.jetbrains.skija.ColorSpace.getSRGB()
+            org.jetbrains.skia.ColorSpace.sRGB
         )
         val imageInfo = ImageInfo(colorInfo, width, height)
         val bytesPerPixel = 4
@@ -145,10 +145,10 @@
 
 // TODO(demin): [API] maybe we should use:
 //  `else -> throw UnsupportedOperationException()`
-//  in toSkijaColorType/toComposeConfig/toComposeColorSpace/toSkijaColorSpace
+//  in toSkiaColorType/toComposeConfig/toComposeColorSpace/toSkiaColorSpace
 //  see [https://android-review.googlesource.com/c/platform/frameworks/support/+/1429835/comment/c219501b_63c3d1fe/]
 
-private fun ImageBitmapConfig.toSkijaColorType() = when (this) {
+private fun ImageBitmapConfig.toSkiaColorType() = when (this) {
     ImageBitmapConfig.Argb8888 -> ColorType.N32
     ImageBitmapConfig.Alpha8 -> ColorType.ALPHA_8
     ImageBitmapConfig.Rgb565 -> ColorType.RGB_565
@@ -164,22 +164,22 @@
     else -> ImageBitmapConfig.Argb8888
 }
 
-private fun org.jetbrains.skija.ColorSpace?.toComposeColorSpace(): ColorSpace {
+private fun org.jetbrains.skia.ColorSpace?.toComposeColorSpace(): ColorSpace {
     return when (this) {
-        org.jetbrains.skija.ColorSpace.getSRGB() -> ColorSpaces.Srgb
-        org.jetbrains.skija.ColorSpace.getSRGBLinear() -> ColorSpaces.LinearSrgb
-        org.jetbrains.skija.ColorSpace.getDisplayP3() -> ColorSpaces.DisplayP3
+        org.jetbrains.skia.ColorSpace.sRGB -> ColorSpaces.Srgb
+        org.jetbrains.skia.ColorSpace.sRGBLinear -> ColorSpaces.LinearSrgb
+        org.jetbrains.skia.ColorSpace.displayP3 -> ColorSpaces.DisplayP3
         else -> ColorSpaces.Srgb
     }
 }
 
 // TODO(demin): support all color spaces.
-//  to do this we need to implement SkColorSpace::MakeRGB in skija
-private fun ColorSpace.toSkijaColorSpace(): org.jetbrains.skija.ColorSpace {
+//  to do this we need to implement SkColorSpace::MakeRGB in skia
+private fun ColorSpace.toSkiaColorSpace(): org.jetbrains.skia.ColorSpace {
     return when (this) {
-        ColorSpaces.Srgb -> org.jetbrains.skija.ColorSpace.getSRGB()
-        ColorSpaces.LinearSrgb -> org.jetbrains.skija.ColorSpace.getSRGBLinear()
-        ColorSpaces.DisplayP3 -> org.jetbrains.skija.ColorSpace.getDisplayP3()
-        else -> org.jetbrains.skija.ColorSpace.getSRGB()
+        ColorSpaces.Srgb -> org.jetbrains.skia.ColorSpace.sRGB
+        ColorSpaces.LinearSrgb -> org.jetbrains.skia.ColorSpace.sRGBLinear
+        ColorSpaces.DisplayP3 -> org.jetbrains.skia.ColorSpace.displayP3
+        else -> org.jetbrains.skia.ColorSpace.sRGB
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
index 2eceb87..92678db 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
@@ -25,9 +25,9 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
-import org.jetbrains.skija.Bitmap
-import org.jetbrains.skija.ColorAlphaType
-import org.jetbrains.skija.ImageInfo
+import org.jetbrains.skia.Bitmap
+import org.jetbrains.skia.ColorAlphaType
+import org.jetbrains.skia.ImageInfo
 import java.awt.Image
 import java.awt.Point
 import java.awt.image.AbstractMultiResolutionImage
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
index 3242cf1..efed256 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
@@ -16,70 +16,70 @@
 
 package androidx.compose.ui.graphics
 
-import org.jetbrains.skija.PaintMode as SkijaPaintMode
-import org.jetbrains.skija.PaintStrokeCap as SkijaPaintStrokeCap
-import org.jetbrains.skija.PaintStrokeJoin as SkijaPaintStrokeJoin
+import org.jetbrains.skia.PaintMode as SkiaPaintMode
+import org.jetbrains.skia.PaintStrokeCap as SkiaPaintStrokeCap
+import org.jetbrains.skia.PaintStrokeJoin as SkiaPaintStrokeJoin
 
-actual typealias NativePaint = org.jetbrains.skija.Paint
+actual typealias NativePaint = org.jetbrains.skia.Paint
 
 actual fun Paint(): Paint = DesktopPaint()
 
 class DesktopPaint : Paint {
-    internal val skija = org.jetbrains.skija.Paint()
+    internal val skia = org.jetbrains.skia.Paint()
 
-    override fun asFrameworkPaint(): NativePaint = skija
+    override fun asFrameworkPaint(): NativePaint = skia
 
     override var alpha: Float
-        get() = Color(skija.color).alpha
+        get() = Color(skia.color).alpha
         set(value) {
-            skija.color = Color(skija.color).copy(alpha = value).toArgb()
+            skia.color = Color(skia.color).copy(alpha = value).toArgb()
         }
 
     override var isAntiAlias: Boolean
-        get() = skija.isAntiAlias
+        get() = skia.isAntiAlias
         set(value) {
-            skija.isAntiAlias = value
+            skia.isAntiAlias = value
         }
 
     override var color: Color
-        get() = Color(skija.color)
+        get() = Color(skia.color)
         set(color) {
-            skija.color = color.toArgb()
+            skia.color = color.toArgb()
         }
 
     override var blendMode: BlendMode = BlendMode.SrcOver
         set(value) {
-            skija.blendMode = value.toSkija()
+            skia.blendMode = value.toSkia()
             field = value
         }
 
     override var style: PaintingStyle = PaintingStyle.Fill
         set(value) {
-            skija.mode = value.toSkija()
+            skia.mode = value.toSkia()
             field = value
         }
 
     override var strokeWidth: Float
-        get() = skija.strokeWidth
+        get() = skia.strokeWidth
         set(value) {
-            skija.strokeWidth = value
+            skia.strokeWidth = value
         }
 
     override var strokeCap: StrokeCap = StrokeCap.Butt
         set(value) {
-            skija.strokeCap = value.toSkija()
+            skia.strokeCap = value.toSkia()
             field = value
         }
 
     override var strokeJoin: StrokeJoin = StrokeJoin.Round
         set(value) {
-            skija.strokeJoin = value.toSkija()
+            skia.strokeJoin = value.toSkia()
             field = value
         }
 
     override var strokeMiterLimit: Float = 0f
         set(value) {
-            skija.strokeMiter = value
+            skia.strokeMiter = value
             field = value
         }
 
@@ -87,40 +87,40 @@
 
     override var shader: Shader? = null
         set(value) {
-            skija.shader = value
+            skia.shader = value
             field = value
         }
 
     override var colorFilter: ColorFilter? = null
         set(value) {
-            skija.colorFilter = value?.asDesktopColorFilter()
+            skia.colorFilter = value?.asDesktopColorFilter()
             field = value
         }
 
     override var pathEffect: PathEffect? = null
         set(value) {
-            skija.pathEffect = (value as DesktopPathEffect?)?.asDesktopPathEffect()
+            skia.pathEffect = (value as DesktopPathEffect?)?.asDesktopPathEffect()
             field = value
         }
 
-    private fun PaintingStyle.toSkija() = when (this) {
-        PaintingStyle.Fill -> SkijaPaintMode.FILL
-        PaintingStyle.Stroke -> SkijaPaintMode.STROKE
-        else -> SkijaPaintMode.FILL
+    private fun PaintingStyle.toSkia() = when (this) {
+        PaintingStyle.Fill -> SkiaPaintMode.FILL
+        PaintingStyle.Stroke -> SkiaPaintMode.STROKE
+        else -> SkiaPaintMode.FILL
     }
 
-    private fun StrokeCap.toSkija() = when (this) {
-        StrokeCap.Butt -> SkijaPaintStrokeCap.BUTT
-        StrokeCap.Round -> SkijaPaintStrokeCap.ROUND
-        StrokeCap.Square -> SkijaPaintStrokeCap.SQUARE
-        else -> SkijaPaintStrokeCap.BUTT
+    private fun StrokeCap.toSkia() = when (this) {
+        StrokeCap.Butt -> SkiaPaintStrokeCap.BUTT
+        StrokeCap.Round -> SkiaPaintStrokeCap.ROUND
+        StrokeCap.Square -> SkiaPaintStrokeCap.SQUARE
+        else -> SkiaPaintStrokeCap.BUTT
     }
 
-    private fun StrokeJoin.toSkija() = when (this) {
-        StrokeJoin.Miter -> SkijaPaintStrokeJoin.MITER
-        StrokeJoin.Round -> SkijaPaintStrokeJoin.ROUND
-        StrokeJoin.Bevel -> SkijaPaintStrokeJoin.BEVEL
-        else -> SkijaPaintStrokeJoin.MITER
+    private fun StrokeJoin.toSkia() = when (this) {
+        StrokeJoin.Miter -> SkiaPaintStrokeJoin.MITER
+        StrokeJoin.Round -> SkiaPaintStrokeJoin.ROUND
+        StrokeJoin.Bevel -> SkiaPaintStrokeJoin.BEVEL
+        else -> SkiaPaintStrokeJoin.MITER
     }
 }
 
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
index ca802b1..b79abce 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
@@ -19,26 +19,26 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.RoundRect
-import org.jetbrains.skija.Matrix33
-import org.jetbrains.skija.PathDirection
-import org.jetbrains.skija.PathFillMode
-import org.jetbrains.skija.PathOp
+import org.jetbrains.skia.Matrix33
+import org.jetbrains.skia.PathDirection
+import org.jetbrains.skia.PathFillMode
+import org.jetbrains.skia.PathOp
 
 actual fun Path(): Path = DesktopPath()
 
 /**
- * @Throws UnsupportedOperationException if this Path is not backed by an org.jetbrains.skija.Path
+ * @Throws UnsupportedOperationException if this Path is not backed by an org.jetbrains.skia.Path
  */
 @Suppress("NOTHING_TO_INLINE")
-inline fun Path.asDesktopPath(): org.jetbrains.skija.Path =
+inline fun Path.asDesktopPath(): org.jetbrains.skia.Path =
     if (this is DesktopPath) {
         internalPath
     } else {
-        throw UnsupportedOperationException("Unable to obtain org.jetbrains.skija.Path")
+        throw UnsupportedOperationException("Unable to obtain org.jetbrains.skia.Path")
     }
 
 class DesktopPath(
-    internalPath: org.jetbrains.skija.Path = org.jetbrains.skija.Path()
+    internalPath: org.jetbrains.skia.Path = org.jetbrains.skia.Path()
 ) : Path {
     var internalPath = internalPath
         private set
@@ -115,7 +115,7 @@
         forceMoveTo: Boolean
     ) {
         internalPath.arcTo(
-            rect.toSkijaRect(),
+            rect.toSkiaRect(),
             startAngleDegrees,
             sweepAngleDegrees,
             forceMoveTo
@@ -123,11 +123,11 @@
     }
 
     override fun addRect(rect: Rect) {
-        internalPath.addRect(rect.toSkijaRect(), PathDirection.COUNTER_CLOCKWISE)
+        internalPath.addRect(rect.toSkiaRect(), PathDirection.COUNTER_CLOCKWISE)
     }
 
     override fun addOval(oval: Rect) {
-        internalPath.addOval(oval.toSkijaRect(), PathDirection.COUNTER_CLOCKWISE)
+        internalPath.addOval(oval.toSkiaRect(), PathDirection.COUNTER_CLOCKWISE)
     }
 
     override fun addArcRad(oval: Rect, startAngleRadians: Float, sweepAngleRadians: Float) {
@@ -135,11 +135,11 @@
     }
 
     override fun addArc(oval: Rect, startAngleDegrees: Float, sweepAngleDegrees: Float) {
-        internalPath.addArc(oval.toSkijaRect(), startAngleDegrees, sweepAngleDegrees)
+        internalPath.addArc(oval.toSkiaRect(), startAngleDegrees, sweepAngleDegrees)
     }
 
     override fun addRoundRect(roundRect: RoundRect) {
-        internalPath.addRRect(roundRect.toSkijaRRect(), PathDirection.COUNTER_CLOCKWISE)
+        internalPath.addRRect(roundRect.toSkiaRRect(), PathDirection.COUNTER_CLOCKWISE)
     }
 
     override fun addPath(path: Path, offset: Offset) {
@@ -177,17 +177,17 @@
         path2: Path,
         operation: PathOperation
     ): Boolean {
-        val path = org.jetbrains.skija.Path.makeCombining(
+        val path = org.jetbrains.skia.Path.makeCombining(
             path1.asDesktopPath(),
             path2.asDesktopPath(),
-            operation.toSkijaOperation()
+            operation.toSkiaOperation()
         )
 
         internalPath = path ?: internalPath
         return path != null
     }
 
-    private fun PathOperation.toSkijaOperation() = when (this) {
+    private fun PathOperation.toSkiaOperation() = when (this) {
         PathOperation.Difference -> PathOp.DIFFERENCE
         PathOperation.Intersect -> PathOp.INTERSECT
         PathOperation.Union -> PathOp.UNION
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
index d10e7b3..566a243 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
@@ -16,23 +16,23 @@
 
 package androidx.compose.ui.graphics
 
-import org.jetbrains.skija.PathEffect as SkijaPathEffect
+import org.jetbrains.skia.PathEffect as SkiaPathEffect
 
-internal class DesktopPathEffect(val nativePathEffect: SkijaPathEffect) : PathEffect
+internal class DesktopPathEffect(val nativePathEffect: SkiaPathEffect) : PathEffect
 
 /**
  * Obtain a reference to the desktop PathEffect type
  */
-fun PathEffect.asDesktopPathEffect(): SkijaPathEffect =
+fun PathEffect.asDesktopPathEffect(): SkiaPathEffect =
     (this as DesktopPathEffect).nativePathEffect
 
 internal actual fun actualCornerPathEffect(radius: Float): PathEffect =
-    DesktopPathEffect(SkijaPathEffect.makeCorner(radius))
+    DesktopPathEffect(SkiaPathEffect.makeCorner(radius))
 
 internal actual fun actualDashPathEffect(
     intervals: FloatArray,
     phase: Float
-): PathEffect = DesktopPathEffect(SkijaPathEffect.makeDash(intervals, phase))
+): PathEffect = DesktopPathEffect(SkiaPathEffect.makeDash(intervals, phase))
 
 internal actual fun actualChainPathEffect(outer: PathEffect, inner: PathEffect): PathEffect =
     DesktopPathEffect(outer.asDesktopPathEffect().makeCompose(inner.asDesktopPathEffect()))
@@ -44,18 +44,18 @@
     style: StampedPathEffectStyle
 ): PathEffect =
     DesktopPathEffect(
-        SkijaPathEffect.makePath1D(
+        SkiaPathEffect.makePath1D(
             shape.asDesktopPath(),
             advance,
             phase,
-            style.toSkijaStampedPathEffectStyle()
+            style.toSkiaStampedPathEffectStyle()
         )
     )
 
-internal fun StampedPathEffectStyle.toSkijaStampedPathEffectStyle(): SkijaPathEffect.Style =
+internal fun StampedPathEffectStyle.toSkiaStampedPathEffectStyle(): SkiaPathEffect.Style =
     when (this) {
-        StampedPathEffectStyle.Morph -> SkijaPathEffect.Style.MORPH
-        StampedPathEffectStyle.Rotate -> SkijaPathEffect.Style.ROTATE
-        StampedPathEffectStyle.Translate -> SkijaPathEffect.Style.TRANSLATE
-        else -> SkijaPathEffect.Style.TRANSLATE
+        StampedPathEffectStyle.Morph -> SkiaPathEffect.Style.MORPH
+        StampedPathEffectStyle.Rotate -> SkiaPathEffect.Style.ROTATE
+        StampedPathEffectStyle.Translate -> SkiaPathEffect.Style.TRANSLATE
+        else -> SkiaPathEffect.Style.TRANSLATE
     }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt
index ab8090d..4f279e0 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt
@@ -17,10 +17,10 @@
 package androidx.compose.ui.graphics
 
 internal class DesktopPathMeasure : PathMeasure {
-    private val skija = org.jetbrains.skija.PathMeasure()
+    private val skia = org.jetbrains.skia.PathMeasure()
 
     override fun setPath(path: Path?, forceClosed: Boolean) {
-        skija.setPath(path?.asDesktopPath(), forceClosed)
+        skia.setPath(path?.asDesktopPath(), forceClosed)
     }
 
     override fun getSegment(
@@ -28,7 +28,7 @@
         stopDistance: Float,
         destination: Path,
         startWithMoveTo: Boolean
-    ) = skija.getSegment(
+    ) = skia.getSegment(
         startDistance,
         stopDistance,
         destination.asDesktopPath(),
@@ -36,7 +36,7 @@
     )
 
     override val length: Float
-        get() = skija.length
+        get() = skia.length
 }
 
 actual fun PathMeasure(): PathMeasure =
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
index 516fdeb..5afb3c5 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
@@ -17,9 +17,9 @@
 package androidx.compose.ui.graphics
 
 import androidx.compose.ui.geometry.Offset
-import org.jetbrains.skija.GradientStyle
+import org.jetbrains.skia.GradientStyle
 
-actual typealias Shader = org.jetbrains.skija.Shader
+actual typealias Shader = org.jetbrains.skia.Shader
 
 internal actual fun ActualLinearGradientShader(
     from: Offset,
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
index f266fd9..a4ead37 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.ui.graphics
 
-import org.jetbrains.skija.FilterTileMode
+import org.jetbrains.skia.FilterTileMode
 
 actual fun TileMode.isSupported(): Boolean = true
 
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Matrices.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Matrices.desktop.kt
index 8580618..9a7f904 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Matrices.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Matrices.desktop.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.ui.graphics
 
-import org.jetbrains.skija.Matrix33
+import org.jetbrains.skia.Matrix33
 
 internal fun identityMatrix33() = Matrix33(
     1f, 0f, 0f,
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Rects.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Rects.desktop.kt
index 6aae00c..196e43c 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Rects.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/Rects.desktop.kt
@@ -18,8 +18,8 @@
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.RoundRect
 
-fun Rect.toSkijaRect(): org.jetbrains.skija.Rect {
-    return org.jetbrains.skija.Rect.makeLTRB(
+fun Rect.toSkiaRect(): org.jetbrains.skia.Rect {
+    return org.jetbrains.skia.Rect.makeLTRB(
         left,
         top,
         right,
@@ -27,10 +27,10 @@
     )
 }
 
-fun org.jetbrains.skija.Rect.toComposeRect() =
+fun org.jetbrains.skia.Rect.toComposeRect() =
     androidx.compose.ui.geometry.Rect(left, top, right, bottom)
 
-fun RoundRect.toSkijaRRect(): org.jetbrains.skija.RRect {
+fun RoundRect.toSkiaRRect(): org.jetbrains.skia.RRect {
     val radii = FloatArray(8)
 
     radii[0] = topLeftCornerRadius.x
@@ -45,5 +45,5 @@
     radii[6] = bottomLeftCornerRadius.x
     radii[7] = bottomLeftCornerRadius.y
 
-    return org.jetbrains.skija.RRect.makeComplexLTRB(left, top, right, bottom, radii)
+    return org.jetbrains.skia.RRect.makeComplexLTRB(left, top, right, bottom, radii)
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt
index b4de566..1843b5a 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.runtime.Immutable
 import androidx.compose.ui.geometry.Offset
-import org.jetbrains.skija.ImageFilter
+import org.jetbrains.skia.ImageFilter
 
 /**
  * Convert the [ImageFilter] instance into a compose compatible [RenderEffect]
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
index cec9d34..278473f 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
@@ -17,7 +17,7 @@
 package androidx.compose.ui.graphics
 
 import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
-import org.jetbrains.skija.Surface
+import org.jetbrains.skia.Surface
 import org.junit.After
 import org.junit.Rule
 
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkijaTest.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
similarity index 96%
rename from compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkijaTest.desktop.kt
rename to compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
index 5a02b9c..a843ecb 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkijaTest.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
@@ -15,7 +15,7 @@
  */
 package androidx.compose.ui.test.junit4
 
-import org.jetbrains.skija.Surface
+import org.jetbrains.skia.Surface
 import org.junit.rules.TestRule
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
@@ -48,7 +48,7 @@
     val modulePrefix: String
 )
 
-class SkijaTestAlbum(val config: GoldenConfig) {
+class SkiaTestAlbum(val config: GoldenConfig) {
     data class Report(val screenshots: Map<String, ScreenshotResultProto>)
 
     private val screenshots: MutableMap<String, ScreenshotResultProto> = mutableMapOf()
@@ -165,14 +165,14 @@
 
 class ScreenshotTestRule internal constructor(val config: GoldenConfig) : TestRule {
     private lateinit var testIdentifier: String
-    private lateinit var album: SkijaTestAlbum
+    private lateinit var album: SkiaTestAlbum
 
     val executionQueue = LinkedList<() -> Unit>()
 
     override fun apply(base: Statement, description: Description?): Statement {
         return object : Statement() {
             override fun evaluate() {
-                album = SkijaTestAlbum(config)
+                album = SkiaTestAlbum(config)
                 testIdentifier = "${description!!.className}_${description.methodName}"
                     .replace(".", "_").replace(",", "_").replace(" ", "_").replace("__", "_")
                 base.evaluate()
@@ -193,7 +193,7 @@
         album.snap(surface, id)
     }
 
-    private fun handleReport(report: SkijaTestAlbum.Report) {
+    private fun handleReport(report: SkiaTestAlbum.Report) {
         report.screenshots.forEach { (_, sReport) ->
             when (sReport.result) {
                 ScreenshotResultProto.Status.PASSED -> {
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index 2a8d69e..273f517 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -353,7 +353,7 @@
     method public default void moveTo(int pointerId, long position, optional long delayMillis);
     method public default void moveTo(long position, optional long delayMillis);
     method public void up(optional int pointerId);
-    method public void updatePointerBy(int pointerId, long delta);
+    method public default void updatePointerBy(int pointerId, long delta);
     method public void updatePointerTo(int pointerId, long position);
   }
 
diff --git a/compose/ui/ui-test/api/public_plus_experimental_current.txt b/compose/ui/ui-test/api/public_plus_experimental_current.txt
index 6e1a437..dbaa608 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -386,7 +386,7 @@
     method public default void moveTo(int pointerId, long position, optional long delayMillis);
     method public default void moveTo(long position, optional long delayMillis);
     method public void up(optional int pointerId);
-    method public void updatePointerBy(int pointerId, long delta);
+    method public default void updatePointerBy(int pointerId, long delta);
     method public void updatePointerTo(int pointerId, long position);
   }
 
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index 3d21d35..49425a7 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -354,7 +354,7 @@
     method public default void moveTo(int pointerId, long position, optional long delayMillis);
     method public default void moveTo(long position, optional long delayMillis);
     method public void up(optional int pointerId);
-    method public void updatePointerBy(int pointerId, long delta);
+    method public default void updatePointerBy(int pointerId, long delta);
     method public void updatePointerTo(int pointerId, long position);
   }
 
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
index c143d6d0..382f3e0 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
@@ -121,13 +121,6 @@
             inputDispatcher.updateTouchPointer(pointerId, globalPosition)
         }
 
-        override fun updatePointerBy(pointerId: Int, delta: Offset) {
-            // Ignore currentPosition of null here, let movePointer generate the error
-            val globalPosition =
-                (inputDispatcher.getCurrentTouchPosition(pointerId) ?: Offset.Zero) + delta
-            inputDispatcher.updateTouchPointer(pointerId, globalPosition)
-        }
-
         override fun move(delayMillis: Long) {
             advanceEventTime(delayMillis)
             inputDispatcher.enqueueTouchMove()
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
index 1cb4e53..3120643 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
@@ -235,7 +235,11 @@
      * pointer. For example, `delta = Offset(10.px, -10.px) will add 10.px to the pointer's
      * x-position, and subtract 10.px from the pointer's y-position.
      */
-    fun updatePointerBy(pointerId: Int, delta: Offset)
+    fun updatePointerBy(pointerId: Int, delta: Offset) {
+        // Ignore currentPosition of null here, let updatePointerTo generate the error
+        val position = (currentPosition(pointerId) ?: Offset.Zero) + delta
+        updatePointerTo(pointerId, position)
+    }
 
     /**
      * Sends a move event [delayMillis] after the last sent event without updating any of the
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt
index 71dcbc2e..ccb4e3f 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.ui.text
 
-import org.jetbrains.skija.BreakIterator
+import org.jetbrains.skia.BreakIterator
 
 internal actual fun String.findPrecedingBreak(index: Int): Int {
     val it = BreakIterator.makeCharacterInstance()
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
index d6fda08c..7922c3b 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
@@ -23,11 +23,11 @@
 import androidx.compose.ui.text.font.GenericFontFamily
 import androidx.compose.ui.text.font.LoadedFontFamily
 import androidx.compose.ui.util.fastForEach
-import org.jetbrains.skija.Data
-import org.jetbrains.skija.FontMgr
-import org.jetbrains.skija.Typeface as SkTypeface
-import org.jetbrains.skija.paragraph.FontCollection
-import org.jetbrains.skija.paragraph.TypefaceFontProvider
+import org.jetbrains.skia.Data
+import org.jetbrains.skia.FontMgr
+import org.jetbrains.skia.Typeface as SkTypeface
+import org.jetbrains.skia.paragraph.FontCollection
+import org.jetbrains.skia.paragraph.TypefaceFontProvider
 import java.io.File
 import java.security.MessageDigest
 import androidx.compose.ui.text.font.Font
@@ -272,7 +272,7 @@
 }
 
 /**
- * Returns a Compose [Typeface] from Skija [SkTypeface].
+ * Returns a Compose [Typeface] from Skia [SkTypeface].
  *
  * @param typeface Android Typeface instance
  */
@@ -299,7 +299,7 @@
     private val fontProvider = TypefaceFontProvider()
 
     init {
-        fonts.setDefaultFontManager(FontMgr.getDefault())
+        fonts.setDefaultFontManager(FontMgr.default)
         fonts.setAssetFontManager(fontProvider)
     }
 
@@ -332,7 +332,7 @@
                 listOf(alias)
             }
             is GenericFontFamily -> mapGenericFontFamily(fontFamily)
-            FontFamily.Default -> listOf()
+            FontFamily.Default -> mapGenericFontFamily(FontFamily.SansSerif)
             else -> throw IllegalArgumentException("Unknown font family type: $fontFamily")
         }
 
@@ -359,14 +359,9 @@
         fontWeight: FontWeight = FontWeight.Normal,
         fontStyle: FontStyle = FontStyle.Normal
     ): SkTypeface? {
-        return when (fontFamily) {
-            FontFamily.Default -> fonts.defaultFallback()
-            else -> {
-                val aliases = ensureRegistered(fontFamily)
-                val style = fontStyle.toSkFontStyle().withWeight(fontWeight.weight)
-                fonts.findTypefaces(aliases.toTypedArray(), style).first()
-            }
-        }
+        val aliases = ensureRegistered(fontFamily)
+        val style = fontStyle.toSkFontStyle().withWeight(fontWeight.weight)
+        return fonts.findTypefaces(aliases.toTypedArray(), style).first()
     }
 }
 
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
index 6f1759e..d3fb855 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
@@ -50,32 +50,32 @@
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.isSpecified
 import androidx.compose.ui.unit.sp
-import org.jetbrains.skija.Paint
-import org.jetbrains.skija.Typeface
-import org.jetbrains.skija.paragraph.Alignment as SkAlignment
-import org.jetbrains.skija.paragraph.BaselineMode
-import org.jetbrains.skija.paragraph.Direction as SkDirection
-import org.jetbrains.skija.paragraph.LineMetrics
-import org.jetbrains.skija.paragraph.ParagraphBuilder
-import org.jetbrains.skija.paragraph.ParagraphStyle
-import org.jetbrains.skija.paragraph.PlaceholderAlignment
-import org.jetbrains.skija.paragraph.PlaceholderStyle
-import org.jetbrains.skija.paragraph.RectHeightMode
-import org.jetbrains.skija.paragraph.RectWidthMode
-import org.jetbrains.skija.paragraph.StrutStyle
-import org.jetbrains.skija.paragraph.TextBox
+import org.jetbrains.skia.Paint
+import org.jetbrains.skia.Typeface
+import org.jetbrains.skia.paragraph.Alignment as SkAlignment
+import org.jetbrains.skia.paragraph.BaselineMode
+import org.jetbrains.skia.paragraph.Direction as SkDirection
+import org.jetbrains.skia.paragraph.LineMetrics
+import org.jetbrains.skia.paragraph.ParagraphBuilder
+import org.jetbrains.skia.paragraph.ParagraphStyle
+import org.jetbrains.skia.paragraph.PlaceholderAlignment
+import org.jetbrains.skia.paragraph.PlaceholderStyle
+import org.jetbrains.skia.paragraph.RectHeightMode
+import org.jetbrains.skia.paragraph.RectWidthMode
+import org.jetbrains.skia.paragraph.StrutStyle
+import org.jetbrains.skia.paragraph.TextBox
 import java.lang.IllegalStateException
 import java.lang.UnsupportedOperationException
 import java.util.WeakHashMap
 import kotlin.math.floor
-import org.jetbrains.skija.Rect as SkRect
-import org.jetbrains.skija.paragraph.Paragraph as SkParagraph
-import org.jetbrains.skija.paragraph.TextStyle as SkTextStyle
-import org.jetbrains.skija.FontStyle as SkFontStyle
-import org.jetbrains.skija.Font as SkFont
-import org.jetbrains.skija.paragraph.DecorationLineStyle as SkDecorationLineStyle
-import org.jetbrains.skija.paragraph.DecorationStyle as SkDecorationStyle
-import org.jetbrains.skija.paragraph.Shadow as SkShadow
+import org.jetbrains.skia.Rect as SkRect
+import org.jetbrains.skia.paragraph.Paragraph as SkParagraph
+import org.jetbrains.skia.paragraph.TextStyle as SkTextStyle
+import org.jetbrains.skia.FontStyle as SkFontStyle
+import org.jetbrains.skia.Font as SkFont
+import org.jetbrains.skia.paragraph.DecorationLineStyle as SkDecorationLineStyle
+import org.jetbrains.skia.paragraph.DecorationStyle as SkDecorationStyle
+import org.jetbrains.skia.paragraph.Shadow as SkShadow
 
 private val DefaultFontSize = 16.sp
 
@@ -145,7 +145,7 @@
         get() = paragraphIntrinsics.text
 
     override val height: Float
-        get() = para.getHeight()
+        get() = para.height
 
     override val minIntrinsicWidth: Float
         get() = paragraphIntrinsics.minIntrinsicWidth
@@ -298,7 +298,8 @@
                 )
             )
         } else {
-            para.lineMetrics
+            @Suppress("UNCHECKED_CAST")
+            para.lineMetrics as Array<LineMetrics>
         }
 
     private fun getBoxForwardByOffset(offset: Int): TextBox? {
@@ -341,8 +342,8 @@
 
     override fun getBidiRunDirection(offset: Int): ResolvedTextDirection =
         when (getBoxForwardByOffset(offset)?.direction) {
-            org.jetbrains.skija.paragraph.Direction.RTL -> ResolvedTextDirection.Rtl
-            org.jetbrains.skija.paragraph.Direction.LTR -> ResolvedTextDirection.Ltr
+            org.jetbrains.skia.paragraph.Direction.RTL -> ResolvedTextDirection.Rtl
+            org.jetbrains.skia.paragraph.Direction.LTR -> ResolvedTextDirection.Ltr
             null -> ResolvedTextDirection.Ltr
         }
 
@@ -446,7 +447,7 @@
         }
         fontFamily?.let {
             val fontFamilies = fontLoader.ensureRegistered(it)
-            res.setFontFamilies(fontFamilies.toTypedArray())
+            res.fontFamilies = fontFamilies.toTypedArray()
         }
         fontStyle?.let {
             res.fontStyle = it.toSkFontStyle()
@@ -796,8 +797,8 @@
 
 fun FontStyle.toSkFontStyle(): SkFontStyle {
     return when (this) {
-        FontStyle.Italic -> org.jetbrains.skija.FontStyle.ITALIC
-        else -> org.jetbrains.skija.FontStyle.NORMAL
+        FontStyle.Italic -> org.jetbrains.skia.FontStyle.ITALIC
+        else -> org.jetbrains.skia.FontStyle.NORMAL
     }
 }
 
@@ -859,7 +860,7 @@
 
 internal fun TextBox.cursorHorizontalPosition(opposite: Boolean = false): Float {
     return when (direction) {
-        SkDirection.LTR, null -> if (opposite) rect.left else rect.right
+        SkDirection.LTR -> if (opposite) rect.left else rect.right
         SkDirection.RTL -> if (opposite) rect.right else rect.left
     }
 }
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
index 1f9734d..998fd99 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
@@ -28,7 +28,7 @@
 import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.text.style.TextDirection
 import androidx.compose.ui.unit.Density
-import org.jetbrains.skija.paragraph.Paragraph
+import org.jetbrains.skia.paragraph.Paragraph
 import kotlin.math.ceil
 
 internal actual fun ActualParagraphIntrinsics(
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
index 440782a..3a35dd8 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
@@ -24,8 +24,8 @@
 import androidx.compose.ui.text.platform.GenericFontFamiliesMapping
 import androidx.compose.ui.text.platform.Typeface
 import com.google.common.truth.Truth
-import org.jetbrains.skija.Data
-import org.jetbrains.skija.Typeface
+import org.jetbrains.skia.Data
+import org.jetbrains.skia.Typeface
 import org.junit.Assume.assumeTrue
 import org.junit.Rule
 import org.junit.Test
@@ -75,7 +75,7 @@
             .isEqualTo(GenericFontFamiliesMapping[FontFamily.Cursive.name])
 
         Truth.assertThat(fontLoader.ensureRegistered(FontFamily.Default))
-            .isEqualTo(emptyList<String>())
+            .isEqualTo(GenericFontFamiliesMapping[FontFamily.SansSerif.name])
 
         Truth.assertThat(fontLoader.ensureRegistered(loadedFontFamily))
             .isEqualTo(listOf("Sample Font"))
diff --git a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
index b0c394f..2b06bd8 100644
--- a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
@@ -20,10 +20,13 @@
 import androidx.compose.animation.EnterExitState
 import androidx.compose.animation.ExperimentalAnimationApi
 import androidx.compose.animation.animateColor
+import androidx.compose.animation.core.ExperimentalTransitionApi
 import androidx.compose.animation.core.InternalAnimationApi
 import androidx.compose.animation.core.LinearEasing
 import androidx.compose.animation.core.Transition
+import androidx.compose.animation.core.animateDp
 import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.createChildTransition
 import androidx.compose.animation.core.tween
 import androidx.compose.animation.core.updateTransition
 import androidx.compose.animation.fadeIn
@@ -41,6 +44,7 @@
 import androidx.test.filters.MediumTest
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Rule
@@ -95,7 +99,7 @@
         assertEquals(72f, rotation.value as Float, eps)
 
         animatedProperties = testClock.getAnimatedProperties(offsetAnimation!!)
-        val offset = animatedProperties.single()
+        val offset = animatedProperties.single { it.label == "myOffset" }
         // We're animating from O1 (0) to O2 (100). There is a transition of 800ms defined for
         // the offset, and we set the clock to 25% of this time.
         assertEquals(25f, offset.value as Float, eps)
@@ -122,6 +126,24 @@
     }
 
     @Test
+    fun getAnimatedPropertiesReturnsAllDescendantAnimations() {
+        var transitionAnimation: ComposeAnimation? = null
+
+        composeRule.setContent {
+            transitionAnimation = setUpOffsetScenario()
+        }
+        composeRule.waitForIdle()
+
+        val animatedProperties = testClock.getAnimatedProperties(transitionAnimation!!)
+        // getAnimatedProperties should return all the transition animations as well as the
+        // animations of all descendant transitions
+        assertNotNull(animatedProperties.single { it.label == "myOffset" })
+        assertNotNull(animatedProperties.single { it.label == "child1 scale" })
+        assertNotNull(animatedProperties.single { it.label == "child2 color" })
+        assertNotNull(animatedProperties.single { it.label == "grandchild" })
+    }
+
+    @Test
     fun getAnimatedPropertiesReturnsChildAnimations() {
         var animatedVisibility: ComposeAnimation? = null
 
@@ -357,6 +379,9 @@
     }
 
     // Sets up a transition animation scenario, going from from Offset.O1 to Offset.O2.
+    // The main transition in this scenario also has 2 child animations. One of them has a child
+    // animation of its own.
+    @OptIn(ExperimentalTransitionApi::class)
     @Suppress("UNCHECKED_CAST")
     @Composable
     private fun setUpOffsetScenario(): ComposeAnimation {
@@ -373,6 +398,21 @@
             }
         }
 
+        val child1 = transition.createChildTransition { it == Offset.O1 }
+        child1.animateFloat(label = "child1 scale") { pressed ->
+            if (pressed) 1f else 3f
+        }
+
+        child1.createChildTransition { it }
+            .animateDp(label = "grandchild") { parentState ->
+                if (parentState) 1.dp else 3.dp
+            }
+
+        transition.createChildTransition { it }
+            .animateColor(label = "child2 color") { state ->
+                if (state == Offset.O1) Color.Red else Color.Blue
+            }
+
         testClock.trackTransition(transition as Transition<Any>)
         val animation = testClock.trackedTransitions.single { it.states.contains(Offset.O1) }
         testClock.updateFromAndToStates(animation, Offset.O1, Offset.O2)
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
index 950f573..03aaf36 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
@@ -231,16 +231,13 @@
         if (trackedTransitions.contains(animation)) {
             val transition = (animation as TransitionComposeAnimation).animationObject
             // In case the transition have child transitions, make sure to return their
-            // animations as well.
-            // TODO(b/187962923): support indirect descendants, e.g. grandchildren animations.
-            val animations =
-                transition.animations + transition.transitions.flatMap { it.animations }
-            return animations.mapNotNull {
+            // descendant animations as well.
+            return transition.allAnimations().mapNotNull {
                 ComposeAnimatedProperty(it.label, it.value ?: return@mapNotNull null)
             }
         } else if (trackedAnimatedVisibility.contains(animation)) {
             (animation as AnimatedVisibilityComposeAnimation).childTransition?.let { child ->
-                return child.animations.mapNotNull {
+                return child.allAnimations().mapNotNull {
                     ComposeAnimatedProperty(it.label, it.value ?: return@mapNotNull null)
                 }
             }
@@ -293,4 +290,13 @@
 
     private fun AnimatedVisibilityState.toCurrentTargetPair() =
         if (this == AnimatedVisibilityState.Enter) false to true else true to false
+
+    /**
+     * Return all the animations of a [Transition], as well as all the animations of its every
+     * descendant [Transition]s.
+     */
+    private fun Transition<*>.allAnimations(): List<Transition<*>.TransitionAnimationState<*, *>> {
+        val descendantAnimations = transitions.flatMap { it.allAnimations() }
+        return animations + descendantAnimations
+    }
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
index 08e51fe..284ce94 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
@@ -17,6 +17,8 @@
 package androidx.compose.ui.input.pointer
 
 import android.content.Context
+import android.os.Handler
+import android.os.Looper
 import android.view.MotionEvent
 import android.view.MotionEvent.ACTION_DOWN
 import android.view.MotionEvent.ACTION_HOVER_ENTER
@@ -73,6 +75,7 @@
 import com.nhaarman.mockitokotlin2.spy
 import com.nhaarman.mockitokotlin2.verify
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Ignore
@@ -467,6 +470,75 @@
         }
     }
 
+    @Test
+    fun detectTapGestures_blockedMainThread() {
+        var didLongPress = false
+        var didTap = false
+        var inputLatch = CountDownLatch(1)
+        var positionedLatch = CountDownLatch(1)
+
+        rule.runOnUiThread {
+            container.setContent {
+                FillLayout(
+                    Modifier
+                        .pointerInput(Unit) {
+                            detectTapGestures(
+                                onLongPress = { didLongPress = true; inputLatch.countDown() },
+                                onTap = { didTap = true; inputLatch.countDown() }
+                            )
+                        }
+                        .onGloballyPositioned { positionedLatch.countDown() }
+                )
+            }
+        }
+
+        assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
+        val locationInWindow = IntArray(2)
+        container.getLocationInWindow(locationInWindow)
+
+        val handler = Handler(Looper.getMainLooper())
+
+        val touchUpDelay = 100
+        val sleepTime = android.view.ViewConfiguration.getLongPressTimeout() + 100L
+
+        repeat(5) { iteration ->
+            rule.runOnUiThread {
+                val downEvent = createPointerEventAt(
+                    iteration * sleepTime.toInt(),
+                    ACTION_DOWN,
+                    locationInWindow
+                )
+                findRootView(container).dispatchTouchEvent(downEvent)
+            }
+
+            rule.runOnUiThread {
+                val upEvent = createPointerEventAt(
+                    touchUpDelay + iteration * sleepTime.toInt(),
+                    ACTION_UP,
+                    locationInWindow
+                )
+                handler.postDelayed(
+                    Runnable {
+                        findRootView(container).dispatchTouchEvent(upEvent)
+                    },
+                    touchUpDelay.toLong()
+                )
+
+                // Block the UI thread from now until past the long-press
+                // timeout. This tests that even in pathological situations,
+                // the upEvent is still processed before the long-press timeout.
+                Thread.sleep(sleepTime)
+            }
+
+            assertTrue(inputLatch.await(1, TimeUnit.SECONDS))
+            assertFalse(didLongPress)
+            assertTrue(didTap)
+
+            didTap = false
+            inputLatch = CountDownLatch(1)
+        }
+    }
+
     /**
      * When a modifier is added, it should work, even when it takes the position of a previous
      * modifier.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
index 5268e43..ce285dd 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
@@ -558,7 +558,13 @@
                 )
             }
             val job = coroutineScope.launch {
-                delay(timeMillis)
+                // Delay twice because the timeout continuation needs to be lower-priority than
+                // input events, not treated fairly in FIFO order. The second
+                // micro-delay reposts it to the back of the queue, after any input events
+                // that were posted but not processed during the first delay.
+                delay(timeMillis - 1)
+                delay(1)
+
                 pointerAwaiter?.resumeWithException(
                     PointerEventTimeoutCancellationException(timeMillis)
                 )
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
index 25ebba8..37fa9bd 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
@@ -15,7 +15,7 @@
  */
 package androidx.compose.ui
 
-import org.jetbrains.skija.impl.Library
+import org.jetbrains.skia.impl.Library
 
 /**
  * Override global configuration for Swing that is needed for stand-alone Compose application.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
index 28cdaf8..45b95ce 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
@@ -32,7 +32,7 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.swing.Swing
-import org.jetbrains.skija.Canvas
+import org.jetbrains.skia.Canvas
 import org.jetbrains.skiko.SkiaLayer
 import org.jetbrains.skiko.SkiaRenderer
 import java.awt.Dimension
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
index b815f0f..33b32b3 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
@@ -221,7 +221,7 @@
     var onNeedsRender: (() -> Unit)? = null
     var onDispatchCommand: ((Command) -> Unit)? = null
 
-    fun render(canvas: org.jetbrains.skija.Canvas, width: Int, height: Int) {
+    fun render(canvas: org.jetbrains.skia.Canvas, width: Int, height: Int) {
         needsLayout = false
         setSize(width, height)
         measureAndLayout()
@@ -272,7 +272,7 @@
     override fun createLayer(
         drawBlock: (Canvas) -> Unit,
         invalidateParentLayer: () -> Unit
-    ) = SkijaLayer(
+    ) = SkiaLayer(
         density,
         invalidateParentLayer = {
             invalidateParentLayer()
@@ -314,7 +314,7 @@
         measureAndLayoutDelegate.updateRootConstraints(constraints)
     }
 
-    fun draw(canvas: org.jetbrains.skija.Canvas) {
+    fun draw(canvas: org.jetbrains.skia.Canvas) {
         root.draw(DesktopCanvas(canvas))
     }
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
index fd239fd..36000d4 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
@@ -29,7 +29,7 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.launch
-import org.jetbrains.skija.Canvas
+import org.jetbrains.skia.Canvas
 import java.awt.event.InputMethodEvent
 import java.awt.event.KeyEvent
 import java.awt.event.MouseEvent
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
similarity index 96%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt
rename to compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
index 834ef07..2c869a9 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
@@ -35,7 +35,7 @@
 import androidx.compose.ui.graphics.asDesktopPath
 import androidx.compose.ui.graphics.nativeCanvas
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.graphics.toSkijaRect
+import androidx.compose.ui.graphics.toSkiaRect
 import androidx.compose.ui.node.OwnedLayer
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntOffset
@@ -43,12 +43,12 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.toSize
-import org.jetbrains.skija.Picture
-import org.jetbrains.skija.PictureRecorder
-import org.jetbrains.skija.Point3
-import org.jetbrains.skija.ShadowUtils
+import org.jetbrains.skia.Picture
+import org.jetbrains.skia.PictureRecorder
+import org.jetbrains.skia.Point3
+import org.jetbrains.skia.ShadowUtils
 
-internal class SkijaLayer(
+internal class SkiaLayer(
     private var density: Density,
     private val invalidateParentLayer: () -> Unit,
     private val drawBlock: (Canvas) -> Unit,
@@ -212,7 +212,7 @@
     override fun drawLayer(canvas: Canvas) {
         if (picture == null) {
             val bounds = size.toSize().toRect()
-            val pictureCanvas = pictureRecorder.beginRecording(bounds.toSkijaRect())
+            val pictureCanvas = pictureRecorder.beginRecording(bounds.toSkiaRect())
             performDrawLayer(DesktopCanvas(pictureCanvas), bounds)
             picture = pictureRecorder.finishRecordingAsPicture()
         }
@@ -244,7 +244,7 @@
                 canvas.saveLayer(
                     bounds,
                     Paint().apply {
-                        alpha = this@SkijaLayer.alpha
+                        alpha = this@SkiaLayer.alpha
                         asFrameworkPaint().imageFilter = currentRenderEffect?.asDesktopImageFilter()
                     }
                 )
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
index 96e192f..075562b 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
@@ -27,7 +27,7 @@
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Runnable
 import kotlinx.coroutines.cancel
-import org.jetbrains.skija.Surface
+import org.jetbrains.skia.Surface
 import org.jetbrains.skiko.FrameDispatcher
 import kotlin.coroutines.CoroutineContext
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
index 9e3e459..7f8b27a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
@@ -29,13 +29,13 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
-import org.jetbrains.skija.Data
-import org.jetbrains.skija.Rect
-import org.jetbrains.skija.svg.SVGDOM
-import org.jetbrains.skija.svg.SVGLength
-import org.jetbrains.skija.svg.SVGLengthUnit
-import org.jetbrains.skija.svg.SVGPreserveAspectRatio
-import org.jetbrains.skija.svg.SVGPreserveAspectRatioAlign
+import org.jetbrains.skia.Data
+import org.jetbrains.skia.Rect
+import org.jetbrains.skia.svg.SVGDOM
+import org.jetbrains.skia.svg.SVGLength
+import org.jetbrains.skia.svg.SVGLengthUnit
+import org.jetbrains.skia.svg.SVGPreserveAspectRatio
+import org.jetbrains.skia.svg.SVGPreserveAspectRatioAlign
 import java.io.InputStream
 import kotlin.math.ceil
 
@@ -109,7 +109,7 @@
 
     init {
         if (root?.viewBox == null && defaultSizePx.isSpecified) {
-            root?.setViewBox(Rect.makeXYWH(0f, 0f, defaultSizePx.width, defaultSizePx.height))
+            root?.viewBox = Rect.makeXYWH(0f, 0f, defaultSizePx.width, defaultSizePx.height)
         }
     }
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
index 6e4d4e1..6af078d 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asImageBitmap
-import org.jetbrains.skija.Image
+import org.jetbrains.skia.Image
 import java.io.InputStream
 
 /**
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
index 3da991f..5698c81 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.window
 
 import androidx.compose.runtime.AbstractApplier
+import androidx.compose.runtime.Applier
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.runtime.Composition
@@ -94,7 +95,7 @@
     parentComposition: CompositionContext,
     content: @Composable (MenuScope.() -> Unit)
 ): Composition {
-    val applier = MutableListApplier(asMutableList())
+    val applier = MenuItemApplier(this)
     val composition = Composition(applier, parentComposition)
     val scope = MenuScope(AwtMenuScope())
     composition.setContent {
@@ -128,32 +129,6 @@
     return composition
 }
 
-// This menu is used by Tray
-@Composable
-private fun AwtMenu(
-    text: String,
-    enabled: Boolean,
-    content: @Composable MenuScope.() -> Unit
-) {
-    val menu = remember(::Menu)
-    val compositionContext = rememberCompositionContext()
-
-    DisposableEffect(Unit) {
-        val composition = menu.setContent(compositionContext, content)
-        onDispose {
-            composition.dispose()
-        }
-    }
-
-    ComposeNode<Menu, MutableListApplier<MenuItem>>(
-        factory = { menu },
-        update = {
-            set(text, Menu::setLabel)
-            set(enabled, Menu::setEnabled)
-        }
-    )
-}
-
 // TODO(demin): consider making MenuBarScope/MenuScope as an interface
 //  after b/165812010 will be fixed
 /**
@@ -263,16 +238,22 @@
             throw UnsupportedOperationException("java.awt.Menu doesn't support mnemonic")
         }
 
-        AwtMenu(
-            text,
-            enabled,
-            content
+        ComposeNode<Menu, MenuItemApplier>(
+            factory = { Menu() },
+            update = {
+                set(text, Menu::setLabel)
+                set(enabled, Menu::setEnabled)
+            },
+            content = {
+                val scope = MenuScope(this)
+                scope.content()
+            }
         )
     }
 
     @Composable
     override fun Separator() {
-        ComposeNode<MenuItem, MutableListApplier<MenuItem>>(
+        ComposeNode<MenuItem, MenuItemApplier>(
             // item with name "-" has different look
             factory = { MenuItem("-") },
             update = {}
@@ -300,7 +281,7 @@
 
         val currentOnClick by rememberUpdatedState(onClick)
 
-        ComposeNode<MenuItem, MutableListApplier<MenuItem>>(
+        ComposeNode<MenuItem, MenuItemApplier>(
             factory = {
                 MenuItem().apply {
                     addActionListener {
@@ -342,7 +323,7 @@
             CheckboxMenuItem::getState
         )
 
-        ComposeNode<CheckboxMenuItem, MutableListApplier<JComponent>>(
+        ComposeNode<CheckboxMenuItem, MenuItemApplier>(
             factory = {
                 CheckboxMenuItem().apply {
                     addItemListener {
@@ -726,6 +707,59 @@
     }
 }
 
+internal class MenuItemApplier(private val root: Menu) : Applier<MenuItem> {
+    override var current: MenuItem = root
+
+    override fun up() {
+        check(current != root)
+        current = current.parent as MenuItem
+    }
+
+    override fun down(node: MenuItem) {
+        check(current == node.parent)
+        current = node
+    }
+
+    override fun clear() {
+        current = root
+        root.removeAll()
+    }
+
+    override fun insertBottomUp(index: Int, instance: MenuItem) {
+        // Ignored as the tree is built top-down.
+    }
+
+    override fun insertTopDown(index: Int, instance: MenuItem) {
+        val menu = current.asMenu()
+        menu.insert(instance, index)
+    }
+
+    override fun move(from: Int, to: Int, count: Int) {
+        val menu = current.asMenu()
+
+        performMove(
+            from, to, count,
+            getItem = { menu.getItem(it) },
+            removeItem = { menu.remove(it) },
+            insertItem = { item, idx -> menu.insert(item, idx) }
+        )
+    }
+
+    override fun remove(index: Int, count: Int) {
+        val menu = current.asMenu()
+        for (i in index + count - 1 downTo index) {
+            menu.remove(i)
+        }
+    }
+
+    private fun MenuItem.asMenu(): Menu {
+        return when (this) {
+            is Menu -> this
+            else -> error("Can only insert MenuItem into Menu, not ${this::class}")
+        }
+    }
+}
+
 private fun JMenuBar.asMutableList(): MutableList<JComponent> {
     return object : AddRemoveMutableList<JComponent>() {
         override val size: Int get() = this@asMutableList.menuCount
@@ -741,21 +775,6 @@
     }
 }
 
-private fun Menu.asMutableList(): MutableList<MenuItem> {
-    return object : AddRemoveMutableList<MenuItem>() {
-        override val size: Int get() = this@asMutableList.itemCount
-        override fun get(index: Int) = this@asMutableList.getItem(index)
-
-        override fun performAdd(element: MenuItem) {
-            this@asMutableList.add(element)
-        }
-
-        override fun performRemove(index: Int) {
-            this@asMutableList.remove(index)
-        }
-    }
-}
-
 private fun AbstractButton.setMnemonic(char: Char?) {
     mnemonic = KeyEvent.getExtendedKeyCodeForChar(char?.code ?: 0)
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
index a5a4065..d068deb 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
@@ -71,7 +71,7 @@
 
 class DesktopOwnerTest {
     @get:Rule
-    val screenshotRule = DesktopScreenshotTestRule("ui/ui-desktop/ui")
+    val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/ui")
     @get:Rule
     val composeRule = createComposeRule()
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
index 95282d3..9e00a85 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
@@ -27,8 +27,8 @@
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.swing.Swing
 import kotlinx.coroutines.yield
-import org.jetbrains.skija.Canvas
-import org.jetbrains.skija.Surface
+import org.jetbrains.skia.Canvas
+import org.jetbrains.skia.Surface
 import org.jetbrains.skiko.FrameDispatcher
 import kotlin.coroutines.CoroutineContext
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
similarity index 98%
rename from compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt
rename to compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
index 85394ef..8c3f358 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
@@ -34,11 +34,11 @@
 import kotlin.math.cos
 import kotlin.math.roundToInt
 
-class SkijaLayerTest {
+class SkiaLayerTest {
     @get:Rule
     val rule = createComposeRule()
 
-    private val layer = TestSkijaLayer()
+    private val layer = TestSkiaLayer()
     private val cos45 = cos(PI / 4)
 
     @Test
@@ -312,13 +312,13 @@
         assertEquals(IntOffset(-10 * 4 + 60, 100 * 2 + 7), matrix.map(Offset(100f, 10f)).round())
     }
 
-    private fun TestSkijaLayer() = SkijaLayer(
+    private fun TestSkiaLayer() = SkiaLayer(
         Density(1f, 1f),
         invalidateParentLayer = {},
         drawBlock = {}
     )
 
-    private fun SkijaLayer.updateProperties(
+    private fun SkiaLayer.updateProperties(
         scaleX: Float = 1f,
         scaleY: Float = 1f,
         alpha: Float = 1f,
diff --git a/core/core-appdigest/src/main/java/androidx/core/appdigest/ChecksumsApiSImpl.java b/core/core-appdigest/src/main/java/androidx/core/appdigest/ChecksumsApiSImpl.java
index d5ecb50..dde540c 100644
--- a/core/core-appdigest/src/main/java/androidx/core/appdigest/ChecksumsApiSImpl.java
+++ b/core/core-appdigest/src/main/java/androidx/core/appdigest/ChecksumsApiSImpl.java
@@ -110,7 +110,7 @@
 
         context.getPackageManager().requestChecksums(packageName, includeSplits, required,
                 trustedInstallers, new PackageManager.OnChecksumsReadyListener() {
-                    @SuppressLint("WrongConstant")
+                    @SuppressLint({"WrongConstant", "ClassVerificationFailure"})
                     @Override
                     public void onChecksumsReady(List<ApkChecksum> apkChecksums) {
                         if (apkChecksums == null) {
diff --git a/core/core-ktx/api/1.7.0-beta01.txt b/core/core-ktx/api/1.7.0-beta01.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/1.7.0-beta01.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/1.7.0-beta02.txt b/core/core-ktx/api/1.7.0-beta02.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/1.7.0-beta02.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/public_plus_experimental_1.7.0-beta01.txt b/core/core-ktx/api/public_plus_experimental_1.7.0-beta01.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/public_plus_experimental_1.7.0-beta01.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/public_plus_experimental_1.7.0-beta02.txt b/core/core-ktx/api/public_plus_experimental_1.7.0-beta02.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/public_plus_experimental_1.7.0-beta02.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/res-1.7.0-beta01.txt b/core/core-ktx/api/res-1.7.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/core/core-ktx/api/res-1.7.0-beta01.txt
diff --git a/core/core-ktx/api/res-1.7.0-beta02.txt b/core/core-ktx/api/res-1.7.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/core/core-ktx/api/res-1.7.0-beta02.txt
diff --git a/core/core-ktx/api/restricted_1.7.0-beta01.txt b/core/core-ktx/api/restricted_1.7.0-beta01.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/restricted_1.7.0-beta01.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/restricted_1.7.0-beta02.txt b/core/core-ktx/api/restricted_1.7.0-beta02.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/restricted_1.7.0-beta02.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(@ColorInt int);
+    method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+    method public static inline int getBlue(@ColorInt int);
+    method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+    method public static inline int getGreen(@ColorInt int);
+    method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+    method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+    method public static inline int getRed(@ColorInt int);
+    method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-remoteviews/build.gradle b/core/core-remoteviews/build.gradle
index 0a9a624..fce25da 100644
--- a/core/core-remoteviews/build.gradle
+++ b/core/core-remoteviews/build.gradle
@@ -58,7 +58,7 @@
 androidx {
     name = "AndroidX RemoteViews Support"
     type = LibraryType.PUBLISHED_LIBRARY
-    mavenVersion = LibraryVersions.CORE
+    mavenVersion = LibraryVersions.CORE_REMOTEVIEWS
     mavenGroup = LibraryGroups.CORE
     inceptionYear = "2021"
     description = "AndroidX RemoteViews Support"
diff --git a/core/core/api/1.7.0-beta01.txt b/core/core/api/1.7.0-beta01.txt
new file mode 100644
index 0000000..38b153e
--- /dev/null
+++ b/core/core/api/1.7.0-beta01.txt
@@ -0,0 +1,3696 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/1.7.0-beta02.txt b/core/core/api/1.7.0-beta02.txt
new file mode 100644
index 0000000..38b153e
--- /dev/null
+++ b/core/core/api/1.7.0-beta02.txt
@@ -0,0 +1,3696 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/public_plus_experimental_1.7.0-beta01.txt b/core/core/api/public_plus_experimental_1.7.0-beta01.txt
new file mode 100644
index 0000000..4afa0aa
--- /dev/null
+++ b/core/core/api/public_plus_experimental_1.7.0-beta01.txt
@@ -0,0 +1,3700 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+    method @ChecksSdkIntAtLeast(codename="T") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastT();
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface BuildCompat.PrereleaseSdkCheck {
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/public_plus_experimental_1.7.0-beta02.txt b/core/core/api/public_plus_experimental_1.7.0-beta02.txt
new file mode 100644
index 0000000..4afa0aa
--- /dev/null
+++ b/core/core/api/public_plus_experimental_1.7.0-beta02.txt
@@ -0,0 +1,3700 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+    method @ChecksSdkIntAtLeast(codename="T") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastT();
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface BuildCompat.PrereleaseSdkCheck {
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/res-1.7.0-beta01.txt b/core/core/api/res-1.7.0-beta01.txt
new file mode 100644
index 0000000..dd913d3
--- /dev/null
+++ b/core/core/api/res-1.7.0-beta01.txt
@@ -0,0 +1,21 @@
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontProviderSystemFontFamily
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr lStar
+attr queryPatterns
+attr shortcutMatchRequired
+attr ttcIndex
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
diff --git a/core/core/api/res-1.7.0-beta02.txt b/core/core/api/res-1.7.0-beta02.txt
new file mode 100644
index 0000000..dd913d3
--- /dev/null
+++ b/core/core/api/res-1.7.0-beta02.txt
@@ -0,0 +1,21 @@
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontProviderSystemFontFamily
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr lStar
+attr queryPatterns
+attr shortcutMatchRequired
+attr ttcIndex
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
diff --git a/core/core/api/restricted_1.7.0-beta01.txt b/core/core/api/restricted_1.7.0-beta01.txt
new file mode 100644
index 0000000..c28a0bf
--- /dev/null
+++ b/core/core/api/restricted_1.7.0-beta01.txt
@@ -0,0 +1,4192 @@
+// Signature format: 4.0
+package android.support.v4.os {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ResultReceiver implements android.os.Parcelable {
+    ctor public ResultReceiver(android.os.Handler!);
+    method public int describeContents();
+    method protected void onReceiveResult(int, android.os.Bundle!);
+    method public void send(int, android.os.Bundle!);
+    method public void writeToParcel(android.os.Parcel!, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.os.ResultReceiver!>! CREATOR;
+  }
+
+}
+
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.ActivityCompat.PermissionCompatDelegate! getPermissionCompatDelegate();
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActivityCompat.RequestPermissionsRequestCodeValidator {
+    method public void validateRequestPermissionsRequestCode(int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ComponentActivity extends android.app.Activity implements androidx.core.view.KeyEventDispatcher.Component androidx.lifecycle.LifecycleOwner {
+    ctor public ComponentActivity();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T extends androidx.core.app.ComponentActivity.ExtraData> T! getExtraData(Class<T!>!);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void putExtraData(androidx.core.app.ComponentActivity.ExtraData!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ComponentActivity.ExtraData {
+    ctor @Deprecated public ComponentActivity.ExtraData();
+  }
+
+  @RequiresApi(api=28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CoreComponentFactory extends android.app.AppComponentFactory {
+    ctor public CoreComponentFactory();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface CoreComponentFactory.CompatWrapped {
+    method public Object! getWrapper();
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(@androidx.core.app.FrameMetricsAggregator.MetricType int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.FrameMetricsAggregator.TOTAL_DURATION, androidx.core.app.FrameMetricsAggregator.INPUT_DURATION, androidx.core.app.FrameMetricsAggregator.LAYOUT_MEASURE_DURATION, androidx.core.app.FrameMetricsAggregator.DRAW_DURATION, androidx.core.app.FrameMetricsAggregator.SYNC_DURATION, androidx.core.app.FrameMetricsAggregator.COMMAND_DURATION, androidx.core.app.FrameMetricsAggregator.SWAP_DURATION, androidx.core.app.FrameMetricsAggregator.DELAY_DURATION, androidx.core.app.FrameMetricsAggregator.ANIMATION_DURATION, androidx.core.app.FrameMetricsAggregator.EVERY_DURATION}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FrameMetricsAggregator.MetricType {
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NotificationBuilderWithBuilderAccessor {
+    method public android.app.Notification.Builder! getBuilder();
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.GroupAlertBehavior public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Action.Builder fromAndroidAction(android.app.Notification.Action);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.BADGE_ICON_NONE, androidx.core.app.NotificationCompat.BADGE_ICON_SMALL, androidx.core.app.NotificationCompat.BADGE_ICON_LARGE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.BadgeIconType {
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFlags(int);
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getBigContentView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata();
+    method @ColorInt @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getColor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getContentView();
+    method public android.os.Bundle getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getForegroundServiceBehavior();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getHeadsUpContentView();
+    method @Deprecated public android.app.Notification getNotification();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getPriority();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public long getWhenIfShowing();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(@androidx.core.app.NotificationCompat.BadgeIconType int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(@androidx.core.app.NotificationCompat.ServiceNotificationBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(@androidx.core.app.NotificationCompat.GroupAlertBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, @androidx.core.app.NotificationCompat.StreamType int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(@androidx.core.app.NotificationCompat.NotificationVisibility int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!>! mActions;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.Context! mContext;
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.Person!> mPersonList;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.GROUP_ALERT_ALL, androidx.core.app.NotificationCompat.GROUP_ALERT_SUMMARY, androidx.core.app.NotificationCompat.GROUP_ALERT_CHILDREN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.GroupAlertBehavior {
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC, androidx.core.app.NotificationCompat.VISIBILITY_PRIVATE, androidx.core.app.NotificationCompat.VISIBILITY_SECRET}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.NotificationVisibility {
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFAULT, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFERRED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.ServiceNotificationBehavior {
+  }
+
+  @IntDef({android.media.AudioManager.STREAM_VOICE_CALL, android.media.AudioManager.STREAM_SYSTEM, android.media.AudioManager.STREAM_RING, android.media.AudioManager.STREAM_MUSIC, android.media.AudioManager.STREAM_ALARM, android.media.AudioManager.STREAM_NOTIFICATION, android.media.AudioManager.STREAM_DTMF, android.media.AudioManager.STREAM_ACCESSIBILITY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.StreamType {
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addCompatExtras(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void apply(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews applyStandardTemplate(boolean, int, boolean);
+    method public android.app.Notification? build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void buildIntoRemoteViews(android.widget.RemoteViews!, android.widget.RemoteViews!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void clearCompatExtraKeys(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap! createColoredBitmap(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean displayCustomViewInline();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Style? extractStyleFromNotification(android.app.Notification);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected String? getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeBigContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeHeadsUpContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void restoreFromCompatExtras(android.os.Bundle);
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected androidx.core.app.NotificationCompat.Builder! mBuilder;
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromAndroidPerson(android.app.Person);
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromPersistableBundle(android.os.PersistableBundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String resolveToLegacyUri();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.app.Person toAndroidPerson();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.PersistableBundle toPersistableBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(jetifyAs="android.support.v4.app.RemoteActionCompat") public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public RemoteActionCompat();
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(4) public android.app.PendingIntent! mActionIntent;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(3) public CharSequence! mContentDescription;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(5) public boolean mEnabled;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(1) public androidx.core.graphics.drawable.IconCompat! mIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(6) public boolean mShouldShowIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(2) public CharSequence! mTitle;
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method @androidx.core.app.RemoteInput.EditChoicesBeforeSending public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method @androidx.core.app.RemoteInput.Source public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, @androidx.core.app.RemoteInput.Source int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(@androidx.core.app.RemoteInput.EditChoicesBeforeSending int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.EditChoicesBeforeSending {
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.SOURCE_FREE_FORM_INPUT, androidx.core.app.RemoteInput.SOURCE_CHOICE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.Source {
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, @androidx.core.app.ServiceCompat.StopForegroundFlags int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE, androidx.core.app.ServiceCompat.STOP_FOREGROUND_DETACH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ServiceCompat.StopForegroundFlags {
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingPermission(android.content.Context, String, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkPermission(android.content.Context, String, int, int, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.content.PermissionChecker.PERMISSION_GRANTED, androidx.core.content.PermissionChecker.PERMISSION_DENIED, androidx.core.content.PermissionChecker.PERMISSION_DENIED_APP_OP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PermissionChecker.PermissionResult {
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoChangeListener {
+    ctor public ShortcutInfoChangeListener();
+    method @AnyThread public void onAllShortcutsRemoved();
+    method @AnyThread public void onShortcutAdded(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutRemoved(java.util.List<java.lang.String!>);
+    method @AnyThread public void onShortcutUpdated(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutUsageReported(java.util.List<java.lang.String!>);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.graphics.drawable.IconCompat! getIcon();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(androidx.core.content.pm.ShortcutInfoCompat);
+    ctor @RequiresApi(25) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(android.content.Context, android.content.pm.ShortcutInfo);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoCompatSaver<T> {
+    ctor public ShortcutInfoCompatSaver();
+    method @AnyThread public abstract T! addShortcuts(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>!);
+    method @WorkerThread public java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>! getShortcuts() throws java.lang.Exception;
+    method @AnyThread public abstract T! removeAllShortcuts();
+    method @AnyThread public abstract T! removeShortcuts(java.util.List<java.lang.String!>!);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, @androidx.core.content.pm.ShortcutManagerCompat.ShortcutMatchFlags int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+  @IntDef(flag=true, value={androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_MANIFEST, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_DYNAMIC, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_PINNED, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_CACHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ShortcutManagerCompat.ShortcutMatchFlags {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class ShortcutXmlParser {
+    method @WorkerThread public static java.util.List<java.lang.String!> getShortcutIds(android.content.Context);
+    method @VisibleForTesting public static java.util.List<java.lang.String!> parseShortcutIds(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.core.content.res {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ColorStateListInflaterCompat {
+    method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList? inflate(android.content.res.Resources, @XmlRes int, android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ComplexColorCompat {
+    method @ColorInt public int getColor();
+    method public android.graphics.Shader? getShader();
+    method public static androidx.core.content.res.ComplexColorCompat? inflate(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?);
+    method public boolean isGradient();
+    method public boolean isStateful();
+    method public boolean onStateChanged(int[]!);
+    method public void setColor(@ColorInt int);
+    method public boolean willDraw();
+  }
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FontResourcesParserCompat {
+    method public static androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry? parse(org.xmlpull.v1.XmlPullParser!, android.content.res.Resources!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static java.util.List<java.util.List<byte[]!>!>! readCerts(android.content.res.Resources!, @ArrayRes int);
+    field public static final int FETCH_STRATEGY_ASYNC = 1; // 0x1
+    field public static final int FETCH_STRATEGY_BLOCKING = 0; // 0x0
+    field public static final int INFINITE_TIMEOUT_VALUE = -1; // 0xffffffff
+  }
+
+  public static interface FontResourcesParserCompat.FamilyResourceEntry {
+  }
+
+  @IntDef({androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING, androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_ASYNC}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontResourcesParserCompat.FetchStrategy {
+  }
+
+  public static final class FontResourcesParserCompat.FontFamilyFilesResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.FontFamilyFilesResourceEntry(androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![]);
+    method public androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![] getEntries();
+  }
+
+  public static final class FontResourcesParserCompat.FontFileResourceEntry {
+    ctor public FontResourcesParserCompat.FontFileResourceEntry(String, int, boolean, String?, int, int);
+    method public String getFileName();
+    method public int getResourceId();
+    method public int getTtcIndex();
+    method public String? getVariationSettings();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static final class FontResourcesParserCompat.ProviderResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.ProviderResourceEntry(androidx.core.provider.FontRequest, @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy int, int);
+    method @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy public int getFetchStrategy();
+    method public androidx.core.provider.FontRequest getRequest();
+    method public int getTimeout();
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFont(android.content.Context, @FontRes int, android.util.TypedValue!, int, androidx.core.content.res.ResourcesCompat.FontCallback?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackFailAsync(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int, android.os.Handler?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackSuccessAsync(android.graphics.Typeface!, android.os.Handler?);
+    method public abstract void onFontRetrievalFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypedArrayUtils {
+    method public static int getAttr(android.content.Context, int, int);
+    method public static boolean getBoolean(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, boolean);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static int getInt(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, int);
+    method public static boolean getNamedBoolean(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, boolean);
+    method @ColorInt public static int getNamedColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @ColorInt int);
+    method public static android.content.res.ColorStateList? getNamedColorStateList(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int);
+    method public static androidx.core.content.res.ComplexColorCompat! getNamedComplexColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int, @ColorInt int);
+    method public static float getNamedFloat(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, float);
+    method public static int getNamedInt(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, int);
+    method @AnyRes public static int getNamedResourceId(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @AnyRes int);
+    method public static String? getNamedString(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int);
+    method @AnyRes public static int getResourceId(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, @AnyRes int);
+    method public static String? getString(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence? getText(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence![]? getTextArray(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static boolean hasAttribute(org.xmlpull.v1.XmlPullParser, String);
+    method public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources.Theme?, android.util.AttributeSet, int[]);
+    method public static android.util.TypedValue? peekNamedValue(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, int);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static void clearCache();
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromFontInfo(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFamilyXml(android.content.Context, androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry, android.content.res.Resources, int, int, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFontFile(android.content.Context, android.content.res.Resources, int, String!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? findFromCache(android.content.res.Resources, int, int);
+  }
+
+  @RequiresApi(26) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi26Impl();
+    method protected android.graphics.Typeface? createFromFamiliesWithDefault(Object!);
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected java.lang.reflect.Method! obtainAbortCreationMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromAssetManagerMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromBufferMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainCreateFromFamiliesWithDefaultMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected Class<?>! obtainFontFamily() throws java.lang.ClassNotFoundException;
+    method protected java.lang.reflect.Constructor<?>! obtainFontFamilyCtor(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainFreezeMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    field protected final java.lang.reflect.Method! mAbortCreation;
+    field protected final java.lang.reflect.Method! mAddFontFromAssetManager;
+    field protected final java.lang.reflect.Method! mAddFontFromBuffer;
+    field protected final java.lang.reflect.Method! mCreateFromFamiliesWithDefault;
+    field protected final Class<?>! mFontFamily;
+    field protected final java.lang.reflect.Constructor<?>! mFontFamilyCtor;
+    field protected final java.lang.reflect.Method! mFreeze;
+  }
+
+  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi28Impl extends androidx.core.graphics.TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi28Impl();
+  }
+
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TypefaceCompatApi29Impl {
+    ctor public TypefaceCompatApi29Impl();
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method protected android.graphics.Typeface! createFromInputStream(android.content.Context!, java.io.InputStream!);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected androidx.core.provider.FontsContractCompat.FontInfo! findBestInfo(androidx.core.provider.FontsContractCompat.FontInfo![]!, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
+    method public static void closeQuietly(java.io.Closeable!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
+    method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
+    method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
+    method public static java.io.File? getTempFile(android.content.Context!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addToShortcutIntent(android.content.Intent, android.graphics.drawable.Drawable?, android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void checkResource(android.content.Context);
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.ParcelField(value=1, defaultValue="androidx.core.graphics.drawable.IconCompat.TYPE_UNKNOWN") public int mType;
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintAwareDrawable {
+    method public void setTint(@ColorInt int);
+    method public void setTintList(android.content.res.ColorStateList!);
+    method public void setTintMode(android.graphics.PorterDuff.Mode!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WrappedDrawable {
+    method public android.graphics.drawable.Drawable! getWrappedDrawable();
+    method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.internal.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenu extends android.view.Menu {
+    method public void setGroupDividerEnabled(boolean);
+    field public static final int CATEGORY_MASK = -65536; // 0xffff0000
+    field public static final int CATEGORY_SHIFT = 16; // 0x10
+    field public static final int FLAG_KEEP_OPEN_ON_SUBMENU_OPENED = 4; // 0x4
+    field public static final int SUPPORTED_MODIFIERS_MASK = 69647; // 0x1100f
+    field public static final int USER_MASK = 65535; // 0xffff
+    field public static final int USER_SHIFT = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenuItem extends android.view.MenuItem {
+    method public int getAlphabeticModifiers();
+    method public CharSequence! getContentDescription();
+    method public android.content.res.ColorStateList! getIconTintList();
+    method public android.graphics.PorterDuff.Mode! getIconTintMode();
+    method public int getNumericModifiers();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTooltipText();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setAlphabeticShortcut(char, int);
+    method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setIconTintList(android.content.res.ColorStateList!);
+    method public android.view.MenuItem! setIconTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.view.MenuItem! setNumericShortcut(char, int);
+    method public android.view.MenuItem! setShortcut(char, char, int, int);
+    method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportSubMenu extends androidx.core.internal.view.SupportMenu android.view.SubMenu {
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method @androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  @IntDef({androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConnectivityManagerCompat.RestrictBackgroundStatus {
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! getIdentifier();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFontSync(android.content.Context!, androidx.core.provider.FontRequest!, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean, int, int);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static android.content.pm.ProviderInfo? getProvider(android.content.pm.PackageManager, androidx.core.provider.FontRequest, android.content.res.Resources?) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static java.util.Map<android.net.Uri!,java.nio.ByteBuffer!>! prepareFontData(android.content.Context!, androidx.core.provider.FontsContractCompat.FontInfo![]!, android.os.CancellationSignal!);
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void resetCache();
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String PARCEL_FONT_RESULTS = "font_results";
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontFamilyResult(int, androidx.core.provider.FontsContractCompat.FontInfo![]?);
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontInfo(android.net.Uri, @IntRange(from=0) int, @IntRange(from=1, to=1000) int, boolean, int);
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int RESULT_OK = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, androidx.core.provider.FontsContractCompat.FontRequestCallback.RESULT_OK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontsContractCompat.FontRequestCallback.FontRequestFailReason {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SelfDestructiveThread {
+    ctor @Deprecated public SelfDestructiveThread(String!, int, int);
+    method @Deprecated @VisibleForTesting public int getGeneration();
+    method @Deprecated @VisibleForTesting public boolean isRunning();
+    method @Deprecated public <T> void postAndReply(java.util.concurrent.Callable<T!>!, androidx.core.provider.SelfDestructiveThread.ReplyCallback<T!>!);
+    method @Deprecated public <T> T! postAndWait(java.util.concurrent.Callable<T!>!, int) throws java.lang.InterruptedException;
+  }
+
+  @Deprecated public static interface SelfDestructiveThread.ReplyCallback<T> {
+    method @Deprecated public void onReply(T!);
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.text.PrecomputedText? getPrecomputedText();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean equalsWithoutTextDirection(androidx.core.text.PrecomputedTextCompat.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static boolean addLinks(android.widget.TextView, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+  @IntDef(flag=true, value={android.text.util.Linkify.WEB_URLS, android.text.util.Linkify.EMAIL_ADDRESSES, android.text.util.Linkify.PHONE_NUMBERS, android.text.util.Linkify.MAP_ADDRESSES, android.text.util.Linkify.ALL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinkifyCompat.LinkifyMask {
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DebugUtils {
+    method public static void buildShortClassTag(Object!, StringBuilder!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LogWriter extends java.io.Writer {
+    ctor @Deprecated public LogWriter(String!);
+    method @Deprecated public void close();
+    method @Deprecated public void flush();
+    method @Deprecated public void write(char[]!, int, int);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_EMAIL_ADDRESS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_WEB_URL;
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Preconditions {
+    method public static void checkArgument(boolean);
+    method public static void checkArgument(boolean, Object);
+    method public static void checkArgument(boolean, String, java.lang.Object!...);
+    method public static int checkArgumentInRange(int, int, int, String);
+    method public static long checkArgumentInRange(long, long, long, String);
+    method public static float checkArgumentInRange(float, float, float, String);
+    method public static double checkArgumentInRange(double, double, double, String);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int, String?);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int);
+    method public static int checkFlagsArgument(int, int);
+    method public static <T> T checkNotNull(T?);
+    method public static <T> T checkNotNull(T?, Object);
+    method public static void checkState(boolean, String?);
+    method public static void checkState(boolean);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, Object);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, String, java.lang.Object!...);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TimeUtils {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, StringBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, long, java.io.PrintWriter!);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int HUNDRED_DAY_FIELD_LEN = 19; // 0x13
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityDelegateCompat(android.view.View.AccessibilityDelegate!);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void reset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSubUiVisibilityListener(androidx.core.view.ActionProvider.SubUiVisibilityListener!);
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void subUiVisibilityChanged(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionProvider.SubUiVisibilityListener {
+    method public void onSubUiVisibilityChanged(boolean);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method @androidx.core.view.ContentInfoCompat.Flags public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method @androidx.core.view.ContentInfoCompat.Source public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, @androidx.core.view.ContentInfoCompat.Source int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(@androidx.core.view.ContentInfoCompat.Flags int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(@androidx.core.view.ContentInfoCompat.Source int);
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Flags {
+  }
+
+  @IntDef({androidx.core.view.ContentInfoCompat.SOURCE_APP, androidx.core.view.ContentInfoCompat.SOURCE_CLIPBOARD, androidx.core.view.ContentInfoCompat.SOURCE_INPUT_METHOD, androidx.core.view.ContentInfoCompat.SOURCE_DRAG_AND_DROP, androidx.core.view.ContentInfoCompat.SOURCE_AUTOFILL, androidx.core.view.ContentInfoCompat.SOURCE_PROCESS_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Source {
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.view.DragAndDropPermissionsCompat? request(android.app.Activity!, android.view.DragEvent!);
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class KeyEventDispatcher {
+    method public static boolean dispatchBeforeHierarchy(android.view.View, android.view.KeyEvent);
+    method public static boolean dispatchKeyEvent(androidx.core.view.KeyEventDispatcher.Component, android.view.View?, android.view.Window.Callback?, android.view.KeyEvent);
+  }
+
+  public static interface KeyEventDispatcher.Component {
+    method public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent {
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public Object! getPointerIcon();
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, @androidx.core.view.ViewCompat.FocusDirection int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN, android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRealDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRelativeDirection {
+  }
+
+  @IntDef({androidx.core.view.ViewCompat.TYPE_TOUCH, androidx.core.view.ViewCompat.TYPE_NON_TOUCH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.NestedScrollType {
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  @IntDef(value={androidx.core.view.ViewCompat.SCROLL_AXIS_NONE, androidx.core.view.ViewCompat.SCROLL_AXIS_HORIZONTAL, androidx.core.view.ViewCompat.SCROLL_AXIS_VERTICAL}, flag=true) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollAxis {
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ViewCompat.SCROLL_INDICATOR_TOP, androidx.core.view.ViewCompat.SCROLL_INDICATOR_BOTTOM, androidx.core.view.ViewCompat.SCROLL_INDICATOR_LEFT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_RIGHT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_START, androidx.core.view.ViewCompat.SCROLL_INDICATOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollIndicators {
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(@androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode int);
+    method @androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP, androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsAnimationCompat.Callback.DispatchMode {
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int captionBar();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int displayCutout();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int ime();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int mandatorySystemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int navigationBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int statusBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int tappableElement();
+  }
+
+  @IntDef(flag=true, value={0x1, 0x2, 0x4, 0x8, 0x100, 0x10, 0x20, 0x40, 0x80}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsCompat.Type.InsetsType {
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityClickableSpanCompat(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!, int);
+    method public void onClick(android.view.View);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AccessibilityEventCompat.ContentChangeType {
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addSpansToExtras(CharSequence!, android.view.View!);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.text.style.ClickableSpan![]! getClickableSpans(CharSequence!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mParentVirtualDescendantId;
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! createReplacementAction(CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean perform(android.view.View!, android.os.Bundle!);
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected final androidx.core.view.accessibility.AccessibilityViewCommand! mCommand;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setBundle(android.os.Bundle!);
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AutoSizeableTextView {
+    method public int getAutoSizeMaxTextSize();
+    method public int getAutoSizeMinTextSize();
+    method public int getAutoSizeStepGranularity();
+    method public int[]! getAutoSizeTextAvailableSizes();
+    method @androidx.core.widget.TextViewCompat.AutoSizeTextType public int getAutoSizeTextType();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeWithDefaults(@androidx.core.widget.TextViewCompat.AutoSizeTextType int);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final boolean PLATFORM_SUPPORTS_AUTOSIZE;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? unwrapCustomSelectionActionModeCallback(android.view.ActionMode.Callback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback?);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  @IntDef({androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE, androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TextViewCompat.AutoSizeTextType {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TextViewOnReceiveContentListener implements androidx.core.view.OnReceiveContentListener {
+    ctor public TextViewOnReceiveContentListener();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableCheckedTextView {
+    method public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+    method public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableImageSourceView {
+    method public android.content.res.ColorStateList? getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/restricted_1.7.0-beta02.txt b/core/core/api/restricted_1.7.0-beta02.txt
new file mode 100644
index 0000000..c28a0bf
--- /dev/null
+++ b/core/core/api/restricted_1.7.0-beta02.txt
@@ -0,0 +1,4192 @@
+// Signature format: 4.0
+package android.support.v4.os {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ResultReceiver implements android.os.Parcelable {
+    ctor public ResultReceiver(android.os.Handler!);
+    method public int describeContents();
+    method protected void onReceiveResult(int, android.os.Bundle!);
+    method public void send(int, android.os.Bundle!);
+    method public void writeToParcel(android.os.Parcel!, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.os.ResultReceiver!>! CREATOR;
+  }
+
+}
+
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.ActivityCompat.PermissionCompatDelegate! getPermissionCompatDelegate();
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static boolean isLaunchedFromBubble(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActivityCompat.RequestPermissionsRequestCodeValidator {
+    method public void validateRequestPermissionsRequestCode(int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ComponentActivity extends android.app.Activity implements androidx.core.view.KeyEventDispatcher.Component androidx.lifecycle.LifecycleOwner {
+    ctor public ComponentActivity();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T extends androidx.core.app.ComponentActivity.ExtraData> T! getExtraData(Class<T!>!);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void putExtraData(androidx.core.app.ComponentActivity.ExtraData!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ComponentActivity.ExtraData {
+    ctor @Deprecated public ComponentActivity.ExtraData();
+  }
+
+  @RequiresApi(api=28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CoreComponentFactory extends android.app.AppComponentFactory {
+    ctor public CoreComponentFactory();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface CoreComponentFactory.CompatWrapped {
+    method public Object! getWrapper();
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(@androidx.core.app.FrameMetricsAggregator.MetricType int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.FrameMetricsAggregator.TOTAL_DURATION, androidx.core.app.FrameMetricsAggregator.INPUT_DURATION, androidx.core.app.FrameMetricsAggregator.LAYOUT_MEASURE_DURATION, androidx.core.app.FrameMetricsAggregator.DRAW_DURATION, androidx.core.app.FrameMetricsAggregator.SYNC_DURATION, androidx.core.app.FrameMetricsAggregator.COMMAND_DURATION, androidx.core.app.FrameMetricsAggregator.SWAP_DURATION, androidx.core.app.FrameMetricsAggregator.DELAY_DURATION, androidx.core.app.FrameMetricsAggregator.ANIMATION_DURATION, androidx.core.app.FrameMetricsAggregator.EVERY_DURATION}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FrameMetricsAggregator.MetricType {
+  }
+
+  @Deprecated public abstract class JobIntentService extends android.app.Service {
+    ctor @Deprecated public JobIntentService();
+    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method @Deprecated public boolean isStopped();
+    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+    method @Deprecated public boolean onStopCurrentWork();
+    method @Deprecated public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NotificationBuilderWithBuilderAccessor {
+    method public android.app.Notification.Builder! getBuilder();
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.GroupAlertBehavior public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Action.Builder fromAndroidAction(android.app.Notification.Action);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.BADGE_ICON_NONE, androidx.core.app.NotificationCompat.BADGE_ICON_SMALL, androidx.core.app.NotificationCompat.BADGE_ICON_LARGE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.BadgeIconType {
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFlags(int);
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getBigContentView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata();
+    method @ColorInt @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getColor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getContentView();
+    method public android.os.Bundle getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getForegroundServiceBehavior();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getHeadsUpContentView();
+    method @Deprecated public android.app.Notification getNotification();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getPriority();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public long getWhenIfShowing();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(@androidx.core.app.NotificationCompat.BadgeIconType int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(@androidx.core.app.NotificationCompat.ServiceNotificationBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(@androidx.core.app.NotificationCompat.GroupAlertBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, @androidx.core.app.NotificationCompat.StreamType int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(@androidx.core.app.NotificationCompat.NotificationVisibility int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!>! mActions;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.Context! mContext;
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.Person!> mPersonList;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.GROUP_ALERT_ALL, androidx.core.app.NotificationCompat.GROUP_ALERT_SUMMARY, androidx.core.app.NotificationCompat.GROUP_ALERT_CHILDREN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.GroupAlertBehavior {
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC, androidx.core.app.NotificationCompat.VISIBILITY_PRIVATE, androidx.core.app.NotificationCompat.VISIBILITY_SECRET}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.NotificationVisibility {
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFAULT, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFERRED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.ServiceNotificationBehavior {
+  }
+
+  @IntDef({android.media.AudioManager.STREAM_VOICE_CALL, android.media.AudioManager.STREAM_SYSTEM, android.media.AudioManager.STREAM_RING, android.media.AudioManager.STREAM_MUSIC, android.media.AudioManager.STREAM_ALARM, android.media.AudioManager.STREAM_NOTIFICATION, android.media.AudioManager.STREAM_DTMF, android.media.AudioManager.STREAM_ACCESSIBILITY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.StreamType {
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addCompatExtras(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void apply(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews applyStandardTemplate(boolean, int, boolean);
+    method public android.app.Notification? build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void buildIntoRemoteViews(android.widget.RemoteViews!, android.widget.RemoteViews!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void clearCompatExtraKeys(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap! createColoredBitmap(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean displayCustomViewInline();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Style? extractStyleFromNotification(android.app.Notification);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected String? getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeBigContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeHeadsUpContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void restoreFromCompatExtras(android.os.Bundle);
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected androidx.core.app.NotificationCompat.Builder! mBuilder;
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromAndroidPerson(android.app.Person);
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromPersistableBundle(android.os.PersistableBundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String resolveToLegacyUri();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.app.Person toAndroidPerson();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.PersistableBundle toPersistableBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(jetifyAs="android.support.v4.app.RemoteActionCompat") public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public RemoteActionCompat();
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(4) public android.app.PendingIntent! mActionIntent;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(3) public CharSequence! mContentDescription;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(5) public boolean mEnabled;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(1) public androidx.core.graphics.drawable.IconCompat! mIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(6) public boolean mShouldShowIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(2) public CharSequence! mTitle;
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method @androidx.core.app.RemoteInput.EditChoicesBeforeSending public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method @androidx.core.app.RemoteInput.Source public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, @androidx.core.app.RemoteInput.Source int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(@androidx.core.app.RemoteInput.EditChoicesBeforeSending int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.EditChoicesBeforeSending {
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.SOURCE_FREE_FORM_INPUT, androidx.core.app.RemoteInput.SOURCE_CHOICE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.Source {
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, @androidx.core.app.ServiceCompat.StopForegroundFlags int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE, androidx.core.app.ServiceCompat.STOP_FOREGROUND_DETACH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ServiceCompat.StopForegroundFlags {
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PackageManagerCompat {
+    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+  }
+
+  public final class PermissionChecker {
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingPermission(android.content.Context, String, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkPermission(android.content.Context, String, int, int, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.content.PermissionChecker.PERMISSION_GRANTED, androidx.core.content.PermissionChecker.PERMISSION_DENIED, androidx.core.content.PermissionChecker.PERMISSION_DENIED_APP_OP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PermissionChecker.PermissionResult {
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+  public class UnusedAppRestrictionsBackportCallback {
+    method public void onResult(boolean, boolean) throws android.os.RemoteException;
+  }
+
+  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+    ctor public UnusedAppRestrictionsBackportService();
+    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+    method public android.os.IBinder? onBind(android.content.Intent?);
+    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+  }
+
+  public final class UnusedAppRestrictionsConstants {
+    field public static final int API_30 = 4; // 0x4
+    field public static final int API_30_BACKPORT = 3; // 0x3
+    field public static final int API_31 = 5; // 0x5
+    field public static final int DISABLED = 2; // 0x2
+    field public static final int ERROR = 0; // 0x0
+    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoChangeListener {
+    ctor public ShortcutInfoChangeListener();
+    method @AnyThread public void onAllShortcutsRemoved();
+    method @AnyThread public void onShortcutAdded(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutRemoved(java.util.List<java.lang.String!>);
+    method @AnyThread public void onShortcutUpdated(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutUsageReported(java.util.List<java.lang.String!>);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.graphics.drawable.IconCompat! getIcon();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(androidx.core.content.pm.ShortcutInfoCompat);
+    ctor @RequiresApi(25) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(android.content.Context, android.content.pm.ShortcutInfo);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoCompatSaver<T> {
+    ctor public ShortcutInfoCompatSaver();
+    method @AnyThread public abstract T! addShortcuts(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>!);
+    method @WorkerThread public java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>! getShortcuts() throws java.lang.Exception;
+    method @AnyThread public abstract T! removeAllShortcuts();
+    method @AnyThread public abstract T! removeShortcuts(java.util.List<java.lang.String!>!);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, @androidx.core.content.pm.ShortcutManagerCompat.ShortcutMatchFlags int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+  @IntDef(flag=true, value={androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_MANIFEST, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_DYNAMIC, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_PINNED, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_CACHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ShortcutManagerCompat.ShortcutMatchFlags {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class ShortcutXmlParser {
+    method @WorkerThread public static java.util.List<java.lang.String!> getShortcutIds(android.content.Context);
+    method @VisibleForTesting public static java.util.List<java.lang.String!> parseShortcutIds(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.core.content.res {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ColorStateListInflaterCompat {
+    method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList? inflate(android.content.res.Resources, @XmlRes int, android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ComplexColorCompat {
+    method @ColorInt public int getColor();
+    method public android.graphics.Shader? getShader();
+    method public static androidx.core.content.res.ComplexColorCompat? inflate(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?);
+    method public boolean isGradient();
+    method public boolean isStateful();
+    method public boolean onStateChanged(int[]!);
+    method public void setColor(@ColorInt int);
+    method public boolean willDraw();
+  }
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FontResourcesParserCompat {
+    method public static androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry? parse(org.xmlpull.v1.XmlPullParser!, android.content.res.Resources!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static java.util.List<java.util.List<byte[]!>!>! readCerts(android.content.res.Resources!, @ArrayRes int);
+    field public static final int FETCH_STRATEGY_ASYNC = 1; // 0x1
+    field public static final int FETCH_STRATEGY_BLOCKING = 0; // 0x0
+    field public static final int INFINITE_TIMEOUT_VALUE = -1; // 0xffffffff
+  }
+
+  public static interface FontResourcesParserCompat.FamilyResourceEntry {
+  }
+
+  @IntDef({androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING, androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_ASYNC}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontResourcesParserCompat.FetchStrategy {
+  }
+
+  public static final class FontResourcesParserCompat.FontFamilyFilesResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.FontFamilyFilesResourceEntry(androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![]);
+    method public androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![] getEntries();
+  }
+
+  public static final class FontResourcesParserCompat.FontFileResourceEntry {
+    ctor public FontResourcesParserCompat.FontFileResourceEntry(String, int, boolean, String?, int, int);
+    method public String getFileName();
+    method public int getResourceId();
+    method public int getTtcIndex();
+    method public String? getVariationSettings();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static final class FontResourcesParserCompat.ProviderResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.ProviderResourceEntry(androidx.core.provider.FontRequest, @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy int, int);
+    method @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy public int getFetchStrategy();
+    method public androidx.core.provider.FontRequest getRequest();
+    method public int getTimeout();
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFont(android.content.Context, @FontRes int, android.util.TypedValue!, int, androidx.core.content.res.ResourcesCompat.FontCallback?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackFailAsync(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int, android.os.Handler?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackSuccessAsync(android.graphics.Typeface!, android.os.Handler?);
+    method public abstract void onFontRetrievalFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypedArrayUtils {
+    method public static int getAttr(android.content.Context, int, int);
+    method public static boolean getBoolean(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, boolean);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static int getInt(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, int);
+    method public static boolean getNamedBoolean(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, boolean);
+    method @ColorInt public static int getNamedColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @ColorInt int);
+    method public static android.content.res.ColorStateList? getNamedColorStateList(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int);
+    method public static androidx.core.content.res.ComplexColorCompat! getNamedComplexColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int, @ColorInt int);
+    method public static float getNamedFloat(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, float);
+    method public static int getNamedInt(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, int);
+    method @AnyRes public static int getNamedResourceId(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @AnyRes int);
+    method public static String? getNamedString(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int);
+    method @AnyRes public static int getResourceId(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, @AnyRes int);
+    method public static String? getString(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence? getText(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence![]? getTextArray(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static boolean hasAttribute(org.xmlpull.v1.XmlPullParser, String);
+    method public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources.Theme?, android.util.AttributeSet, int[]);
+    method public static android.util.TypedValue? peekNamedValue(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, int);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static void clearCache();
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromFontInfo(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFamilyXml(android.content.Context, androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry, android.content.res.Resources, int, int, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFontFile(android.content.Context, android.content.res.Resources, int, String!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? findFromCache(android.content.res.Resources, int, int);
+  }
+
+  @RequiresApi(26) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi26Impl();
+    method protected android.graphics.Typeface? createFromFamiliesWithDefault(Object!);
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected java.lang.reflect.Method! obtainAbortCreationMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromAssetManagerMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromBufferMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainCreateFromFamiliesWithDefaultMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected Class<?>! obtainFontFamily() throws java.lang.ClassNotFoundException;
+    method protected java.lang.reflect.Constructor<?>! obtainFontFamilyCtor(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainFreezeMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    field protected final java.lang.reflect.Method! mAbortCreation;
+    field protected final java.lang.reflect.Method! mAddFontFromAssetManager;
+    field protected final java.lang.reflect.Method! mAddFontFromBuffer;
+    field protected final java.lang.reflect.Method! mCreateFromFamiliesWithDefault;
+    field protected final Class<?>! mFontFamily;
+    field protected final java.lang.reflect.Constructor<?>! mFontFamilyCtor;
+    field protected final java.lang.reflect.Method! mFreeze;
+  }
+
+  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi28Impl extends androidx.core.graphics.TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi28Impl();
+  }
+
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TypefaceCompatApi29Impl {
+    ctor public TypefaceCompatApi29Impl();
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method protected android.graphics.Typeface! createFromInputStream(android.content.Context!, java.io.InputStream!);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected androidx.core.provider.FontsContractCompat.FontInfo! findBestInfo(androidx.core.provider.FontsContractCompat.FontInfo![]!, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
+    method public static void closeQuietly(java.io.Closeable!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
+    method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
+    method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
+    method public static java.io.File? getTempFile(android.content.Context!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addToShortcutIntent(android.content.Intent, android.graphics.drawable.Drawable?, android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void checkResource(android.content.Context);
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.ParcelField(value=1, defaultValue="androidx.core.graphics.drawable.IconCompat.TYPE_UNKNOWN") public int mType;
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintAwareDrawable {
+    method public void setTint(@ColorInt int);
+    method public void setTintList(android.content.res.ColorStateList!);
+    method public void setTintMode(android.graphics.PorterDuff.Mode!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WrappedDrawable {
+    method public android.graphics.drawable.Drawable! getWrappedDrawable();
+    method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.internal.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenu extends android.view.Menu {
+    method public void setGroupDividerEnabled(boolean);
+    field public static final int CATEGORY_MASK = -65536; // 0xffff0000
+    field public static final int CATEGORY_SHIFT = 16; // 0x10
+    field public static final int FLAG_KEEP_OPEN_ON_SUBMENU_OPENED = 4; // 0x4
+    field public static final int SUPPORTED_MODIFIERS_MASK = 69647; // 0x1100f
+    field public static final int USER_MASK = 65535; // 0xffff
+    field public static final int USER_SHIFT = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenuItem extends android.view.MenuItem {
+    method public int getAlphabeticModifiers();
+    method public CharSequence! getContentDescription();
+    method public android.content.res.ColorStateList! getIconTintList();
+    method public android.graphics.PorterDuff.Mode! getIconTintMode();
+    method public int getNumericModifiers();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTooltipText();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setAlphabeticShortcut(char, int);
+    method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setIconTintList(android.content.res.ColorStateList!);
+    method public android.view.MenuItem! setIconTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.view.MenuItem! setNumericShortcut(char, int);
+    method public android.view.MenuItem! setShortcut(char, char, int, int);
+    method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportSubMenu extends androidx.core.internal.view.SupportMenu android.view.SubMenu {
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static float getBearingAccuracyDegrees(android.location.Location);
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+    method public static float getVerticalAccuracyMeters(android.location.Location);
+    method public static boolean hasBearingAccuracy(android.location.Location);
+    method public static boolean hasSpeedAccuracy(android.location.Location);
+    method public static boolean hasVerticalAccuracy(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setBearingAccuracyDegrees(android.location.Location, float);
+    method public static void setMock(android.location.Location, boolean);
+    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+    method public static void setVerticalAccuracyMeters(android.location.Location, float);
+    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+    field public static final String EXTRA_IS_MOCK = "mockLocation";
+    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+  }
+
+  public interface LocationListenerCompat extends android.location.LocationListener {
+    method public default void onStatusChanged(String, int, android.os.Bundle?);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean hasProvider(android.location.LocationManager, String);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+  public final class LocationRequestCompat {
+    method @IntRange(from=1) public long getDurationMillis();
+    method @IntRange(from=0) public long getIntervalMillis();
+    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+    method public int getQuality();
+    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+    field public static final int QUALITY_LOW_POWER = 104; // 0x68
+  }
+
+  public static final class LocationRequestCompat.Builder {
+    ctor public LocationRequestCompat.Builder(long);
+    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+    method public androidx.core.location.LocationRequestCompat build();
+    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static int addExact(int, int);
+    method public static long addExact(long, long);
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+    method public static int decrementExact(int);
+    method public static long decrementExact(long);
+    method public static int incrementExact(int);
+    method public static long incrementExact(long);
+    method public static int multiplyExact(int, int);
+    method public static long multiplyExact(long, long);
+    method public static int negateExact(int);
+    method public static long negateExact(long);
+    method public static int subtractExact(int, int);
+    method public static long subtractExact(long, long);
+    method public static int toIntExact(long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method @androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  @IntDef({androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConnectivityManagerCompat.RestrictBackgroundStatus {
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class DocumentsContractCompat {
+    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildDocumentUri(String, String);
+    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+    method public static android.net.Uri? buildTreeDocumentUri(String, String);
+    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+    method public static String? getDocumentId(android.net.Uri);
+    method public static String? getTreeDocumentId(android.net.Uri);
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+    method public static boolean isTreeUri(android.net.Uri);
+    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+  }
+
+  public static final class DocumentsContractCompat.DocumentCompat {
+    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+  }
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! getIdentifier();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFontSync(android.content.Context!, androidx.core.provider.FontRequest!, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean, int, int);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static android.content.pm.ProviderInfo? getProvider(android.content.pm.PackageManager, androidx.core.provider.FontRequest, android.content.res.Resources?) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static java.util.Map<android.net.Uri!,java.nio.ByteBuffer!>! prepareFontData(android.content.Context!, androidx.core.provider.FontsContractCompat.FontInfo![]!, android.os.CancellationSignal!);
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void resetCache();
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String PARCEL_FONT_RESULTS = "font_results";
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontFamilyResult(int, androidx.core.provider.FontsContractCompat.FontInfo![]?);
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontInfo(android.net.Uri, @IntRange(from=0) int, @IntRange(from=1, to=1000) int, boolean, int);
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int RESULT_OK = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, androidx.core.provider.FontsContractCompat.FontRequestCallback.RESULT_OK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontsContractCompat.FontRequestCallback.FontRequestFailReason {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SelfDestructiveThread {
+    ctor @Deprecated public SelfDestructiveThread(String!, int, int);
+    method @Deprecated @VisibleForTesting public int getGeneration();
+    method @Deprecated @VisibleForTesting public boolean isRunning();
+    method @Deprecated public <T> void postAndReply(java.util.concurrent.Callable<T!>!, androidx.core.provider.SelfDestructiveThread.ReplyCallback<T!>!);
+    method @Deprecated public <T> T! postAndWait(java.util.concurrent.Callable<T!>!, int) throws java.lang.InterruptedException;
+  }
+
+  @Deprecated public static interface SelfDestructiveThread.ReplyCallback<T> {
+    method @Deprecated public void onReply(T!);
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.text.PrecomputedText? getPrecomputedText();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean equalsWithoutTextDirection(androidx.core.text.PrecomputedTextCompat.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static boolean addLinks(android.widget.TextView, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+  @IntDef(flag=true, value={android.text.util.Linkify.WEB_URLS, android.text.util.Linkify.EMAIL_ADDRESSES, android.text.util.Linkify.PHONE_NUMBERS, android.text.util.Linkify.MAP_ADDRESSES, android.text.util.Linkify.ALL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinkifyCompat.LinkifyMask {
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DebugUtils {
+    method public static void buildShortClassTag(Object!, StringBuilder!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LogWriter extends java.io.Writer {
+    ctor @Deprecated public LogWriter(String!);
+    method @Deprecated public void close();
+    method @Deprecated public void flush();
+    method @Deprecated public void write(char[]!, int, int);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_EMAIL_ADDRESS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_WEB_URL;
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Preconditions {
+    method public static void checkArgument(boolean);
+    method public static void checkArgument(boolean, Object);
+    method public static void checkArgument(boolean, String, java.lang.Object!...);
+    method public static int checkArgumentInRange(int, int, int, String);
+    method public static long checkArgumentInRange(long, long, long, String);
+    method public static float checkArgumentInRange(float, float, float, String);
+    method public static double checkArgumentInRange(double, double, double, String);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int, String?);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int);
+    method public static int checkFlagsArgument(int, int);
+    method public static <T> T checkNotNull(T?);
+    method public static <T> T checkNotNull(T?, Object);
+    method public static void checkState(boolean, String?);
+    method public static void checkState(boolean);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, Object);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, String, java.lang.Object!...);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TimeUtils {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, StringBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, long, java.io.PrintWriter!);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int HUNDRED_DAY_FIELD_LEN = 19; // 0x13
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityDelegateCompat(android.view.View.AccessibilityDelegate!);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void reset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSubUiVisibilityListener(androidx.core.view.ActionProvider.SubUiVisibilityListener!);
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void subUiVisibilityChanged(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionProvider.SubUiVisibilityListener {
+    method public void onSubUiVisibilityChanged(boolean);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method @androidx.core.view.ContentInfoCompat.Flags public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method @androidx.core.view.ContentInfoCompat.Source public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_AUTOFILL = 4; // 0x4
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, @androidx.core.view.ContentInfoCompat.Source int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(@androidx.core.view.ContentInfoCompat.Flags int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(@androidx.core.view.ContentInfoCompat.Source int);
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Flags {
+  }
+
+  @IntDef({androidx.core.view.ContentInfoCompat.SOURCE_APP, androidx.core.view.ContentInfoCompat.SOURCE_CLIPBOARD, androidx.core.view.ContentInfoCompat.SOURCE_INPUT_METHOD, androidx.core.view.ContentInfoCompat.SOURCE_DRAG_AND_DROP, androidx.core.view.ContentInfoCompat.SOURCE_AUTOFILL, androidx.core.view.ContentInfoCompat.SOURCE_PROCESS_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Source {
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.view.DragAndDropPermissionsCompat? request(android.app.Activity!, android.view.DragEvent!);
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class KeyEventDispatcher {
+    method public static boolean dispatchBeforeHierarchy(android.view.View, android.view.KeyEvent);
+    method public static boolean dispatchKeyEvent(androidx.core.view.KeyEventDispatcher.Component, android.view.View?, android.view.Window.Callback?, android.view.KeyEvent);
+  }
+
+  public static interface KeyEventDispatcher.Component {
+    method public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public interface MenuHost {
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void invalidateMenu();
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public class MenuHostHelper {
+    ctor public MenuHostHelper(Runnable);
+    method public void addMenuProvider(androidx.core.view.MenuProvider);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+    method public void removeMenuProvider(androidx.core.view.MenuProvider);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public interface MenuProvider {
+    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+    method public boolean onMenuItemSelected(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent {
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public Object! getPointerIcon();
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, @androidx.core.view.ViewCompat.FocusDirection int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String?);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN, android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRealDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRelativeDirection {
+  }
+
+  @IntDef({androidx.core.view.ViewCompat.TYPE_TOUCH, androidx.core.view.ViewCompat.TYPE_NON_TOUCH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.NestedScrollType {
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+  }
+
+  @IntDef(value={androidx.core.view.ViewCompat.SCROLL_AXIS_NONE, androidx.core.view.ViewCompat.SCROLL_AXIS_HORIZONTAL, androidx.core.view.ViewCompat.SCROLL_AXIS_VERTICAL}, flag=true) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollAxis {
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ViewCompat.SCROLL_INDICATOR_TOP, androidx.core.view.ViewCompat.SCROLL_INDICATOR_BOTTOM, androidx.core.view.ViewCompat.SCROLL_INDICATOR_LEFT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_RIGHT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_START, androidx.core.view.ViewCompat.SCROLL_INDICATOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollIndicators {
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(@androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode int);
+    method @androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP, androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsAnimationCompat.Callback.DispatchMode {
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int captionBar();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int displayCutout();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int ime();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int mandatorySystemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int navigationBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int statusBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int tappableElement();
+  }
+
+  @IntDef(flag=true, value={0x1, 0x2, 0x4, 0x8, 0x100, 0x10, 0x20, 0x40, 0x80}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsCompat.Type.InsetsType {
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityClickableSpanCompat(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!, int);
+    method public void onClick(android.view.View);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AccessibilityEventCompat.ContentChangeType {
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addSpansToExtras(CharSequence!, android.view.View!);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.text.style.ClickableSpan![]! getClickableSpans(CharSequence!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mParentVirtualDescendantId;
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! createReplacementAction(CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean perform(android.view.View!, android.os.Bundle!);
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected final androidx.core.view.accessibility.AccessibilityViewCommand! mCommand;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setBundle(android.os.Bundle!);
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AutoSizeableTextView {
+    method public int getAutoSizeMaxTextSize();
+    method public int getAutoSizeMinTextSize();
+    method public int getAutoSizeStepGranularity();
+    method public int[]! getAutoSizeTextAvailableSizes();
+    method @androidx.core.widget.TextViewCompat.AutoSizeTextType public int getAutoSizeTextType();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeWithDefaults(@androidx.core.widget.TextViewCompat.AutoSizeTextType int);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final boolean PLATFORM_SUPPORTS_AUTOSIZE;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method public static float getDistance(android.widget.EdgeEffect);
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? unwrapCustomSelectionActionModeCallback(android.view.ActionMode.Callback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback?);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  @IntDef({androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE, androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TextViewCompat.AutoSizeTextType {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TextViewOnReceiveContentListener implements androidx.core.view.OnReceiveContentListener {
+    ctor public TextViewOnReceiveContentListener();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableCheckedTextView {
+    method public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+    method public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableImageSourceView {
+    method public android.content.res.ColorStateList? getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/development/check_os_prebuilts.py b/development/check_os_prebuilts.py
index 9b21fa0..b93f6d2 100755
--- a/development/check_os_prebuilts.py
+++ b/development/check_os_prebuilts.py
@@ -29,13 +29,20 @@
   os_specific_files = {}
 
   for filename in sys.argv[1:]:
-    if "osx" in filename or "linux" in filename:
-      stripped_filename = filename.replace("osx", "").replace("linux", "")
-      if stripped_filename in os_specific_files.keys():
-        # Corresponding linux/osx pair, so no need to track
-        os_specific_files.pop(stripped_filename)
-      else:
-        os_specific_files[stripped_filename] = filename
+
+    # This technique makes sure that platform-specific files come in pairs.  Those will usually
+    # be either osx/linux or macos/linux.  Technically, if a osx/macos pair came through, we would
+    # let it through, but that seems unlikely
+
+    for platform in ["macos", "osx", "linux"]:
+      if platform in filename:
+        stripped_filename = filename.replace(platform, "")
+        if stripped_filename in os_specific_files.keys():
+          # Corresponding platform pair, so no need to track
+          os_specific_files.pop(stripped_filename)
+        else:
+          os_specific_files[stripped_filename] = filename
+        break # don't get hung up if file contains "macosx"
 
   # No matching files
   if not os_specific_files:
@@ -45,7 +52,8 @@
   for filename in os_specific_files.values():
     print(filename)
   print ("""\033[0m\nPlease make sure to import the corresponding prebuilts for missing platforms.
-If you imported a prebuilt similar to foo:bar:linux, try foo:bar:osx and vice versa.
+If you imported a prebuilt similar to foo:bar:linux, try foo:bar:osx (or foo:bar:macos),
+and vice versa.
 If there is no corresponding prebuilt, or only adding a prebuilt for one platform is intended, run:
 \033[92mrepo upload --no-verify\033[0m
 to skip this warning.""")
diff --git a/development/importMaven/build.gradle.kts b/development/importMaven/build.gradle.kts
index 63b7fea..8dd0eaa 100644
--- a/development/importMaven/build.gradle.kts
+++ b/development/importMaven/build.gradle.kts
@@ -469,6 +469,7 @@
                     addFile("${id.name}-${id.version}.aar")
                     addFile("${id.name}-${id.version}-sources.jar")
                     addFile("${id.name}-${id.version}.klib")
+                    addFile("${id.name}-${id.version}-cinterop-interop.klib")
                 }
             }
         }
diff --git a/development/referenceDocs/stageReferenceDocsWithDackka.sh b/development/referenceDocs/stageReferenceDocsWithDackka.sh
index 24447c6..3ebf783 100755
--- a/development/referenceDocs/stageReferenceDocsWithDackka.sh
+++ b/development/referenceDocs/stageReferenceDocsWithDackka.sh
@@ -1,6 +1,31 @@
 #!/bin/bash
 #
-# Script to fetch generated API references docs from the Android build server and stage them.
+# Script to fetch generated API references docs and stage them.
+#
+# Examples:
+#
+# Stage refdocs from a given build ID (to the default staging DB):
+#
+#   ./stageReferenceDocsWithDackka.sh --buildId 1234567
+#
+# Stage locally-generated refdocs (to the default staging DB) *:
+#
+#   /stageReferenceDocsWithDackka.sh --buildId 0
+#   --sourceDir=/dir/to/androidx-main/out/androidx/docs-public/build
+#
+# Stage ToT refdocs from a given build ID, to a specified DB, using a specific
+# date string for the generated CL:
+#
+#   ./stageReferenceDocsWithDackka.sh --buildId 1234567 --db androidx-docs
+#   --dateStr "April 29, 2021" --useToT
+#
+# ===
+#
+# * buildId still needs to be specified when staging locally-generated refdocs,
+#   but the value is unused and ignored.
+#
+# ===
+#
 
 source gbash.sh || exit
 
@@ -24,17 +49,21 @@
 # This list should match, or be a subset of, the list of libraries defined in
 # https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt;l=568
 readonly javaLibraryDirs=(
+  "activity"
 #  "benchmark"
 #  "collection"
+  "fragment"
   "navigation"
   "paging"
   "wear"
   "window"
 )
 readonly kotlinLibraryDirs=(
+  "activity"
 #  "benchmark"
   "compose"
 #  "collection"
+  "fragment"
   "navigation"
   "paging"
   "wear"
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index c2f2d3f..d89e785 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -17,9 +17,7 @@
     docs("androidx.appsearch:appsearch:1.0.0-alpha03")
     docs("androidx.appsearch:appsearch-ktx:1.0.0-alpha03")
     docs("androidx.appsearch:appsearch-local-storage:1.0.0-alpha03")
-    // b/193914745 - Re-enable appsearch-platform-storage when androidx-main
-    // compiles against API level 31.
-    // docs("androidx.appsearch:appsearch-platform-storage:1.0.0-alpha03")
+    docs("androidx.appsearch:appsearch-platform-storage:1.0.0-alpha03")
     docs("androidx.arch.core:core-common:2.1.0")
     docs("androidx.arch.core:core-runtime:2.1.0")
     docs("androidx.arch.core:core-testing:2.1.0")
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index ef97193..6b4c9ac 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -179,6 +179,7 @@
     docs(project(":media2:media2-widget"))
     docs(project(":media:media"))
     docs(project(":mediarouter:mediarouter"))
+    docs(project(":mediarouter:mediarouter-testing"))
     docs(project(":navigation:navigation-common"))
     docs(project(":navigation:navigation-common-ktx"))
     docs(project(":navigation:navigation-compose"))
diff --git a/emoji2/emoji2-bundled/api/1.0.0-beta01.txt b/emoji2/emoji2-bundled/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/1.0.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/1.0.0-beta02.txt b/emoji2/emoji2-bundled/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/1.0.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/public_plus_experimental_1.0.0-beta01.txt b/emoji2/emoji2-bundled/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/public_plus_experimental_1.0.0-beta02.txt b/emoji2/emoji2-bundled/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/res-1.0.0-beta01.txt b/emoji2/emoji2-bundled/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/res-1.0.0-beta01.txt
diff --git a/emoji2/emoji2-bundled/api/res-1.0.0-beta02.txt b/emoji2/emoji2-bundled/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/res-1.0.0-beta02.txt
diff --git a/emoji2/emoji2-bundled/api/restricted_1.0.0-beta01.txt b/emoji2/emoji2-bundled/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/restricted_1.0.0-beta02.txt b/emoji2/emoji2-bundled/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/1.0.0-beta01.txt b/emoji2/emoji2-views-helper/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/1.0.0-beta01.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/1.0.0-beta02.txt b/emoji2/emoji2-views-helper/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/1.0.0-beta02.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/public_plus_experimental_1.0.0-beta01.txt b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/public_plus_experimental_1.0.0-beta02.txt b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/res-1.0.0-beta01.txt b/emoji2/emoji2-views-helper/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/res-1.0.0-beta01.txt
diff --git a/emoji2/emoji2-views-helper/api/res-1.0.0-beta02.txt b/emoji2/emoji2-views-helper/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/res-1.0.0-beta02.txt
diff --git a/emoji2/emoji2-views-helper/api/restricted_1.0.0-beta01.txt b/emoji2/emoji2-views-helper/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/restricted_1.0.0-beta02.txt b/emoji2/emoji2-views-helper/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/1.0.0-beta01.txt b/emoji2/emoji2-views/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/1.0.0-beta01.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/1.0.0-beta02.txt b/emoji2/emoji2-views/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/1.0.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/public_plus_experimental_1.0.0-beta01.txt b/emoji2/emoji2-views/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/public_plus_experimental_1.0.0-beta02.txt b/emoji2/emoji2-views/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/res-1.0.0-beta01.txt b/emoji2/emoji2-views/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..8bc8423
--- /dev/null
+++ b/emoji2/emoji2-views/api/res-1.0.0-beta01.txt
@@ -0,0 +1,2 @@
+attr emojiReplaceStrategy
+attr maxEmojiCount
diff --git a/emoji2/emoji2-views/api/res-1.0.0-beta02.txt b/emoji2/emoji2-views/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..8bc8423
--- /dev/null
+++ b/emoji2/emoji2-views/api/res-1.0.0-beta02.txt
@@ -0,0 +1,2 @@
+attr emojiReplaceStrategy
+attr maxEmojiCount
diff --git a/emoji2/emoji2-views/api/restricted_1.0.0-beta01.txt b/emoji2/emoji2-views/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..b77930a
--- /dev/null
+++ b/emoji2/emoji2-views/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(@androidx.emoji2.text.EmojiCompat.ReplaceStrategy int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/restricted_1.0.0-beta02.txt b/emoji2/emoji2-views/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..b77930a
--- /dev/null
+++ b/emoji2/emoji2-views/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(@androidx.emoji2.text.EmojiCompat.ReplaceStrategy int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/1.0.0-beta01.txt b/emoji2/emoji2/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..4a94c8e
--- /dev/null
+++ b/emoji2/emoji2/api/1.0.0-beta01.txt
@@ -0,0 +1,108 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/1.0.0-beta02.txt b/emoji2/emoji2/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..4a94c8e
--- /dev/null
+++ b/emoji2/emoji2/api/1.0.0-beta02.txt
@@ -0,0 +1,108 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/public_plus_experimental_1.0.0-beta01.txt b/emoji2/emoji2/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..4a94c8e
--- /dev/null
+++ b/emoji2/emoji2/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1,108 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/public_plus_experimental_1.0.0-beta02.txt b/emoji2/emoji2/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..4a94c8e
--- /dev/null
+++ b/emoji2/emoji2/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,108 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/res-1.0.0-beta01.txt b/emoji2/emoji2/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2/api/res-1.0.0-beta01.txt
diff --git a/emoji2/emoji2/api/res-1.0.0-beta02.txt b/emoji2/emoji2/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2/api/res-1.0.0-beta02.txt
diff --git a/emoji2/emoji2/api/restricted_1.0.0-beta01.txt b/emoji2/emoji2/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..4a94c8e
--- /dev/null
+++ b/emoji2/emoji2/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,108 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/restricted_1.0.0-beta02.txt b/emoji2/emoji2/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..4a94c8e
--- /dev/null
+++ b/emoji2/emoji2/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,108 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/build.gradle b/emoji2/emoji2/build.gradle
index ba1453675..d6bacab 100644
--- a/emoji2/emoji2/build.gradle
+++ b/emoji2/emoji2/build.gradle
@@ -26,7 +26,7 @@
     api("androidx.startup:startup-runtime:1.0.0")
     implementation("androidx.collection:collection:1.1.0")
     implementation("androidx.annotation:annotation:1.2.0")
-    implementation 'androidx.lifecycle:lifecycle-process:2.4.0-alpha02'
+    implementation(project(":lifecycle:lifecycle-process"))
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java
index 86654fc..c3c8b7c 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java
@@ -25,10 +25,9 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.WorkerThread;
 import androidx.core.os.TraceCompat;
+import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.OnLifecycleEvent;
 import androidx.lifecycle.ProcessLifecycleInitializer;
 import androidx.startup.AppInitializer;
 import androidx.startup.Initializer;
@@ -105,9 +104,9 @@
         LifecycleOwner lifecycleOwner = appInitializer
                 .initializeComponent(ProcessLifecycleInitializer.class);
         Lifecycle lifecycle = lifecycleOwner.getLifecycle();
-        lifecycle.addObserver(new LifecycleObserver() {
-            @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
-            public void onResume() {
+        lifecycle.addObserver(new DefaultLifecycleObserver() {
+            @Override
+            public void onResume(@NonNull LifecycleOwner owner) {
                 loadEmojiCompatAfterDelay();
                 lifecycle.removeObserver(this);
             }
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index fbeb1874..d8d30ad 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -197,7 +197,6 @@
     ctor public FragmentContainerView(android.content.Context context, android.util.AttributeSet? attrs, optional int defStyleAttr);
     ctor public FragmentContainerView(android.content.Context context, android.util.AttributeSet? attrs);
     method public <F extends androidx.fragment.app.Fragment> F! getFragment();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void removeDetachedView(android.view.View child, boolean animate);
   }
 
   public class FragmentController {
@@ -461,15 +460,19 @@
 
   public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
     method public String getPreviousFragmentId();
+    property public final String previousFragmentId;
   }
 
   public final class FragmentStrictMode {
-    method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
-    method public static void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
+    method @VisibleForTesting public void onPolicyViolation(androidx.fragment.app.strictmode.Violation violation);
+    method public void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy defaultPolicy);
+    property public final androidx.fragment.app.strictmode.FragmentStrictMode.Policy defaultPolicy;
+    field public static final androidx.fragment.app.strictmode.FragmentStrictMode INSTANCE;
   }
 
-  public static interface FragmentStrictMode.OnViolationListener {
-    method public void onViolation(androidx.fragment.app.strictmode.Violation);
+  public static fun interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.Violation violation);
   }
 
   public static final class FragmentStrictMode.Policy {
@@ -478,7 +481,7 @@
 
   public static final class FragmentStrictMode.Policy.Builder {
     ctor public FragmentStrictMode.Policy.Builder();
-    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder allowViolation(Class<? extends androidx.fragment.app.Fragment>, Class<? extends androidx.fragment.app.strictmode.Violation>);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder allowViolation(Class<? extends androidx.fragment.app.Fragment> fragmentClass, Class<? extends androidx.fragment.app.strictmode.Violation> violationClass);
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy build();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentReuse();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentTagUsage();
@@ -487,12 +490,13 @@
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectTargetFragmentUsage();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectWrongFragmentContainer();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyDeath();
-    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyListener(androidx.fragment.app.strictmode.FragmentStrictMode.OnViolationListener);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyListener(androidx.fragment.app.strictmode.FragmentStrictMode.OnViolationListener listener);
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyLog();
   }
 
   public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
     method public android.view.ViewGroup? getParentContainer();
+    property public final android.view.ViewGroup? parentContainer;
   }
 
   public final class GetRetainInstanceUsageViolation extends androidx.fragment.app.strictmode.RetainInstanceUsageViolation {
@@ -513,21 +517,26 @@
   public final class SetTargetFragmentUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
     method public int getRequestCode();
     method public androidx.fragment.app.Fragment getTargetFragment();
+    property public final int requestCode;
+    property public final androidx.fragment.app.Fragment targetFragment;
   }
 
   public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
     method public boolean isVisibleToUser();
+    property public final boolean isVisibleToUser;
   }
 
   public abstract class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
   }
 
   public abstract class Violation extends java.lang.RuntimeException {
-    method public androidx.fragment.app.Fragment getFragment();
+    method public final androidx.fragment.app.Fragment getFragment();
+    property public final androidx.fragment.app.Fragment fragment;
   }
 
   public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
     method public android.view.ViewGroup getContainer();
+    property public final android.view.ViewGroup container;
   }
 
 }
diff --git a/fragment/fragment/api/public_plus_experimental_current.txt b/fragment/fragment/api/public_plus_experimental_current.txt
index fbeb1874..d8d30ad 100644
--- a/fragment/fragment/api/public_plus_experimental_current.txt
+++ b/fragment/fragment/api/public_plus_experimental_current.txt
@@ -197,7 +197,6 @@
     ctor public FragmentContainerView(android.content.Context context, android.util.AttributeSet? attrs, optional int defStyleAttr);
     ctor public FragmentContainerView(android.content.Context context, android.util.AttributeSet? attrs);
     method public <F extends androidx.fragment.app.Fragment> F! getFragment();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void removeDetachedView(android.view.View child, boolean animate);
   }
 
   public class FragmentController {
@@ -461,15 +460,19 @@
 
   public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
     method public String getPreviousFragmentId();
+    property public final String previousFragmentId;
   }
 
   public final class FragmentStrictMode {
-    method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
-    method public static void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
+    method @VisibleForTesting public void onPolicyViolation(androidx.fragment.app.strictmode.Violation violation);
+    method public void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy defaultPolicy);
+    property public final androidx.fragment.app.strictmode.FragmentStrictMode.Policy defaultPolicy;
+    field public static final androidx.fragment.app.strictmode.FragmentStrictMode INSTANCE;
   }
 
-  public static interface FragmentStrictMode.OnViolationListener {
-    method public void onViolation(androidx.fragment.app.strictmode.Violation);
+  public static fun interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.Violation violation);
   }
 
   public static final class FragmentStrictMode.Policy {
@@ -478,7 +481,7 @@
 
   public static final class FragmentStrictMode.Policy.Builder {
     ctor public FragmentStrictMode.Policy.Builder();
-    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder allowViolation(Class<? extends androidx.fragment.app.Fragment>, Class<? extends androidx.fragment.app.strictmode.Violation>);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder allowViolation(Class<? extends androidx.fragment.app.Fragment> fragmentClass, Class<? extends androidx.fragment.app.strictmode.Violation> violationClass);
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy build();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentReuse();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentTagUsage();
@@ -487,12 +490,13 @@
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectTargetFragmentUsage();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectWrongFragmentContainer();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyDeath();
-    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyListener(androidx.fragment.app.strictmode.FragmentStrictMode.OnViolationListener);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyListener(androidx.fragment.app.strictmode.FragmentStrictMode.OnViolationListener listener);
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyLog();
   }
 
   public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
     method public android.view.ViewGroup? getParentContainer();
+    property public final android.view.ViewGroup? parentContainer;
   }
 
   public final class GetRetainInstanceUsageViolation extends androidx.fragment.app.strictmode.RetainInstanceUsageViolation {
@@ -513,21 +517,26 @@
   public final class SetTargetFragmentUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
     method public int getRequestCode();
     method public androidx.fragment.app.Fragment getTargetFragment();
+    property public final int requestCode;
+    property public final androidx.fragment.app.Fragment targetFragment;
   }
 
   public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
     method public boolean isVisibleToUser();
+    property public final boolean isVisibleToUser;
   }
 
   public abstract class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
   }
 
   public abstract class Violation extends java.lang.RuntimeException {
-    method public androidx.fragment.app.Fragment getFragment();
+    method public final androidx.fragment.app.Fragment getFragment();
+    property public final androidx.fragment.app.Fragment fragment;
   }
 
   public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
     method public android.view.ViewGroup getContainer();
+    property public final android.view.ViewGroup container;
   }
 
 }
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 35e9eae..06de951 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -202,7 +202,6 @@
     ctor public FragmentContainerView(android.content.Context context, android.util.AttributeSet? attrs, optional int defStyleAttr);
     ctor public FragmentContainerView(android.content.Context context, android.util.AttributeSet? attrs);
     method public <F extends androidx.fragment.app.Fragment> F! getFragment();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void removeDetachedView(android.view.View child, boolean animate);
   }
 
   public class FragmentController {
@@ -491,15 +490,19 @@
 
   public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
     method public String getPreviousFragmentId();
+    property public final String previousFragmentId;
   }
 
   public final class FragmentStrictMode {
-    method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
-    method public static void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
+    method @VisibleForTesting public void onPolicyViolation(androidx.fragment.app.strictmode.Violation violation);
+    method public void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy defaultPolicy);
+    property public final androidx.fragment.app.strictmode.FragmentStrictMode.Policy defaultPolicy;
+    field public static final androidx.fragment.app.strictmode.FragmentStrictMode INSTANCE;
   }
 
-  public static interface FragmentStrictMode.OnViolationListener {
-    method public void onViolation(androidx.fragment.app.strictmode.Violation);
+  public static fun interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.Violation violation);
   }
 
   public static final class FragmentStrictMode.Policy {
@@ -508,7 +511,7 @@
 
   public static final class FragmentStrictMode.Policy.Builder {
     ctor public FragmentStrictMode.Policy.Builder();
-    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder allowViolation(Class<? extends androidx.fragment.app.Fragment>, Class<? extends androidx.fragment.app.strictmode.Violation>);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder allowViolation(Class<? extends androidx.fragment.app.Fragment> fragmentClass, Class<? extends androidx.fragment.app.strictmode.Violation> violationClass);
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy build();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentReuse();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentTagUsage();
@@ -517,12 +520,13 @@
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectTargetFragmentUsage();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectWrongFragmentContainer();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyDeath();
-    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyListener(androidx.fragment.app.strictmode.FragmentStrictMode.OnViolationListener);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyListener(androidx.fragment.app.strictmode.FragmentStrictMode.OnViolationListener listener);
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyLog();
   }
 
   public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
     method public android.view.ViewGroup? getParentContainer();
+    property public final android.view.ViewGroup? parentContainer;
   }
 
   public final class GetRetainInstanceUsageViolation extends androidx.fragment.app.strictmode.RetainInstanceUsageViolation {
@@ -543,21 +547,26 @@
   public final class SetTargetFragmentUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
     method public int getRequestCode();
     method public androidx.fragment.app.Fragment getTargetFragment();
+    property public final int requestCode;
+    property public final androidx.fragment.app.Fragment targetFragment;
   }
 
   public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
     method public boolean isVisibleToUser();
+    property public final boolean isVisibleToUser;
   }
 
   public abstract class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
   }
 
   public abstract class Violation extends java.lang.RuntimeException {
-    method public androidx.fragment.app.Fragment getFragment();
+    method public final androidx.fragment.app.Fragment getFragment();
+    property public final androidx.fragment.app.Fragment fragment;
   }
 
   public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
     method public android.view.ViewGroup getContainer();
+    property public final android.view.ViewGroup container;
   }
 
 }
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt
index f715cdd..b72c35e 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt
@@ -362,20 +362,6 @@
         assertThat(view.childCount).isEqualTo(0)
     }
 
-    // removeDetachedView should not actually remove the view
-    @Test
-    fun removeDetachedView() {
-        val childView1 = FragmentContainerView(context)
-        val childView2 = FragmentContainerView(context)
-
-        val view = setupRemoveTestsView(childView1, childView2)
-
-        view.removeDetachedView(childView1, false)
-
-        assertThat(view.childCount).isEqualTo(2)
-        assertThat(view.getChildAt(1)).isEqualTo(childView2)
-    }
-
     private fun setupRemoveTestsView(
         childView1: View,
         childView2: View
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
index 6b60563..7519ff1 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
@@ -42,12 +42,12 @@
 
     @Before
     public fun setup() {
-        originalPolicy = FragmentStrictMode.getDefaultPolicy()
+        originalPolicy = FragmentStrictMode.defaultPolicy
     }
 
     @After
     public fun teardown() {
-        FragmentStrictMode.setDefaultPolicy(originalPolicy)
+        FragmentStrictMode.defaultPolicy = originalPolicy
     }
 
     @Test
@@ -55,7 +55,7 @@
         val policy = FragmentStrictMode.Policy.Builder()
             .penaltyDeath()
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         var violation: Violation? = null
         try {
@@ -92,7 +92,7 @@
 
             val violation = object : Violation(childFragment) {}
 
-            FragmentStrictMode.setDefaultPolicy(policy("Default policy"))
+            FragmentStrictMode.defaultPolicy = policy("Default policy")
             FragmentStrictMode.onPolicyViolation(violation)
             InstrumentationRegistry.getInstrumentation().waitForIdleSync()
             assertThat(lastTriggeredPolicy).isEqualTo("Default policy")
@@ -116,7 +116,7 @@
         val policy = FragmentStrictMode.Policy.Builder()
             .penaltyListener { thread = Thread.currentThread() }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
             val fragmentManager = withActivity { supportFragmentManager }
@@ -140,7 +140,7 @@
             .detectFragmentReuse()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
             val fragmentManager = withActivity { supportFragmentManager }
@@ -176,7 +176,7 @@
             .detectFragmentReuse()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
             val fragmentManager = withActivity { supportFragmentManager }
@@ -213,17 +213,21 @@
             .detectFragmentTagUsage()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
             withActivity { setContentView(R.layout.activity_inflated_fragment) }
             val fragment = withActivity {
                 supportFragmentManager.findFragmentById(R.id.inflated_fragment)!!
             }
-            val container = withActivity { findViewById(R.id.inflated_layout) }
+            // TODO: Since we now create the message when we construct the violation instead of
+            //  dynamically, the container instance here has not yet been inflated and causes
+            //  this test to fail cause the one in the violation is inflated so the view bounds
+            //  in the toString() are different.
+//            val container = withActivity { findViewById(R.id.inflated_layout) }
             assertThat(violation).isInstanceOf(FragmentTagUsageViolation::class.java)
             assertThat(violation).hasMessageThat().contains(
-                "Attempting to use <fragment> tag to add fragment $fragment to container $container"
+                "Attempting to use <fragment> tag to add fragment $fragment to container "
             )
         }
     }
@@ -236,7 +240,7 @@
             .detectRetainInstanceUsage()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         val fragment = StrictFragment()
         fragment.retainInstance = true
@@ -261,7 +265,7 @@
             .detectSetUserVisibleHint()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         val fragment = StrictFragment()
         fragment.userVisibleHint = true
@@ -279,7 +283,7 @@
             .detectTargetFragmentUsage()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         val fragment = StrictFragment()
         val targetFragment = StrictFragment()
@@ -313,7 +317,7 @@
             .detectWrongFragmentContainer()
             .penaltyListener { violation = it }
             .build()
-        FragmentStrictMode.setDefaultPolicy(policy)
+        FragmentStrictMode.defaultPolicy = policy
 
         with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
             val fragmentManager = withActivity { supportFragmentManager }
@@ -361,7 +365,7 @@
         for (violationClass in violationClassList) {
             policyBuilder = policyBuilder.allowViolation(fragmentClass, violationClass)
         }
-        FragmentStrictMode.setDefaultPolicy(policyBuilder.build())
+        FragmentStrictMode.defaultPolicy = policyBuilder.build()
 
         StrictFragment().retainInstance = true
         assertThat(violation).isNotInstanceOf(violationClass1)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index f621dec..84350e4 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -1399,7 +1399,12 @@
      *                    between 0 and 65535 to be considered valid. If given requestCode is
      *                    greater than 65535, an IllegalArgumentException would be thrown.
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * fragment. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartActivityForResult} object for the {@link ActivityResultContract}.
      */
@@ -1422,7 +1427,12 @@
      * @param options Additional options for how the Activity should be started. See
      * {@link Context#startActivity(Intent, Bundle)} for more details. This value may be null.
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * fragment. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartActivityForResult} object for the {@link ActivityResultContract}.
      */
@@ -1455,7 +1465,12 @@
      * @param options Additional options for how the Activity should be started. See
      * {@link Context#startActivity(Intent, Bundle)} for more details. This value may be null.
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * fragment. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * passing in a {@link StartIntentSenderForResult} object for the
      * {@link ActivityResultContract}.
@@ -1490,7 +1505,12 @@
      * @param data An Intent, which can return result data to the caller
      *               (various data can be attached to Intent "extras").
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * fragment. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)}
      * with the appropriate {@link ActivityResultContract} and handling the result in the
      * {@link ActivityResultCallback#onActivityResult(Object) callback}.
@@ -1560,7 +1580,12 @@
      *
      * @see #onRequestPermissionsResult(int, String[], int[])
      * @see android.content.Context#checkSelfPermission(String)
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * fragment. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)} passing
      * in a {@link RequestMultiplePermissions} object for the {@link ActivityResultContract} and
      * handling the result in the {@link ActivityResultCallback#onActivityResult(Object) callback}.
@@ -1590,7 +1615,12 @@
      *
      * @see #requestPermissions(String[], int)
      *
-     * @deprecated use
+     * @deprecated This method has been deprecated in favor of using the Activity Result API
+     * which brings increased type safety via an {@link ActivityResultContract} and the prebuilt
+     * contracts for common intents available in
+     * {@link androidx.activity.result.contract.ActivityResultContracts}, provides hooks for
+     * testing, and allow receiving results in separate, testable classes independent from your
+     * fragment. Use
      * {@link #registerForActivityResult(ActivityResultContract, ActivityResultCallback)} passing
      * in a {@link RequestMultiplePermissions} object for the {@link ActivityResultContract} and
      * handling the result in the {@link ActivityResultCallback#onActivityResult(Object) callback}.
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.kt b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.kt
index b8ac2dd..2b4f0a1 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.kt
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.kt
@@ -26,7 +26,6 @@
 import android.view.ViewGroup
 import android.view.WindowInsets
 import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
 import androidx.core.content.withStyledAttributes
 import androidx.core.view.ViewCompat
 import androidx.core.view.WindowInsetsCompat
@@ -313,14 +312,6 @@
         super.removeAllViewsInLayout()
     }
 
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public override fun removeDetachedView(child: View, animate: Boolean) {
-        if (animate) {
-            addDisappearingFragmentView(child)
-        }
-        super.removeDetachedView(child, animate)
-    }
-
     /**
      * This method adds a [View] to the list of disappearing views only if it meets the proper
      * conditions to be considered a disappearing view.
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
deleted file mode 100644
index bd8d249..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectFragmentReuse()}. */
-public final class FragmentReuseViolation extends Violation {
-
-    @NonNull
-    private final String mPreviousWho;
-
-    FragmentReuseViolation(@NonNull Fragment fragment, @NonNull String previousWho) {
-        super(fragment);
-        this.mPreviousWho = previousWho;
-    }
-
-    /**
-     * Gets the unique ID of the previous instance of the {@link Fragment} causing the Violation.
-     */
-    @NonNull
-    public String getPreviousFragmentId() {
-        return mPreviousWho;
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to reuse fragment " + mFragment + " with previous ID " + mPreviousWho;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.kt b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.kt
new file mode 100644
index 0000000..6c229ef
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 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.fragment.app.strictmode
+
+import androidx.fragment.app.Fragment
+
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectFragmentReuse].
+ */
+class FragmentReuseViolation internal constructor(
+    fragment: Fragment,
+    /**
+     * Gets the unique ID of the previous instance of the [Fragment] causing the Violation.
+     */
+    val previousFragmentId: String
+) : Violation(
+    fragment,
+    "Attempting to reuse fragment $fragment with previous ID $previousFragmentId"
+)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
deleted file mode 100644
index ac43754..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import android.annotation.SuppressLint;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.Log;
-import android.view.ViewGroup;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentContainerView;
-import androidx.fragment.app.FragmentManager;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * FragmentStrictMode is a tool which detects things you might be doing by accident and brings
- * them to your attention so you can fix them. Basically, it's a version of
- * {@link android.os.StrictMode} specifically for fragment-related issues.
- *
- * <p>You can decide what should happen when a violation is detected. For example, using {@link
- * Policy.Builder#penaltyLog} you can watch the output of <code>adb logcat</code> while you
- * use your application to see the violations as they happen.
- */
-@SuppressLint("SyntheticAccessor")
-public final class FragmentStrictMode {
-    private static final String TAG = "FragmentStrictMode";
-    private static Policy defaultPolicy = Policy.LAX;
-
-    private enum Flag {
-        PENALTY_LOG,
-        PENALTY_DEATH,
-
-        DETECT_FRAGMENT_REUSE,
-        DETECT_FRAGMENT_TAG_USAGE,
-        DETECT_RETAIN_INSTANCE_USAGE,
-        DETECT_SET_USER_VISIBLE_HINT,
-        DETECT_TARGET_FRAGMENT_USAGE,
-        DETECT_WRONG_FRAGMENT_CONTAINER,
-    }
-
-    private FragmentStrictMode() {}
-
-    /**
-     * When #{@link Policy.Builder#penaltyListener} is enabled, the listener is called when a
-     * violation occurs.
-     */
-    public interface OnViolationListener {
-
-        /** Called on a policy violation. */
-        void onViolation(@NonNull Violation violation);
-    }
-
-    /**
-     * {@link FragmentStrictMode} policy applied to a certain {@link FragmentManager} (or globally).
-     *
-     * <p>This policy can either be enabled globally using {@link #setDefaultPolicy} or for a
-     * specific {@link FragmentManager} using {@link FragmentManager#setStrictModePolicy(Policy)}.
-     * The current policy can be retrieved using {@link #getDefaultPolicy} and
-     * {@link FragmentManager#getStrictModePolicy} respectively.
-     *
-     * <p>Note that multiple penalties may be provided and they're run in order from least to most
-     * severe (logging before process death, for example). There's currently no mechanism to choose
-     * different penalties for different detected actions.
-     */
-    public static final class Policy {
-        private final Set<Flag> mFlags;
-        private final OnViolationListener mListener;
-        private final Map<Class<? extends Fragment>,
-                Set<Class<? extends Violation>>> mAllowedViolations;
-
-        /** The default, lax policy which doesn't catch anything. */
-        @NonNull
-        public static final Policy LAX = new Policy(new HashSet<>(), null, new HashMap<>());
-
-        private Policy(
-                @NonNull Set<Flag> flags,
-                @Nullable OnViolationListener listener,
-                @NonNull Map<Class<? extends Fragment>,
-                        Set<Class<? extends Violation>>> allowedViolations) {
-            this.mFlags = new HashSet<>(flags);
-            this.mListener = listener;
-
-            Map<Class<? extends Fragment>, Set<Class<? extends Violation>>>
-                    newAllowedViolationsMap = new HashMap<>();
-            for (Map.Entry<Class<? extends Fragment>,
-                    Set<Class<? extends Violation>>> entry : allowedViolations.entrySet()) {
-                newAllowedViolationsMap.put(entry.getKey(), new HashSet<>(entry.getValue()));
-            }
-            this.mAllowedViolations = newAllowedViolationsMap;
-        }
-
-        /**
-         * Creates {@link Policy} instances. Methods whose names start with {@code detect} specify
-         * what problems we should look for. Methods whose names start with {@code penalty} specify
-         * what we should do when we detect a problem.
-         *
-         * <p>You can call as many {@code detect} and {@code penalty} methods as you like. Currently
-         * order is insignificant: all penalties apply to all detected problems.
-         */
-        public static final class Builder {
-            private final Set<Flag> mFlags;
-            private OnViolationListener mListener;
-            private final Map<Class<? extends Fragment>,
-                    Set<Class<? extends Violation>>> mAllowedViolations;
-
-            /** Create a Builder that detects nothing and has no violations. */
-            public Builder() {
-                mFlags = new HashSet<>();
-                mAllowedViolations = new HashMap<>();
-            }
-
-            /** Log detected violations to the system log. */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder penaltyLog() {
-                mFlags.add(Flag.PENALTY_LOG);
-                return this;
-            }
-
-            /**
-             * Throws an exception on violation. This penalty runs at the end of all enabled
-             * penalties so you'll still get to see logging or other violations before the exception
-             * is thrown.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder penaltyDeath() {
-                mFlags.add(Flag.PENALTY_DEATH);
-                return this;
-            }
-
-            /**
-             * Call #{@link OnViolationListener#onViolation} for every violation. The listener will
-             * be called on the main thread of the fragment host.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder penaltyListener(@NonNull OnViolationListener listener) {
-                this.mListener = listener;
-                return this;
-            }
-
-            /**
-             * Detects cases, where a #{@link Fragment} instance is reused, after it was previously
-             * removed from a #{@link FragmentManager}.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder detectFragmentReuse() {
-                mFlags.add(Flag.DETECT_FRAGMENT_REUSE);
-                return this;
-            }
-
-            /** Detects usage of the &lt;fragment&gt; tag inside XML layouts. */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder detectFragmentTagUsage() {
-                mFlags.add(Flag.DETECT_FRAGMENT_TAG_USAGE);
-                return this;
-            }
-
-            /**
-             * Detects calls to #{@link Fragment#setRetainInstance} and
-             * #{@link Fragment#getRetainInstance()}.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder detectRetainInstanceUsage() {
-                mFlags.add(Flag.DETECT_RETAIN_INSTANCE_USAGE);
-                return this;
-            }
-
-            /** Detects calls to #{@link Fragment#setUserVisibleHint}. */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder detectSetUserVisibleHint() {
-                mFlags.add(Flag.DETECT_SET_USER_VISIBLE_HINT);
-                return this;
-            }
-
-            /**
-             * Detects calls to #{@link Fragment#setTargetFragment},
-             * #{@link Fragment#getTargetFragment()} and #{@link Fragment#getTargetRequestCode()}.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder detectTargetFragmentUsage() {
-                mFlags.add(Flag.DETECT_TARGET_FRAGMENT_USAGE);
-                return this;
-            }
-
-            /**
-             * Detects cases where a #{@link Fragment} is added to a container other than a
-             * #{@link FragmentContainerView}.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder detectWrongFragmentContainer() {
-                mFlags.add(Flag.DETECT_WRONG_FRAGMENT_CONTAINER);
-                return this;
-            }
-
-            /**
-             * Allow the specified {@link Fragment} class to bypass penalties for the
-             * specified {@link Violation}, if detected.
-             *
-             * By default, all {@link Fragment} classes will incur penalties for any
-             * detected {@link Violation}.
-             */
-            @NonNull
-            @SuppressLint("BuilderSetStyle")
-            public Builder allowViolation(
-                    @NonNull Class<? extends Fragment> fragmentClass,
-                    @NonNull Class<? extends Violation> violationClass) {
-                Set<Class<? extends Violation>> violationsToBypass =
-                        mAllowedViolations.get(fragmentClass);
-                if (violationsToBypass == null) {
-                    violationsToBypass = new HashSet<>();
-                }
-                violationsToBypass.add(violationClass);
-                mAllowedViolations.put(fragmentClass, violationsToBypass);
-                return this;
-            }
-
-            /**
-             * Construct the Policy instance.
-             *
-             * <p>Note: if no penalties are enabled before calling <code>build</code>, {@link
-             * #penaltyLog} is implicitly set.
-             */
-            @NonNull
-            public Policy build() {
-                if (mListener == null && !mFlags.contains(Flag.PENALTY_DEATH)) {
-                    penaltyLog();
-                }
-                return new Policy(mFlags, mListener, mAllowedViolations);
-            }
-        }
-    }
-
-    /** Returns the current default policy. */
-     @NonNull
-    public static Policy getDefaultPolicy() {
-        return defaultPolicy;
-    }
-
-    /**
-     * Sets the policy for what actions should be detected, as well as the penalty if such actions
-     * occur.
-     *
-     * @param policy the policy to put into place
-     */
-    public static void setDefaultPolicy(@NonNull Policy policy) {
-        defaultPolicy = policy;
-    }
-
-    private static Policy getNearestPolicy(@Nullable Fragment fragment) {
-        while (fragment != null) {
-            if (fragment.isAdded()) {
-                FragmentManager fragmentManager = fragment.getParentFragmentManager();
-                if (fragmentManager.getStrictModePolicy() != null) {
-                    return fragmentManager.getStrictModePolicy();
-                }
-            }
-            fragment = fragment.getParentFragment();
-        }
-        return defaultPolicy;
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onFragmentReuse(@NonNull Fragment fragment, @NonNull String previousWho) {
-        Violation violation = new FragmentReuseViolation(fragment, previousWho);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_FRAGMENT_REUSE)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onFragmentTagUsage(
-            @NonNull Fragment fragment,
-            @Nullable ViewGroup container) {
-        Violation violation = new FragmentTagUsageViolation(fragment, container);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_FRAGMENT_TAG_USAGE)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onSetRetainInstanceUsage(@NonNull Fragment fragment) {
-        Violation violation = new SetRetainInstanceUsageViolation(fragment);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_RETAIN_INSTANCE_USAGE)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onGetRetainInstanceUsage(@NonNull Fragment fragment) {
-        Violation violation = new GetRetainInstanceUsageViolation(fragment);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_RETAIN_INSTANCE_USAGE)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onSetUserVisibleHint(@NonNull Fragment fragment, boolean isVisibleToUser) {
-        Violation violation = new SetUserVisibleHintViolation(fragment, isVisibleToUser);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_SET_USER_VISIBLE_HINT)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onSetTargetFragmentUsage(
-            @NonNull Fragment violatingFragment,
-            @NonNull Fragment targetFragment,
-            int requestCode) {
-        Violation violation = new SetTargetFragmentUsageViolation(
-                violatingFragment, targetFragment, requestCode);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(violatingFragment);
-        if (policy.mFlags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE)
-                && shouldHandlePolicyViolation(
-                policy, violatingFragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onGetTargetFragmentUsage(@NonNull Fragment fragment) {
-        Violation violation = new GetTargetFragmentUsageViolation(fragment);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onGetTargetFragmentRequestCodeUsage(@NonNull Fragment fragment) {
-        Violation violation = new GetTargetFragmentRequestCodeUsageViolation(fragment);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onWrongFragmentContainer(
-            @NonNull Fragment fragment,
-            @NonNull ViewGroup container) {
-        Violation violation = new WrongFragmentContainerViolation(fragment, container);
-        logIfDebuggingEnabled(violation);
-
-        Policy policy = getNearestPolicy(fragment);
-        if (policy.mFlags.contains(Flag.DETECT_WRONG_FRAGMENT_CONTAINER)
-                && shouldHandlePolicyViolation(
-                policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    @VisibleForTesting
-    static void onPolicyViolation(@NonNull Violation violation) {
-        logIfDebuggingEnabled(violation);
-
-        Fragment fragment = violation.getFragment();
-        Policy policy = getNearestPolicy(fragment);
-        if (shouldHandlePolicyViolation(policy, fragment.getClass(), violation.getClass())) {
-            handlePolicyViolation(policy, violation);
-        }
-    }
-
-    private static void logIfDebuggingEnabled(@NonNull final Violation violation) {
-        if (FragmentManager.isLoggingEnabled(Log.DEBUG)) {
-            Log.d(FragmentManager.TAG,
-                    "StrictMode violation in " + violation.getFragment().getClass().getName(),
-                    violation);
-        }
-    }
-
-    private static boolean shouldHandlePolicyViolation(
-            @NonNull final Policy policy,
-            @NonNull Class<? extends Fragment> fragmentClass,
-            @NonNull Class<? extends Violation> violationClass) {
-        Set<Class<? extends Violation>> violationsToBypass =
-                policy.mAllowedViolations.get(fragmentClass);
-        if (violationsToBypass == null) {
-            return true;
-        }
-
-        if (violationClass.getSuperclass() != Violation.class) {
-            if (violationsToBypass.contains(violationClass.getSuperclass())) {
-                return false;
-            }
-        }
-        return !violationsToBypass.contains(violationClass);
-    }
-
-    private static void handlePolicyViolation(
-            @NonNull final Policy policy,
-            @NonNull final Violation violation
-    ) {
-        final Fragment fragment = violation.getFragment();
-        final String fragmentName = fragment.getClass().getName();
-
-        if (policy.mFlags.contains(Flag.PENALTY_LOG)) {
-            Log.d(TAG, "Policy violation in " + fragmentName, violation);
-        }
-
-        if (policy.mListener != null) {
-            runOnHostThread(fragment, new Runnable() {
-                @Override
-                public void run() {
-                    policy.mListener.onViolation(violation);
-                }
-            });
-        }
-
-        if (policy.mFlags.contains(Flag.PENALTY_DEATH)) {
-            runOnHostThread(fragment, new Runnable() {
-                @Override
-                public void run() {
-                    Log.e(TAG, "Policy violation with PENALTY_DEATH in " + fragmentName, violation);
-                    throw violation;
-                }
-            });
-        }
-    }
-
-    private static void runOnHostThread(@NonNull Fragment fragment, @NonNull Runnable runnable) {
-        if (fragment.isAdded()) {
-            Handler handler = fragment.getParentFragmentManager().getHost().getHandler();
-            if (handler.getLooper() == Looper.myLooper()) {
-                runnable.run(); // Already on correct thread -> run synchronously
-            } else {
-                handler.post(runnable); // Switch to correct thread
-            }
-        } else {
-            runnable.run(); // Fragment is not attached to any host -> run synchronously
-        }
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.kt b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.kt
new file mode 100644
index 0000000..f8f73b1
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.kt
@@ -0,0 +1,466 @@
+/*
+ * Copyright 2021 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.fragment.app.strictmode
+
+import android.annotation.SuppressLint
+import android.os.Looper
+import android.util.Log
+import android.view.ViewGroup
+import androidx.annotation.RestrictTo
+import androidx.annotation.VisibleForTesting
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.strictmode.FragmentStrictMode.Policy
+
+/**
+ * FragmentStrictMode is a tool which detects things you might be doing by accident and brings
+ * them to your attention so you can fix them. Basically, it's a version of
+ * [android.os.StrictMode] specifically for fragment-related issues.
+ *
+ * You can decide what should happen when a violation is detected. For example, using
+ * [Policy.Builder.penaltyLog] you can watch the output of `adb logcat` while you
+ * use your application to see the violations as they happen.
+ */
+object FragmentStrictMode {
+    private const val TAG = "FragmentStrictMode"
+    /**
+     * The current policy for what actions should be detected, as well as the penalty if such
+     * actions occur.
+     */
+    var defaultPolicy = Policy.LAX
+    private fun getNearestPolicy(fragment: Fragment?): Policy {
+        var declaringFragment = fragment
+        while (declaringFragment != null) {
+            if (declaringFragment.isAdded) {
+                val fragmentManager = declaringFragment.parentFragmentManager
+                if (fragmentManager.strictModePolicy != null) {
+                    return fragmentManager.strictModePolicy!!
+                }
+            }
+            declaringFragment = declaringFragment.parentFragment
+        }
+        return defaultPolicy
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onFragmentReuse(fragment: Fragment, previousFragmentId: String) {
+        val violation: Violation = FragmentReuseViolation(fragment, previousFragmentId)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_FRAGMENT_REUSE) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onFragmentTagUsage(
+        fragment: Fragment,
+        container: ViewGroup?
+    ) {
+        val violation: Violation = FragmentTagUsageViolation(fragment, container)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_FRAGMENT_TAG_USAGE) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onSetRetainInstanceUsage(fragment: Fragment) {
+        val violation: Violation = SetRetainInstanceUsageViolation(fragment)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_RETAIN_INSTANCE_USAGE) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onGetRetainInstanceUsage(fragment: Fragment) {
+        val violation: Violation = GetRetainInstanceUsageViolation(fragment)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_RETAIN_INSTANCE_USAGE) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onSetUserVisibleHint(fragment: Fragment, isVisibleToUser: Boolean) {
+        val violation: Violation = SetUserVisibleHintViolation(fragment, isVisibleToUser)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_SET_USER_VISIBLE_HINT) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onSetTargetFragmentUsage(
+        violatingFragment: Fragment,
+        targetFragment: Fragment,
+        requestCode: Int
+    ) {
+        val violation: Violation = SetTargetFragmentUsageViolation(
+            violatingFragment, targetFragment, requestCode
+        )
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(violatingFragment)
+        if (policy.flags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE) &&
+            shouldHandlePolicyViolation(policy, violatingFragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onGetTargetFragmentUsage(fragment: Fragment) {
+        val violation: Violation = GetTargetFragmentUsageViolation(fragment)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onGetTargetFragmentRequestCodeUsage(fragment: Fragment) {
+        val violation: Violation = GetTargetFragmentRequestCodeUsageViolation(fragment)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @JvmStatic
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    fun onWrongFragmentContainer(
+        fragment: Fragment,
+        container: ViewGroup
+    ) {
+        val violation: Violation = WrongFragmentContainerViolation(fragment, container)
+        logIfDebuggingEnabled(violation)
+        val policy = getNearestPolicy(fragment)
+        if (policy.flags.contains(Flag.DETECT_WRONG_FRAGMENT_CONTAINER) &&
+            shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)
+        ) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    @VisibleForTesting
+    fun onPolicyViolation(violation: Violation) {
+        logIfDebuggingEnabled(violation)
+        val fragment: Fragment = violation.fragment
+        val policy = getNearestPolicy(fragment)
+        if (shouldHandlePolicyViolation(policy, fragment.javaClass, violation.javaClass)) {
+            handlePolicyViolation(policy, violation)
+        }
+    }
+
+    private fun logIfDebuggingEnabled(violation: Violation) {
+        if (FragmentManager.isLoggingEnabled(Log.DEBUG)) {
+            Log.d(
+                FragmentManager.TAG,
+                "StrictMode violation in ${violation.fragment.javaClass.name}",
+                violation
+            )
+        }
+    }
+
+    private fun shouldHandlePolicyViolation(
+        policy: Policy,
+        fragmentClass: Class<out Fragment>,
+        violationClass: Class<out Violation>
+    ): Boolean {
+        val violationsToBypass = policy.mAllowedViolations[fragmentClass] ?: return true
+        if (violationClass.superclass != Violation::class.java) {
+            if (violationsToBypass.contains(violationClass.superclass)) {
+                return false
+            }
+        }
+        return !violationsToBypass.contains(violationClass)
+    }
+
+    private fun handlePolicyViolation(
+        policy: Policy,
+        violation: Violation
+    ) {
+        val fragment: Fragment = violation.fragment
+        val fragmentName = fragment.javaClass.name
+        if (policy.flags.contains(Flag.PENALTY_LOG)) {
+            Log.d(TAG, "Policy violation in $fragmentName", violation)
+        }
+        if (policy.listener != null) {
+            runOnHostThread(fragment) { policy.listener.onViolation(violation) }
+        }
+        if (policy.flags.contains(Flag.PENALTY_DEATH)) {
+            runOnHostThread(fragment) {
+                Log.e(TAG, "Policy violation with PENALTY_DEATH in $fragmentName", violation)
+                throw violation
+            }
+        }
+    }
+
+    private fun runOnHostThread(fragment: Fragment, runnable: Runnable) {
+        if (fragment.isAdded) {
+            val handler = fragment.parentFragmentManager.host.handler
+            if (handler.looper == Looper.myLooper()) {
+                runnable.run() // Already on correct thread -> run synchronously
+            } else {
+                handler.post(runnable) // Switch to correct thread
+            }
+        } else {
+            runnable.run() // Fragment is not attached to any host -> run synchronously
+        }
+    }
+
+    internal enum class Flag {
+        PENALTY_LOG,
+        PENALTY_DEATH,
+        DETECT_FRAGMENT_REUSE,
+        DETECT_FRAGMENT_TAG_USAGE,
+        DETECT_RETAIN_INSTANCE_USAGE,
+        DETECT_SET_USER_VISIBLE_HINT,
+        DETECT_TARGET_FRAGMENT_USAGE,
+        DETECT_WRONG_FRAGMENT_CONTAINER
+    }
+
+    /**
+     * When [Policy.Builder.penaltyListener] is enabled, the listener is called when a
+     * violation occurs.
+     */
+    fun interface OnViolationListener {
+        /** Called on a policy violation.  */
+        fun onViolation(violation: Violation)
+    }
+
+    /**
+     * [FragmentStrictMode] policy applied to a certain [FragmentManager] (or globally).
+     *
+     * This policy can either be enabled globally using [defaultPolicy] or for a
+     * specific [FragmentManager] using [FragmentManager.setStrictModePolicy].
+     * The current policy can be retrieved using [defaultPolicy] and
+     * [FragmentManager.getStrictModePolicy] respectively.
+     *
+     * Note that multiple penalties may be provided and they're run in order from least to most
+     * severe (logging before process death, for example). There's currently no mechanism to choose
+     * different penalties for different detected actions.
+     */
+    class Policy internal constructor(
+        internal val flags: Set<Flag>,
+        listener: OnViolationListener?,
+        allowedViolations: Map<Class<out Fragment>, MutableSet<Class<out Violation>>>
+    ) {
+        internal val listener: OnViolationListener?
+        internal val mAllowedViolations: Map<Class<out Fragment>, Set<Class<out Violation>>>
+
+        /**
+         * Creates [Policy] instances. Methods whose names start with `detect` specify
+         * what problems we should look for. Methods whose names start with `penalty` specify
+         * what we should do when we detect a problem.
+         *
+         * You can call as many `detect` and `penalty` methods as you like. Currently
+         * order is insignificant: all penalties apply to all detected problems.
+         */
+        class Builder {
+            private val flags: MutableSet<Flag> = mutableSetOf()
+            private var listener: OnViolationListener? = null
+            private val mAllowedViolations:
+                MutableMap<Class<out Fragment>, MutableSet<Class<out Violation>>> = mutableMapOf()
+
+            /** Log detected violations to the system log.  */
+            @SuppressLint("BuilderSetStyle")
+            fun penaltyLog(): Builder {
+                flags.add(Flag.PENALTY_LOG)
+                return this
+            }
+
+            /**
+             * Throws an exception on violation. This penalty runs at the end of all enabled
+             * penalties so you'll still get to see logging or other violations before the exception
+             * is thrown.
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun penaltyDeath(): Builder {
+                flags.add(Flag.PENALTY_DEATH)
+                return this
+            }
+
+            /**
+             * Call [OnViolationListener.onViolation] for every violation. The listener will
+             * be called on the main thread of the fragment host.
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun penaltyListener(listener: OnViolationListener): Builder {
+                this.listener = listener
+                return this
+            }
+
+            /**
+             * Detects cases, where a [Fragment] instance is reused, after it was previously
+             * removed from a [FragmentManager].
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun detectFragmentReuse(): Builder {
+                flags.add(Flag.DETECT_FRAGMENT_REUSE)
+                return this
+            }
+
+            /** Detects usage of the <fragment> tag inside XML layouts.  */
+            @SuppressLint("BuilderSetStyle")
+            fun detectFragmentTagUsage(): Builder {
+                flags.add(Flag.DETECT_FRAGMENT_TAG_USAGE)
+                return this
+            }
+
+            /**
+             * Detects calls to [Fragment.setRetainInstance] and [Fragment.getRetainInstance].
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun detectRetainInstanceUsage(): Builder {
+                flags.add(Flag.DETECT_RETAIN_INSTANCE_USAGE)
+                return this
+            }
+
+            /** Detects calls to [Fragment.setUserVisibleHint].  */
+            @SuppressLint("BuilderSetStyle")
+            fun detectSetUserVisibleHint(): Builder {
+                flags.add(Flag.DETECT_SET_USER_VISIBLE_HINT)
+                return this
+            }
+
+            /**
+             * Detects calls to [Fragment.setTargetFragment], [Fragment.getTargetFragment] and
+             * [Fragment.getTargetRequestCode].
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun detectTargetFragmentUsage(): Builder {
+                flags.add(Flag.DETECT_TARGET_FRAGMENT_USAGE)
+                return this
+            }
+
+            /**
+             * Detects cases where a [Fragment] is added to a container other than a
+             * [androidx.fragment.app.FragmentContainerView].
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun detectWrongFragmentContainer(): Builder {
+                flags.add(Flag.DETECT_WRONG_FRAGMENT_CONTAINER)
+                return this
+            }
+
+            /**
+             * Allow the specified [Fragment] class to bypass penalties for the specified
+             * [Violation], if detected.
+             *
+             * By default, all [Fragment] classes will incur penalties for any detected [Violation].
+             */
+            @SuppressLint("BuilderSetStyle")
+            fun allowViolation(
+                fragmentClass: Class<out Fragment>,
+                violationClass: Class<out Violation>
+            ): Builder {
+                var violationsToBypass = mAllowedViolations[fragmentClass]
+                if (violationsToBypass == null) {
+                    violationsToBypass = mutableSetOf()
+                }
+                violationsToBypass.add(violationClass)
+                mAllowedViolations[fragmentClass] = violationsToBypass
+                return this
+            }
+
+            /**
+             * Construct the Policy instance.
+             *
+             * Note: if no penalties are enabled before calling `build`, [penaltyLog] is implicitly
+             * set.
+             */
+            fun build(): Policy {
+                if (listener == null && !flags.contains(Flag.PENALTY_DEATH)) {
+                    penaltyLog()
+                }
+                return Policy(flags, listener, mAllowedViolations)
+            }
+        }
+
+        internal companion object {
+            /** The default, lax policy which doesn't catch anything.  */
+            @JvmField
+            val LAX = Policy(emptySet(), null, emptyMap())
+        }
+
+        init {
+            this.listener = listener
+            val newAllowedViolationsMap:
+                MutableMap<Class<out Fragment>, Set<Class<out Violation>>> = mutableMapOf()
+            for ((key, value) in allowedViolations) {
+                newAllowedViolationsMap[key] = value
+            }
+            mAllowedViolations = newAllowedViolationsMap
+        }
+    }
+}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
deleted file mode 100644
index c5d9b7c..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import android.view.ViewGroup;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectFragmentTagUsage()}. */
-public final class FragmentTagUsageViolation extends Violation {
-
-    @Nullable
-    private final ViewGroup mContainer;
-
-    FragmentTagUsageViolation(@NonNull Fragment fragment, @Nullable ViewGroup container) {
-        super(fragment);
-        this.mContainer = container;
-    }
-
-    /**
-     * Gets the parent container that the {@link Fragment} causing the Violation
-     * would have been added to.
-     */
-    @Nullable
-    public ViewGroup getParentContainer() {
-        return mContainer;
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to use <fragment> tag to add fragment " + mFragment + " to container "
-                + mContainer;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.kt b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.kt
new file mode 100644
index 0000000..71a89e0
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 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.fragment.app.strictmode
+
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectFragmentTagUsage].
+ */
+class FragmentTagUsageViolation internal constructor(
+    fragment: Fragment,
+    /**
+     * Gets the parent container that the [Fragment] causing the Violation
+     * would have been added to.
+     */
+    val parentContainer: ViewGroup?
+) : Violation(
+    fragment,
+    "Attempting to use <fragment> tag to add fragment $fragment to container $parentContainer"
+)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetRetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetRetainInstanceUsageViolation.java
deleted file mode 100644
index 96f00db..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetRetainInstanceUsageViolation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public final class GetRetainInstanceUsageViolation extends RetainInstanceUsageViolation {
-
-    GetRetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to get retain instance for fragment " + mFragment;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetRetainInstanceUsageViolation.kt
similarity index 62%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetRetainInstanceUsageViolation.kt
index f7ebdc2..a58f65c 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetRetainInstanceUsageViolation.kt
@@ -13,16 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
+import androidx.fragment.app.Fragment
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+/**
+ * See #[FragmentStrictMode.Policy.Builder.detectRetainInstanceUsage].
+ */
+class GetRetainInstanceUsageViolation internal constructor(fragment: Fragment) :
+    RetainInstanceUsageViolation(
+        fragment,
+        "Attempting to get retain instance for fragment $fragment"
+    )
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentRequestCodeUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentRequestCodeUsageViolation.java
deleted file mode 100644
index cfcb5ab..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentRequestCodeUsageViolation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectTargetFragmentUsage()}. */
-public final class GetTargetFragmentRequestCodeUsageViolation extends TargetFragmentUsageViolation {
-
-    GetTargetFragmentRequestCodeUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to get target request code from fragment " + mFragment;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentRequestCodeUsageViolation.kt
similarity index 61%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentRequestCodeUsageViolation.kt
index f7ebdc2..79c2407 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentRequestCodeUsageViolation.kt
@@ -13,16 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
+import androidx.fragment.app.Fragment
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectTargetFragmentUsage].
+ */
+class GetTargetFragmentRequestCodeUsageViolation internal constructor(fragment: Fragment) :
+    TargetFragmentUsageViolation(
+        fragment,
+        "Attempting to get target request code from fragment $fragment"
+    )
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentUsageViolation.java
deleted file mode 100644
index db862c8..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentUsageViolation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectTargetFragmentUsage()}. */
-public final class GetTargetFragmentUsageViolation extends TargetFragmentUsageViolation {
-
-    GetTargetFragmentUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to get target fragment from fragment " + mFragment;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentUsageViolation.kt
similarity index 62%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentUsageViolation.kt
index f7ebdc2..80d2d3d 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/GetTargetFragmentUsageViolation.kt
@@ -13,16 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
+import androidx.fragment.app.Fragment
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectTargetFragmentUsage].
+ */
+class GetTargetFragmentUsageViolation internal constructor(fragment: Fragment) :
+    TargetFragmentUsageViolation(
+        fragment,
+        "Attempting to get target fragment from fragment $fragment"
+    )
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.kt
similarity index 62%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.kt
index f7ebdc2..528ead2 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.kt
@@ -13,16 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
+import androidx.fragment.app.Fragment
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectRetainInstanceUsage].
+ */
+abstract class RetainInstanceUsageViolation internal constructor(
+    fragment: Fragment,
+    message: String? = null
+) : Violation(fragment, message)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetRetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetRetainInstanceUsageViolation.java
deleted file mode 100644
index c46cd61..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetRetainInstanceUsageViolation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public final class SetRetainInstanceUsageViolation extends RetainInstanceUsageViolation {
-
-    SetRetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to set retain instance for fragment " + mFragment;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetRetainInstanceUsageViolation.kt
similarity index 62%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetRetainInstanceUsageViolation.kt
index f7ebdc2..6438bb4 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetRetainInstanceUsageViolation.kt
@@ -13,16 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
+import androidx.fragment.app.Fragment
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectRetainInstanceUsage].
+ */
+class SetRetainInstanceUsageViolation internal constructor(fragment: Fragment) :
+    RetainInstanceUsageViolation(
+        fragment,
+        "Attempting to set retain instance for fragment $fragment"
+    )
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetTargetFragmentUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetTargetFragmentUsageViolation.java
deleted file mode 100644
index 76962eda..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetTargetFragmentUsageViolation.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectTargetFragmentUsage()}. */
-public final class SetTargetFragmentUsageViolation extends TargetFragmentUsageViolation {
-
-    private final Fragment mTargetFragment;
-    private final int mRequestCode;
-
-    SetTargetFragmentUsageViolation(
-            @NonNull Fragment violatingFragment,
-            @NonNull Fragment targetFragment,
-            int requestCode) {
-        super(violatingFragment);
-        this.mTargetFragment = targetFragment;
-        this.mRequestCode = requestCode;
-    }
-
-    /**
-     * Gets the target {@link Fragment} that was being set in the call causing the Violation.
-     */
-    @NonNull
-    public Fragment getTargetFragment() {
-        return mTargetFragment;
-    }
-
-    /**
-     * Gets the request code that was passed in the call causing the Violation.
-     */
-    public int getRequestCode() {
-        return mRequestCode;
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to set target fragment " + mTargetFragment + " with request code "
-                + mRequestCode + " for fragment " + mFragment;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetTargetFragmentUsageViolation.kt b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetTargetFragmentUsageViolation.kt
new file mode 100644
index 0000000..6ce3486
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetTargetFragmentUsageViolation.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 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.fragment.app.strictmode
+
+import androidx.fragment.app.Fragment
+
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectTargetFragmentUsage].
+ */
+class SetTargetFragmentUsageViolation internal constructor(
+    fragment: Fragment,
+    /**
+     * Gets the target [Fragment] that was being set in the call causing the Violation.
+     */
+    val targetFragment: Fragment,
+    /**
+     * Gets the request code that was passed in the call causing the Violation.
+     */
+    val requestCode: Int
+) : TargetFragmentUsageViolation(
+    fragment,
+    "Attempting to set target fragment $targetFragment with request code " +
+        "$requestCode for fragment $fragment"
+)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
deleted file mode 100644
index dcf5bdc..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectSetUserVisibleHint()}. */
-public final class SetUserVisibleHintViolation extends Violation {
-
-    private final boolean mIsVisibleToUser;
-
-    SetUserVisibleHintViolation(@NonNull Fragment fragment, boolean isVisibleToUser) {
-        super(fragment);
-        this.mIsVisibleToUser = isVisibleToUser;
-    }
-
-    /**
-     * Indicates what the {@code isVisibleToUser} field for the {@link Fragment} causing the
-     * Violation was being set to.
-     */
-    public boolean isVisibleToUser() {
-        return mIsVisibleToUser;
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to set user visible hint to " + mIsVisibleToUser + " for fragment "
-                + mFragment;
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.kt b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.kt
new file mode 100644
index 0000000..79ed2ae
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2021 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.fragment.app.strictmode
+
+import androidx.fragment.app.Fragment
+
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectSetUserVisibleHint].
+ */
+class SetUserVisibleHintViolation internal constructor(
+    fragment: Fragment,
+    /**
+     * Indicates what the `isVisibleToUser` field for the [Fragment] causing the
+     * Violation was being set to.
+     */
+    val isVisibleToUser: Boolean
+) : Violation(
+    fragment,
+    "Attempting to set user visible hint to $isVisibleToUser for fragment $fragment"
+)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
deleted file mode 100644
index b62c430..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectTargetFragmentUsage()}. */
-public abstract class TargetFragmentUsageViolation extends Violation {
-
-    TargetFragmentUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.kt
similarity index 62%
copy from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
copy to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.kt
index f7ebdc2..a5d1d4e 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.kt
@@ -13,16 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
+import androidx.fragment.app.Fragment
 
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-public abstract class RetainInstanceUsageViolation extends Violation {
-
-    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
-        super(fragment);
-    }
-}
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectTargetFragmentUsage].
+ */
+abstract class TargetFragmentUsageViolation internal constructor(
+    fragment: Fragment,
+    message: String? = null
+) : Violation(fragment, message)
\ No newline at end of file
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.kt
similarity index 62%
rename from fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
rename to fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.kt
index fae9784..96bea3a 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.kt
@@ -13,27 +13,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.fragment.app.strictmode
 
-package androidx.fragment.app.strictmode;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
+import androidx.fragment.app.Fragment
 
 /** Root class for all FragmentStrictMode violations. */
 @SuppressWarnings("ExceptionName")
-public abstract class Violation extends RuntimeException {
-
-    final Fragment mFragment;
-
-    Violation(@NonNull Fragment fragment) {
-        mFragment = fragment;
-    }
-
+abstract class Violation internal constructor(
     /**
-     * Gets the {@link Fragment} causing the Violation.
+     * Gets the [Fragment] causing the Violation.
      */
-    @NonNull
-    public Fragment getFragment() {
-        return mFragment;
-    }
-}
+    val fragment: Fragment,
+    violationMessage: String? = null
+) : RuntimeException(violationMessage)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
deleted file mode 100644
index 61fb15d..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2021 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.fragment.app.strictmode;
-
-import android.view.ViewGroup;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-/** See #{@link FragmentStrictMode.Policy.Builder#detectWrongFragmentContainer()}. */
-public final class WrongFragmentContainerViolation extends Violation {
-
-    private final ViewGroup mContainer;
-
-    WrongFragmentContainerViolation(@NonNull Fragment fragment, @NonNull ViewGroup container) {
-        super(fragment);
-        this.mContainer = container;
-    }
-
-    /**
-     * Gets the container that the {@link Fragment} causing the Violation was
-     * being added to.
-     */
-    @NonNull
-    public ViewGroup getContainer() {
-        return mContainer;
-    }
-
-    @NonNull
-    @Override
-    public String getMessage() {
-        return "Attempting to add fragment " + mFragment + " to container " + mContainer
-                + " which is not a FragmentContainerView";
-    }
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.kt b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.kt
new file mode 100644
index 0000000..414868c
--- /dev/null
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021 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.fragment.app.strictmode
+
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+
+/**
+ * See [FragmentStrictMode.Policy.Builder.detectWrongFragmentContainer].
+ */
+class WrongFragmentContainerViolation internal constructor(
+    fragment: Fragment,
+    /**
+     * Gets the container that the [Fragment] causing the Violation was
+     * being added to.
+     */
+    val container: ViewGroup
+) : Violation(
+    fragment,
+    "Attempting to add fragment $fragment to container $container which is not a " +
+        "FragmentContainerView"
+)
diff --git a/glance/glance-appwidget/build.gradle b/glance/glance-appwidget/build.gradle
index ae7bfc6..c5532cd 100644
--- a/glance/glance-appwidget/build.gradle
+++ b/glance/glance-appwidget/build.gradle
@@ -67,9 +67,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 23
-    }
     // Use Robolectric 4.+
     testOptions.unitTests.includeAndroidResources = true
 
diff --git a/glance/glance-appwidget/integration-tests/demos/build.gradle b/glance/glance-appwidget/integration-tests/demos/build.gradle
index 0cff540..4c9185b 100644
--- a/glance/glance-appwidget/integration-tests/demos/build.gradle
+++ b/glance/glance-appwidget/integration-tests/demos/build.gradle
@@ -32,7 +32,6 @@
 
 android {
     defaultConfig {
-        minSdkVersion 23
         // Change the APK name to match the *testapp regex we use to pick up APKs for testing as
         // part of CI.
         archivesBaseName = "glance-appwidget-demos-testapp"
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt
index 1caa6a5..4646a40 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt
@@ -17,7 +17,9 @@
 
 package androidx.glance.appwidget
 
+import android.app.PendingIntent
 import android.content.Context
+import android.content.Intent
 import android.content.res.Resources
 import android.util.DisplayMetrics
 import android.util.TypedValue
@@ -25,9 +27,33 @@
 import android.widget.RemoteViews
 import androidx.glance.GlanceInternalApi
 import androidx.glance.Modifier
+import androidx.glance.action.Action
+import androidx.glance.action.ActionModifier
+import androidx.glance.action.LaunchActivityAction
 import androidx.glance.layout.PaddingModifier
 import androidx.glance.unit.Dp
 
+private fun applyAction(
+    rv: RemoteViews,
+    action: Action,
+    context: Context
+) {
+    when (action) {
+        is LaunchActivityAction -> {
+            val intent = Intent(context, action.activityClass)
+            val pendingIntent: PendingIntent =
+                PendingIntent.getActivity(
+                    context,
+                    0,
+                    intent,
+                    PendingIntent.FLAG_MUTABLE
+                )
+            rv.setOnClickPendingIntent(R.id.glanceView, pendingIntent)
+        }
+        else -> throw IllegalArgumentException("Unrecognized action type.")
+    }
+}
+
 private fun applyPadding(
     rv: RemoteViews,
     modifier: PaddingModifier,
@@ -50,6 +76,7 @@
 internal fun applyModifiers(context: Context, rv: RemoteViews, modifiers: Modifier) {
     modifiers.foldOut(Unit) { modifier, _ ->
         when (modifier) {
+            is ActionModifier -> applyAction(rv, modifier.action, context)
             is PaddingModifier -> applyPadding(rv, modifier, context.resources)
         }
     }
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
index e819743..7a8f821 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
@@ -19,7 +19,10 @@
 import android.appwidget.AppWidgetManager
 import android.appwidget.AppWidgetProvider
 import android.content.Context
+import android.os.Build
 import android.os.Bundle
+import android.util.Log
+import androidx.annotation.CallSuper
 import kotlinx.coroutines.async
 import kotlinx.coroutines.awaitAll
 
@@ -37,23 +40,36 @@
  * implementation.
  */
 abstract class GlanceAppWidgetReceiver : AppWidgetProvider() {
+
+    private companion object {
+        private const val TAG = "GlanceAppWidgetReceiver"
+    }
+
     /**
      * Instance of the [GlanceAppWidget] to use to generate the App Widget and send it to the
      * [AppWidgetManager]
      */
     abstract val glanceAppWidget: GlanceAppWidget
 
+    @CallSuper
     override fun onUpdate(
         context: Context,
         appWidgetManager: AppWidgetManager,
         appWidgetIds: IntArray
     ) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            Log.w(
+                TAG,
+                "Using Glance in devices with API<23 is untested and might behave unexpectedly."
+            )
+        }
         goAsync {
             appWidgetIds.map { async { glanceAppWidget.update(context, appWidgetManager, it) } }
                 .awaitAll()
         }
     }
 
+    @CallSuper
     override fun onAppWidgetOptionsChanged(
         context: Context,
         appWidgetManager: AppWidgetManager,
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
index d1d5003..3085e20 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
@@ -21,8 +21,10 @@
 import android.content.Intent
 import android.content.IntentFilter
 import android.os.Looper.getMainLooper
+import android.util.Log
 import androidx.glance.GlanceInternalApi
 import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
@@ -55,10 +57,12 @@
                     try {
                         awaitCancellation()
                     } catch (ex: CancellationException) {
+                        Log.i("CoroutineBRTest", "Scope cancelled")
                         scopeCancelled.countDown()
                         throw ex
                     }
                 }
+                Log.i("CoroutineBRTest", "Broadcast executed")
                 broadcastExecuted.countDown()
             }
         }
@@ -66,6 +70,7 @@
 
     @MediumTest
     @Test
+    @FlakyTest
     fun onReceive() {
         val broadcastReceiver = TestBroadcast()
         context.registerReceiver(
diff --git a/glance/glance/api/current.txt b/glance/glance/api/current.txt
index 7caadcb..189768c 100644
--- a/glance/glance/api/current.txt
+++ b/glance/glance/api/current.txt
@@ -42,6 +42,22 @@
 
 }
 
+package androidx.glance.action {
+
+  public interface Action {
+  }
+
+  public final class ActionKt {
+    method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
+  }
+
+  public final class LaunchActivityActionKt {
+    method public static <T extends android.app.Activity> androidx.glance.action.Action launchActivityAction(Class<T> activity);
+    method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! launchActivityAction();
+  }
+
+}
+
 package androidx.glance.layout {
 
   public final class Alignment {
diff --git a/glance/glance/api/public_plus_experimental_current.txt b/glance/glance/api/public_plus_experimental_current.txt
index 5468dfd..ac80b4a 100644
--- a/glance/glance/api/public_plus_experimental_current.txt
+++ b/glance/glance/api/public_plus_experimental_current.txt
@@ -68,6 +68,34 @@
 
 }
 
+package androidx.glance.action {
+
+  public interface Action {
+  }
+
+  public final class ActionKt {
+    method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
+  }
+
+  @androidx.glance.GlanceInternalApi public final class ActionModifier implements androidx.glance.Modifier.Element {
+    ctor public ActionModifier(androidx.glance.action.Action action);
+    method public androidx.glance.action.Action getAction();
+    property public final androidx.glance.action.Action action;
+  }
+
+  @androidx.glance.GlanceInternalApi public final class LaunchActivityAction implements androidx.glance.action.Action {
+    ctor public LaunchActivityAction(Class<? extends android.app.Activity> activityClass);
+    method public Class<? extends android.app.Activity> getActivityClass();
+    property public final Class<? extends android.app.Activity> activityClass;
+  }
+
+  public final class LaunchActivityActionKt {
+    method public static <T extends android.app.Activity> androidx.glance.action.Action launchActivityAction(Class<T> activity);
+    method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! launchActivityAction();
+  }
+
+}
+
 package androidx.glance.layout {
 
   public final class Alignment {
diff --git a/glance/glance/api/restricted_current.txt b/glance/glance/api/restricted_current.txt
index 7caadcb..189768c 100644
--- a/glance/glance/api/restricted_current.txt
+++ b/glance/glance/api/restricted_current.txt
@@ -42,6 +42,22 @@
 
 }
 
+package androidx.glance.action {
+
+  public interface Action {
+  }
+
+  public final class ActionKt {
+    method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
+  }
+
+  public final class LaunchActivityActionKt {
+    method public static <T extends android.app.Activity> androidx.glance.action.Action launchActivityAction(Class<T> activity);
+    method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! launchActivityAction();
+  }
+
+}
+
 package androidx.glance.layout {
 
   public final class Alignment {
diff --git a/glance/glance/build.gradle b/glance/glance/build.gradle
index 96a70a5..e814232 100644
--- a/glance/glance/build.gradle
+++ b/glance/glance/build.gradle
@@ -45,9 +45,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 23
-    }
     // Use Robolectric 4.+
     testOptions.unitTests.includeAndroidResources = true
 }
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
new file mode 100644
index 0000000..8a5a193
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
@@ -0,0 +1,42 @@
+@file:OptIn(GlanceInternalApi::class)
+/*
+ * Copyright 2021 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.glance.action
+
+import android.app.Activity
+import androidx.glance.GlanceInternalApi
+import androidx.glance.Modifier
+
+/**
+ * An Action defines the actions a user can take. Implementations specify what operation will be
+ * performed in response to the action, eg. [launchActivityAction] creates an Action that launches
+ * the specified [Activity].
+ */
+public interface Action
+
+/**
+ * Apply an [Action], to be executed in response to a user click.
+ */
+public fun Modifier.clickable(onClick: Action): Modifier =
+    this.then(ActionModifier(onClick))
+
+@GlanceInternalApi
+class ActionModifier(public val action: Action) : Modifier.Element {
+    override fun toString(): String {
+        return "ActionModifier(action=$action)"
+    }
+}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
new file mode 100644
index 0000000..c090bd0
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2021 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.glance.action
+
+import android.app.Activity
+import androidx.glance.GlanceInternalApi
+
+@GlanceInternalApi
+class LaunchActivityAction(val activityClass: Class<out Activity>) : Action
+
+/**
+ * Creates an [Action] that launches the specified [Activity] when triggered.
+ */
+@OptIn(GlanceInternalApi::class)
+public fun <T : Activity> launchActivityAction(activity: Class<T>): Action =
+    LaunchActivityAction(activity)
+
+@Suppress("MissingNullability") /* Shouldn't need to specify @NonNull. b/199284086 */
+@OptIn(GlanceInternalApi::class)
+/**
+ * Creates an [Action] that launches the specified [Activity] when triggered.
+ */
+public inline fun <reified T : Activity> launchActivityAction(): Action =
+    launchActivityAction(T::class.java)
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt b/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
new file mode 100644
index 0000000..2737436
--- /dev/null
+++ b/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
@@ -0,0 +1,33 @@
+@file:OptIn(GlanceInternalApi::class)
+/*
+ * Copyright 2021 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.glance.action
+
+import androidx.glance.GlanceInternalApi
+import androidx.glance.Modifier
+import androidx.glance.findModifier
+import org.junit.Test
+import kotlin.test.assertIs
+
+class ActionTest {
+    @Test
+    fun test() {
+        val modifiers = Modifier.clickable(launchActivityAction(TestActivity::class.java))
+        val modifier = checkNotNull(modifiers.findModifier<ActionModifier>())
+        assertIs<LaunchActivityAction>(modifier.action)
+    }
+}
\ No newline at end of file
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/glance/glance/src/test/kotlin/androidx/glance/action/TestActivity.kt
similarity index 77%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
copy to glance/glance/src/test/kotlin/androidx/glance/action/TestActivity.kt
index 6464078..6d3f905 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/glance/glance/src/test/kotlin/androidx/glance/action/TestActivity.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright 2021 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.
@@ -14,7 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.glance.action
 
-/** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+import android.app.Activity
+
+class TestActivity : Activity()
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 3403721..981dffc 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -27,10 +27,10 @@
 kotlin = "1.5.30"
 kotlinCompileTesting = "1.4.1"
 kotlinCoroutines = "1.5.0"
-ksp = "1.5.30-1.0.0-beta08"
+ksp = "1.5.30-1.0.0"
 leakcanary = "2.2"
 mockito = "2.25.0"
-skiko = "0.3.9"
+skiko = "0.4.7"
 sqldelight = "1.3.0"
 wire = "3.6.0"
 
@@ -76,7 +76,7 @@
 hiltCompiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
 hiltCore = { module = "com.google.dagger:hilt-core", version.ref = "hilt" }
 intellijAnnotations = { module = "com.intellij:annotations", version = "12.0" }
-japicmpPluginz = { module = "me.champeau.gradle:japicmp-gradle-plugin", version = "0.2.8" }
+japicmpPluginz = { module = "me.champeau.gradle:japicmp-gradle-plugin", version = "0.2.9" }
 javapoet = { module = "com.squareup:javapoet", version = "1.13.0" }
 jsqlparser = { module = "com.github.jsqlparser:jsqlparser", version = "3.1" }
 jsr250 = { module = "javax.annotation:javax.annotation-api", version = "1.2" }
diff --git a/health/health-services-client/api/api_lint.ignore b/health/health-services-client/api/api_lint.ignore
index 1a6bb40..79594d7 100644
--- a/health/health-services-client/api/api_lint.ignore
+++ b/health/health-services-client/api/api_lint.ignore
@@ -1,9 +1,5 @@
 // Baseline format: 1.0
 ExecutorRegistration: androidx.health.services.client.ExerciseClient#clearUpdateListener(androidx.health.services.client.ExerciseUpdateListener):
     Registration methods should have overload that accepts delivery Executor: `clearUpdateListener`
-ExecutorRegistration: androidx.health.services.client.PassiveMonitoringClient#registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType>, android.app.PendingIntent, androidx.health.services.client.PassiveMonitoringCallback):
-    Registration methods should have overload that accepts delivery Executor: `registerDataCallback`
-
-
-MissingGetterMatchingBuilder: androidx.health.services.client.data.ExerciseConfig.Builder#setAutoPauseAndResume(boolean):
-    androidx.health.services.client.data.ExerciseConfig does not declare a `isAutoPauseAndResume()` method matching method androidx.health.services.client.data.ExerciseConfig.Builder.setAutoPauseAndResume(boolean)
+ExecutorRegistration: androidx.health.services.client.PassiveMonitoringClient#registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig, androidx.health.services.client.PassiveMonitoringCallback):
+    Registration methods should have overload that accepts delivery Executor: `registerDataCallback`
\ No newline at end of file
diff --git a/health/health-services-client/api/current.txt b/health/health-services-client/api/current.txt
index fa85cf7..edfe8a1 100644
--- a/health/health-services-client/api/current.txt
+++ b/health/health-services-client/api/current.txt
@@ -5,11 +5,14 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> addGoalToActiveExercise(androidx.health.services.client.data.ExerciseGoal exerciseGoal);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> endExercise();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flushExercise();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseCapabilities> getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseInfo> getCurrentExerciseInfo();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> markLap();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> overrideAutoPauseAndResumeForActiveExercise(boolean enabled);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> pauseExercise();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> prepareExercise(androidx.health.services.client.data.WarmUpConfig configuration);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> removeGoalFromActiveExercise(androidx.health.services.client.data.ExerciseGoal exerciseGoal);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> resumeExercise();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener, java.util.concurrent.Executor executor);
@@ -19,6 +22,7 @@
   }
 
   public interface ExerciseUpdateListener {
+    method public void onAvailabilityChanged(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Availability availability);
     method public void onExerciseUpdate(androidx.health.services.client.data.ExerciseUpdate update);
     method public void onLapSummary(androidx.health.services.client.data.ExerciseLapSummary lapSummary);
   }
@@ -55,12 +59,13 @@
   }
 
   public interface PassiveMonitoringClient {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flush();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> getCapabilities();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.app.PendingIntent callbackIntent);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.app.PendingIntent callbackIntent, androidx.health.services.client.PassiveMonitoringCallback callback);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerEventCallback(androidx.health.services.client.data.event.Event event, android.app.PendingIntent callbackIntent);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig configuration);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig configuration, androidx.health.services.client.PassiveMonitoringCallback callback);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerPassiveGoalCallback(androidx.health.services.client.data.PassiveGoal passiveGoal, android.content.ComponentName componentName);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterDataCallback();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterEventCallback(androidx.health.services.client.data.event.Event event);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterPassiveGoalCallback(androidx.health.services.client.data.PassiveGoal passiveGoal);
     property public abstract com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> capabilities;
   }
 
@@ -68,13 +73,10 @@
 
 package androidx.health.services.client.data {
 
-  public final class AchievedExerciseGoal implements android.os.Parcelable {
+  public final class AchievedExerciseGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.AchievedExerciseGoal> {
     ctor public AchievedExerciseGoal(androidx.health.services.client.data.ExerciseGoal goal);
-    method public androidx.health.services.client.data.ExerciseGoal component1();
-    method public androidx.health.services.client.data.AchievedExerciseGoal copy(androidx.health.services.client.data.ExerciseGoal goal);
-    method public int describeContents();
     method public androidx.health.services.client.data.ExerciseGoal getGoal();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.AchievedExerciseGoal getProto();
     property public final androidx.health.services.client.data.ExerciseGoal goal;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.AchievedExerciseGoal> CREATOR;
     field public static final androidx.health.services.client.data.AchievedExerciseGoal.Companion Companion;
@@ -83,19 +85,30 @@
   public static final class AchievedExerciseGoal.Companion {
   }
 
-  public enum Availability {
-    method public static final androidx.health.services.client.data.Availability? fromId(int id);
-    method public final int getId();
-    property public final int id;
-    enum_constant public static final androidx.health.services.client.data.Availability ACQUIRING;
-    enum_constant public static final androidx.health.services.client.data.Availability AVAILABLE;
-    enum_constant public static final androidx.health.services.client.data.Availability UNAVAILABLE;
-    enum_constant public static final androidx.health.services.client.data.Availability UNKNOWN;
+  public abstract class AggregateDataPoint extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.AggregateDataPoint> {
+    ctor public AggregateDataPoint();
+  }
+
+  @Keep public final class AggregateDataPoints {
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateAbsoluteElevation(double minAbsElevation, double maxAbsElevation, double avgAbsElevation, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateCalories(double kcalories, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateDistance(double distance, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateElevationGain(double gainMeters, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateHeartRate(double minBpm, double maxBpm, double avgBpm, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregatePace(double minMillisPerKm, double maxMillisPerKm, double avgMillisPerKm, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateSpeed(double minMetersPerSecond, double maxMetersPerSecond, double avgMetersPerSecond, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateSteps(long steps, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateSwimmingStrokes(long swimmingStrokes, java.time.Instant startTime, java.time.Instant endTime);
+    field public static final androidx.health.services.client.data.AggregateDataPoints INSTANCE;
+  }
+
+  public interface Availability {
+    method public int getId();
+    property public abstract int id;
     field public static final androidx.health.services.client.data.Availability.Companion Companion;
   }
 
   public static final class Availability.Companion {
-    method public androidx.health.services.client.data.Availability? fromId(int id);
   }
 
   public enum ComparisonType {
@@ -113,26 +126,41 @@
     method public androidx.health.services.client.data.ComparisonType? fromId(int id);
   }
 
-  public final class DataPoint implements android.os.Parcelable {
-    method public androidx.health.services.client.data.DataType component1();
-    method public androidx.health.services.client.data.Value component2();
-    method public java.time.Duration component3();
-    method public java.time.Duration component4();
-    method public android.os.Bundle component5();
-    method public androidx.health.services.client.data.DataPoint copy(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, android.os.Bundle metadata);
+  public final class CumulativeDataPoint extends androidx.health.services.client.data.AggregateDataPoint {
+    ctor public CumulativeDataPoint(java.time.Instant startTime, java.time.Instant endTime, androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value total);
+    method public androidx.health.services.client.data.DataType getDataType();
+    method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.proto.DataProto.AggregateDataPoint getProto();
+    method public java.time.Instant getStartTime();
+    method public androidx.health.services.client.data.Value getTotal();
+    property public final androidx.health.services.client.data.DataType dataType;
+    property public final java.time.Instant endTime;
+    property public final java.time.Instant startTime;
+    property public final androidx.health.services.client.data.Value total;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.CumulativeDataPoint> CREATOR;
+    field public static final androidx.health.services.client.data.CumulativeDataPoint.Companion Companion;
+  }
+
+  public static final class CumulativeDataPoint.Companion {
+  }
+
+  public final class DataPoint extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataPoint> {
+    method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata);
     method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata);
     method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot);
-    method public int describeContents();
+    method public androidx.health.services.client.data.DataPointAccuracy? getAccuracy();
     method public androidx.health.services.client.data.DataType getDataType();
     method public java.time.Duration getEndDurationFromBoot();
     method public java.time.Instant getEndInstant(java.time.Instant bootInstant);
     method public android.os.Bundle getMetadata();
+    method public androidx.health.services.client.proto.DataProto.DataPoint getProto();
     method public java.time.Duration getStartDurationFromBoot();
     method public java.time.Instant getStartInstant(java.time.Instant bootInstant);
     method public androidx.health.services.client.data.Value getValue();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final androidx.health.services.client.data.DataPointAccuracy? accuracy;
     property public final androidx.health.services.client.data.DataType dataType;
     property public final java.time.Duration endDurationFromBoot;
     property public final android.os.Bundle metadata;
@@ -143,96 +171,85 @@
   }
 
   public static final class DataPoint.Companion {
+    method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata);
     method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata);
     method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot);
   }
 
+  public abstract class DataPointAccuracy extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataPointAccuracy> {
+    ctor public DataPointAccuracy();
+  }
+
   @Keep public final class DataPoints {
-    method public static androidx.health.services.client.data.DataPoint aggregateCalories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateDistance(double distance, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateSteps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateSwimmingStrokes(long swimmingStrokes, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint altitude(double meters, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint averagePace(double millisPerKm, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint averageSpeed(double metersPerSecond, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint absoluteElevation(double meters, java.time.Duration durationFromBoot, optional android.os.Bundle? metadata);
+    method public static androidx.health.services.client.data.DataPoint absoluteElevation(double meters, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint calories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint calories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyCalories(double calories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyDistance(double distance, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyFloors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailySteps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint distance(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint distance(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint elevation(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint elevationGain(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
+    method public static androidx.health.services.client.data.DataPoint elevationGain(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint floors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint floors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     method @Keep public static java.util.List<androidx.health.services.client.data.DataPoint> getDataPoints(android.content.Intent intent);
     method public static boolean getPermissionsGranted(android.content.Intent intent);
+    method public static androidx.health.services.client.data.DataPoint heartRate(double bpm, java.time.Duration durationFromBoot, optional androidx.health.services.client.data.HrAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint heartRate(double bpm, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, optional double bearing, java.time.Duration durationFromBoot, optional androidx.health.services.client.data.LocationAccuracy? accuracy);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, optional double bearing, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, java.time.Duration durationFromBoot);
     method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, double altitude, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint maxSpeed(double metersPerSecond, java.time.Duration durationFromBoot);
     method public static androidx.health.services.client.data.DataPoint pace(double millisPerKm, java.time.Duration durationFromBoot);
     method public static void putDataPoints(android.content.Intent intent, java.util.Collection<androidx.health.services.client.data.DataPoint> dataPoints);
     method public static void putPermissionsGranted(android.content.Intent intent, boolean granted);
+    method public static androidx.health.services.client.data.DataPoint speed(double metersPerSecond, java.time.Duration durationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint speed(double metersPerSecond, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint spo2(double percent, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint steps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint steps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     method public static androidx.health.services.client.data.DataPoint stepsPerMinute(long stepsPerMinute, java.time.Duration startDurationFromBoot);
     method public static androidx.health.services.client.data.DataPoint swimmingStrokes(long strokes, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     field public static final androidx.health.services.client.data.DataPoints INSTANCE;
     field public static final int LOCATION_DATA_POINT_ALTITUDE_INDEX = 2; // 0x2
+    field public static final int LOCATION_DATA_POINT_BEARING_INDEX = 3; // 0x3
     field public static final int LOCATION_DATA_POINT_LATITUDE_INDEX = 0; // 0x0
     field public static final int LOCATION_DATA_POINT_LONGITUDE_INDEX = 1; // 0x1
   }
 
-  public final class DataType implements android.os.Parcelable {
+  public final class DataType extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataType> {
     ctor public DataType(String name, androidx.health.services.client.data.DataType.TimeType timeType, int format);
-    method public String component1();
-    method public androidx.health.services.client.data.DataType.TimeType component2();
-    method public int component3();
-    method public androidx.health.services.client.data.DataType copy(String name, androidx.health.services.client.data.DataType.TimeType timeType, int format);
-    method public int describeContents();
     method public int getFormat();
     method public String getName();
+    method public androidx.health.services.client.proto.DataProto.DataType getProto();
     method public androidx.health.services.client.data.DataType.TimeType getTimeType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final int format;
     property public final String name;
     property public final androidx.health.services.client.data.DataType.TimeType timeType;
     field public static final androidx.health.services.client.data.DataType ABSOLUTE_ELEVATION;
     field public static final androidx.health.services.client.data.DataType ACTIVE_EXERCISE_DURATION;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_CALORIES_EXPENDED;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DECLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DECLINE_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_ELEVATION;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLAT_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLAT_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLOORS;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_INCLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_INCLINE_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_RUNNING_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_SWIMMING_STROKE_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_WALKING_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType ALTITUDE;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_HEART_RATE_BPM;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_PACE;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_SPEED;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.DataType> CREATOR;
     field public static final androidx.health.services.client.data.DataType.Companion Companion;
+    field public static final androidx.health.services.client.data.DataType DAILY_CALORIES;
+    field public static final androidx.health.services.client.data.DataType DAILY_DISTANCE;
+    field public static final androidx.health.services.client.data.DataType DAILY_FLOORS;
+    field public static final androidx.health.services.client.data.DataType DAILY_STEPS;
     field public static final androidx.health.services.client.data.DataType DECLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType DECLINE_TIME;
+    field public static final androidx.health.services.client.data.DataType DECLINE_DURATION;
     field public static final androidx.health.services.client.data.DataType DISTANCE;
-    field public static final androidx.health.services.client.data.DataType ELEVATION;
-    field public static final androidx.health.services.client.data.DataType FLAT_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType FLAT_TIME;
+    field public static final androidx.health.services.client.data.DataType ELEVATION_GAIN;
+    field public static final androidx.health.services.client.data.DataType FLAT_GROUND_DISTANCE;
+    field public static final androidx.health.services.client.data.DataType FLAT_GROUND_DURATION;
     field public static final androidx.health.services.client.data.DataType FLOORS;
     field public static final androidx.health.services.client.data.DataType HEART_RATE_BPM;
     field public static final androidx.health.services.client.data.DataType INCLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType INCLINE_TIME;
+    field public static final androidx.health.services.client.data.DataType INCLINE_DURATION;
     field public static final androidx.health.services.client.data.DataType LOCATION;
-    field public static final androidx.health.services.client.data.DataType MAX_ALTITUDE;
-    field public static final androidx.health.services.client.data.DataType MAX_HEART_RATE_BPM;
-    field public static final androidx.health.services.client.data.DataType MAX_PACE;
-    field public static final androidx.health.services.client.data.DataType MAX_SPEED;
-    field public static final androidx.health.services.client.data.DataType MIN_ALTITUDE;
     field public static final androidx.health.services.client.data.DataType PACE;
     field public static final androidx.health.services.client.data.DataType REP_COUNT;
     field public static final androidx.health.services.client.data.DataType RESTING_EXERCISE_DURATION;
@@ -257,19 +274,29 @@
     enum_constant public static final androidx.health.services.client.data.DataType.TimeType SAMPLE;
   }
 
-  public final class DataTypeCondition implements android.os.Parcelable {
+  public enum DataTypeAvailability implements androidx.health.services.client.data.Availability {
+    method public static final androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
+    method public int getId();
+    property public int id;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability ACQUIRING;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability AVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability UNAVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability UNKNOWN;
+    field public static final androidx.health.services.client.data.DataTypeAvailability.Companion Companion;
+  }
+
+  public static final class DataTypeAvailability.Companion {
+    method public androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
+  }
+
+  public final class DataTypeCondition extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataTypeCondition> {
     ctor public DataTypeCondition(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value threshold, androidx.health.services.client.data.ComparisonType comparisonType);
-    method public androidx.health.services.client.data.DataType component1();
-    method public androidx.health.services.client.data.Value component2();
-    method public androidx.health.services.client.data.ComparisonType component3();
-    method public androidx.health.services.client.data.DataTypeCondition copy(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value threshold, androidx.health.services.client.data.ComparisonType comparisonType);
-    method public int describeContents();
     method public androidx.health.services.client.data.ComparisonType getComparisonType();
     method public androidx.health.services.client.data.DataType getDataType();
+    method public androidx.health.services.client.proto.DataProto.DataTypeCondition getProto();
     method public androidx.health.services.client.data.Value getThreshold();
     method public boolean isSatisfied(androidx.health.services.client.data.DataPoint dataPoint);
     method public boolean isThresholdSatisfied(androidx.health.services.client.data.Value value);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final androidx.health.services.client.data.ComparisonType comparisonType;
     property public final androidx.health.services.client.data.DataType dataType;
     property public final androidx.health.services.client.data.Value threshold;
@@ -281,30 +308,18 @@
   }
 
   public final class DataTypes {
-    method public static androidx.health.services.client.data.DataType? getAggregateTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static java.util.Set<androidx.health.services.client.data.DataType> getAggregatedDataTypesFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getAverageTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getMaxTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromAggregateType(androidx.health.services.client.data.DataType aggregateType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromAverageType(androidx.health.services.client.data.DataType averageType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromMaxType(androidx.health.services.client.data.DataType maxType);
-    method public static boolean isAggregateDataType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isRawType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isStatisticalAverageDataType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isStatisticalMaxDataType(androidx.health.services.client.data.DataType dataType);
+    method public static boolean isCumulativeDataType(androidx.health.services.client.data.DataType dataType);
+    method public static boolean isStatisticalDataType(androidx.health.services.client.data.DataType dataType);
     field public static final androidx.health.services.client.data.DataTypes INSTANCE;
   }
 
-  public final class ExerciseCapabilities implements android.os.Parcelable {
+  public final class ExerciseCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseCapabilities> {
     ctor public ExerciseCapabilities(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
-    method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> component1();
-    method public androidx.health.services.client.data.ExerciseCapabilities copy(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
-    method public int describeContents();
     method public java.util.Set<androidx.health.services.client.data.ExerciseType> getAutoPauseAndResumeEnabledExercises();
     method public androidx.health.services.client.data.ExerciseTypeCapabilities getExerciseTypeCapabilities(androidx.health.services.client.data.ExerciseType exercise);
+    method public androidx.health.services.client.proto.DataProto.ExerciseCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.ExerciseType> getSupportedExerciseTypes();
     method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> getTypeToCapabilities();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.ExerciseType> autoPauseAndResumeEnabledExercises;
     property public final java.util.Set<androidx.health.services.client.data.ExerciseType> supportedExerciseTypes;
     property public final java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities;
@@ -315,27 +330,24 @@
   public static final class ExerciseCapabilities.Companion {
   }
 
-  public final class ExerciseConfig implements android.os.Parcelable {
-    ctor protected ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, boolean autoPauseAndResume, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
+  public final class ExerciseConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseConfig> {
+    ctor protected ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, java.util.Set<androidx.health.services.client.data.DataType> aggregateDataTypes, boolean shouldEnableAutoPauseAndResume, boolean shouldEnableGps, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
     method public static androidx.health.services.client.data.ExerciseConfig.Builder builder();
-    method public androidx.health.services.client.data.ExerciseType component1();
-    method public java.util.Set<androidx.health.services.client.data.DataType> component2();
-    method public boolean component3();
-    method public java.util.List<androidx.health.services.client.data.ExerciseGoal> component4();
-    method public android.os.Bundle component5();
-    method public androidx.health.services.client.data.ExerciseConfig copy(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, boolean autoPauseAndResume, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
-    method public int describeContents();
-    method public boolean getAutoPauseAndResume();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getAggregateDataTypes();
     method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
     method public java.util.List<androidx.health.services.client.data.ExerciseGoal> getExerciseGoals();
     method public android.os.Bundle getExerciseParams();
     method public androidx.health.services.client.data.ExerciseType getExerciseType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final boolean autoPauseAndResume;
+    method public androidx.health.services.client.proto.DataProto.ExerciseConfig getProto();
+    method public boolean getShouldEnableAutoPauseAndResume();
+    method public boolean getShouldEnableGps();
+    property public final java.util.Set<androidx.health.services.client.data.DataType> aggregateDataTypes;
     property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
     property public final java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals;
     property public final android.os.Bundle exerciseParams;
     property public final androidx.health.services.client.data.ExerciseType exerciseType;
+    property public final boolean shouldEnableAutoPauseAndResume;
+    property public final boolean shouldEnableGps;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseConfig> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseConfig.Companion Companion;
   }
@@ -343,31 +355,27 @@
   public static final class ExerciseConfig.Builder {
     ctor public ExerciseConfig.Builder();
     method public androidx.health.services.client.data.ExerciseConfig build();
-    method public androidx.health.services.client.data.ExerciseConfig.Builder setAutoPauseAndResume(boolean autoPauseAndResume);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setAggregateDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseGoals(java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseParams(android.os.Bundle exerciseParams);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseType(androidx.health.services.client.data.ExerciseType exerciseType);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setShouldEnableAutoPauseAndResume(boolean shouldEnableAutoPauseAndResume);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setShouldEnableGps(boolean shouldEnableGps);
   }
 
   public static final class ExerciseConfig.Companion {
     method public androidx.health.services.client.data.ExerciseConfig.Builder builder();
   }
 
-  public final class ExerciseGoal implements android.os.Parcelable {
-    ctor protected ExerciseGoal(androidx.health.services.client.data.ExerciseGoalType exerciseGoalType, androidx.health.services.client.data.DataTypeCondition dataTypeCondition, optional androidx.health.services.client.data.Value? period);
-    method public androidx.health.services.client.data.ExerciseGoalType component1();
-    method public androidx.health.services.client.data.DataTypeCondition component2();
-    method public androidx.health.services.client.data.Value? component3();
-    method public androidx.health.services.client.data.ExerciseGoal copy(androidx.health.services.client.data.ExerciseGoalType exerciseGoalType, androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.Value? period);
+  public final class ExerciseGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseGoal> {
     method public static androidx.health.services.client.data.ExerciseGoal createMilestone(androidx.health.services.client.data.DataTypeCondition condition, androidx.health.services.client.data.Value period);
     method public static androidx.health.services.client.data.ExerciseGoal createMilestoneGoalWithUpdatedThreshold(androidx.health.services.client.data.ExerciseGoal goal, androidx.health.services.client.data.Value newThreshold);
     method public static androidx.health.services.client.data.ExerciseGoal createOneTimeGoal(androidx.health.services.client.data.DataTypeCondition condition);
-    method public int describeContents();
     method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
     method public androidx.health.services.client.data.ExerciseGoalType getExerciseGoalType();
     method public androidx.health.services.client.data.Value? getPeriod();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.ExerciseGoal getProto();
     property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
     property public final androidx.health.services.client.data.ExerciseGoalType exerciseGoalType;
     property public final androidx.health.services.client.data.Value? period;
@@ -394,15 +402,11 @@
     method public androidx.health.services.client.data.ExerciseGoalType? fromId(int id);
   }
 
-  public final class ExerciseInfo implements android.os.Parcelable {
+  public final class ExerciseInfo extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseInfo> {
     ctor public ExerciseInfo(androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
-    method public androidx.health.services.client.data.ExerciseTrackedStatus component1();
-    method public androidx.health.services.client.data.ExerciseType component2();
-    method public androidx.health.services.client.data.ExerciseInfo copy(androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
-    method public int describeContents();
     method public androidx.health.services.client.data.ExerciseTrackedStatus getExerciseTrackedStatus();
     method public androidx.health.services.client.data.ExerciseType getExerciseType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.ExerciseInfo getProto();
     property public final androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus;
     property public final androidx.health.services.client.data.ExerciseType exerciseType;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseInfo> CREATOR;
@@ -412,25 +416,18 @@
   public static final class ExerciseInfo.Companion {
   }
 
-  public final class ExerciseLapSummary implements android.os.Parcelable {
-    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics);
-    method public int component1();
-    method public java.time.Instant component2();
-    method public java.time.Instant component3();
-    method public java.time.Duration component4();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> component5();
-    method public androidx.health.services.client.data.ExerciseLapSummary copy(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics);
-    method public int describeContents();
+  public final class ExerciseLapSummary extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseLapSummary> {
+    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> lapMetrics);
     method public java.time.Duration getActiveDuration();
     method public java.time.Instant getEndTime();
     method public int getLapCount();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> getLapMetrics();
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getLapMetrics();
+    method public androidx.health.services.client.proto.DataProto.ExerciseLapSummary getProto();
     method public java.time.Instant getStartTime();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.time.Duration activeDuration;
     property public final java.time.Instant endTime;
     property public final int lapCount;
-    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> lapMetrics;
     property public final java.time.Instant startTime;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseLapSummary> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseLapSummary.Companion Companion;
@@ -443,18 +440,23 @@
     method public static final androidx.health.services.client.data.ExerciseState? fromId(int id);
     method public final int getId();
     method public final boolean isEnded();
+    method public final boolean isEnding();
     method public final boolean isPaused();
     method public final boolean isResuming();
     property public final int id;
     property public final boolean isEnded;
+    property public final boolean isEnding;
     property public final boolean isPaused;
     property public final boolean isResuming;
     enum_constant public static final androidx.health.services.client.data.ExerciseState ACTIVE;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_RESUMING;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState PREPARING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     enum_constant public static final androidx.health.services.client.data.ExerciseState TERMINATING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
@@ -517,10 +519,11 @@
     enum_constant public static final androidx.health.services.client.data.ExerciseType FENCING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AMERICAN;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AUSTRALIAN;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType FORWARD_TWIST;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FRISBEE_DISC;
     enum_constant public static final androidx.health.services.client.data.ExerciseType GOLF;
     enum_constant public static final androidx.health.services.client.data.ExerciseType GUIDED_BREATHING;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType GYNMASTICS;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType GYMNASTICS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HANDBALL;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HIGH_INTENSITY_INTERVAL_TRAINING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HIKING;
@@ -564,12 +567,12 @@
     enum_constant public static final androidx.health.services.client.data.ExerciseType TABLE_TENNIS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType TENNIS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType UNKNOWN;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType UPPER_TWIST;
     enum_constant public static final androidx.health.services.client.data.ExerciseType VOLLEYBALL;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WALKING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WATER_POLO;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WEIGHTLIFTING;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT_INDOOR;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT_OUTDOOR;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT;
     enum_constant public static final androidx.health.services.client.data.ExerciseType YOGA;
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
   }
@@ -578,21 +581,14 @@
     method public androidx.health.services.client.data.ExerciseType fromId(int id);
   }
 
-  public final class ExerciseTypeCapabilities implements android.os.Parcelable {
+  public final class ExerciseTypeCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities> {
     ctor public ExerciseTypeCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume, boolean supportsLaps);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> component2();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> component3();
-    method public boolean component4();
-    method public boolean component5();
-    method public androidx.health.services.client.data.ExerciseTypeCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume, boolean supportsLaps);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypes();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedGoals();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedMilestones();
     method public boolean getSupportsAutoPauseAndResume();
     method public boolean getSupportsLaps();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedGoals;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedMilestones;
@@ -605,31 +601,24 @@
   public static final class ExerciseTypeCapabilities.Companion {
   }
 
-  public final class ExerciseUpdate implements android.os.Parcelable {
-    ctor public ExerciseUpdate(androidx.health.services.client.data.ExerciseState state, java.time.Instant startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig exerciseConfig);
-    method public androidx.health.services.client.data.ExerciseState component1();
-    method public java.time.Instant component2();
-    method public java.time.Duration component3();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> component4();
-    method public java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> component5();
-    method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> component6();
-    method public androidx.health.services.client.data.ExerciseConfig component7();
-    method public androidx.health.services.client.data.ExerciseUpdate copy(androidx.health.services.client.data.ExerciseState state, java.time.Instant startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig exerciseConfig);
-    method public int describeContents();
+  public final class ExerciseUpdate extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseUpdate> {
+    ctor public ExerciseUpdate(androidx.health.services.client.data.ExerciseState state, java.time.Instant? startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> latestAggregateMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig? exerciseConfig);
     method public java.time.Duration getActiveDuration();
-    method public androidx.health.services.client.data.ExerciseConfig getExerciseConfig();
+    method public androidx.health.services.client.data.ExerciseConfig? getExerciseConfig();
     method public java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> getLatestAchievedGoals();
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getLatestAggregateMetrics();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> getLatestMetrics();
     method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> getLatestMilestoneMarkerSummaries();
-    method public java.time.Instant getStartTime();
+    method public androidx.health.services.client.proto.DataProto.ExerciseUpdate getProto();
+    method public java.time.Instant? getStartTime();
     method public androidx.health.services.client.data.ExerciseState getState();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.time.Duration activeDuration;
-    property public final androidx.health.services.client.data.ExerciseConfig exerciseConfig;
+    property public final androidx.health.services.client.data.ExerciseConfig? exerciseConfig;
     property public final java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> latestAggregateMetrics;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics;
     property public final java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries;
-    property public final java.time.Instant startTime;
+    property public final java.time.Instant? startTime;
     property public final androidx.health.services.client.data.ExerciseState state;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseUpdate> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseUpdate.Companion Companion;
@@ -638,13 +627,62 @@
   public static final class ExerciseUpdate.Companion {
   }
 
-  public final class MeasureCapabilities implements android.os.Parcelable {
+  public final class HrAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
+    ctor public HrAccuracy(androidx.health.services.client.data.HrAccuracy.SensorStatus sensorStatus);
+    method public androidx.health.services.client.proto.DataProto.DataPointAccuracy getProto();
+    method public androidx.health.services.client.data.HrAccuracy.SensorStatus getSensorStatus();
+    property public final androidx.health.services.client.data.HrAccuracy.SensorStatus sensorStatus;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.HrAccuracy> CREATOR;
+    field public static final androidx.health.services.client.data.HrAccuracy.Companion Companion;
+  }
+
+  public static final class HrAccuracy.Companion {
+  }
+
+  public enum HrAccuracy.SensorStatus {
+    method public final int getId();
+    property public final int id;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_HIGH;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_LOW;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_MEDIUM;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus NO_CONTACT;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus UNKNOWN;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus UNRELIABLE;
+  }
+
+  public final class LocationAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
+    ctor public LocationAccuracy(double horizontalPositionError);
+    method public double getHorizontalPositionError();
+    method public androidx.health.services.client.proto.DataProto.DataPointAccuracy getProto();
+    property public final double horizontalPositionError;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.LocationAccuracy> CREATOR;
+    field public static final androidx.health.services.client.data.LocationAccuracy.Companion Companion;
+  }
+
+  public static final class LocationAccuracy.Companion {
+  }
+
+  public enum LocationAvailability implements androidx.health.services.client.data.Availability {
+    method public static final androidx.health.services.client.data.LocationAvailability? fromId(int id);
+    method public int getId();
+    property public int id;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_TETHERED;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_UNTETHERED;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRING;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability NO_GPS;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability UNAVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability UNKNOWN;
+    field public static final androidx.health.services.client.data.LocationAvailability.Companion Companion;
+  }
+
+  public static final class LocationAvailability.Companion {
+    method public androidx.health.services.client.data.LocationAvailability? fromId(int id);
+  }
+
+  public final class MeasureCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.MeasureCapabilities> {
     ctor public MeasureCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public androidx.health.services.client.data.MeasureCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.MeasureCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesMeasure();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.MeasureCapabilities> CREATOR;
     field public static final androidx.health.services.client.data.MeasureCapabilities.Companion Companion;
@@ -653,26 +691,19 @@
   public static final class MeasureCapabilities.Companion {
   }
 
-  public final class MilestoneMarkerSummary implements android.os.Parcelable {
-    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics);
-    method public java.time.Instant component1();
-    method public java.time.Instant component2();
-    method public java.time.Duration component3();
-    method public androidx.health.services.client.data.AchievedExerciseGoal component4();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> component5();
-    method public androidx.health.services.client.data.MilestoneMarkerSummary copy(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics);
-    method public int describeContents();
+  public final class MilestoneMarkerSummary extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary> {
+    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> summaryMetrics);
     method public androidx.health.services.client.data.AchievedExerciseGoal getAchievedGoal();
     method public java.time.Duration getActiveDuration();
     method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary getProto();
     method public java.time.Instant getStartTime();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> getSummaryMetrics();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getSummaryMetrics();
     property public final androidx.health.services.client.data.AchievedExerciseGoal achievedGoal;
     property public final java.time.Duration activeDuration;
     property public final java.time.Instant endTime;
     property public final java.time.Instant startTime;
-    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> summaryMetrics;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.MilestoneMarkerSummary> CREATOR;
     field public static final androidx.health.services.client.data.MilestoneMarkerSummary.Companion Companion;
   }
@@ -680,15 +711,43 @@
   public static final class MilestoneMarkerSummary.Companion {
   }
 
-  public final class PassiveMonitoringCapabilities implements android.os.Parcelable {
+  public final class PassiveGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveGoal> {
+    ctor public PassiveGoal(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.PassiveGoal.TriggerType triggerType);
+    method public static androidx.health.services.client.data.PassiveGoal? fromIntent(android.content.Intent intent);
+    method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
+    method public androidx.health.services.client.proto.DataProto.PassiveGoal getProto();
+    method public androidx.health.services.client.data.PassiveGoal.TriggerType getTriggerType();
+    method public boolean isTriggered(androidx.health.services.client.data.DataPoint dataPoint);
+    method public void putToIntent(android.content.Intent intent);
+    property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
+    property public final androidx.health.services.client.data.PassiveGoal.TriggerType triggerType;
+    field public static final String ACTION_GOAL = "hs.passivemonitoring.GOAL";
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveGoal> CREATOR;
+    field public static final androidx.health.services.client.data.PassiveGoal.Companion Companion;
+  }
+
+  public static final class PassiveGoal.Companion {
+    method public androidx.health.services.client.data.PassiveGoal? fromIntent(android.content.Intent intent);
+  }
+
+  public enum PassiveGoal.TriggerType {
+    method public static final androidx.health.services.client.data.PassiveGoal.TriggerType? fromId(int id);
+    method public final int getId();
+    property public final int id;
+    enum_constant public static final androidx.health.services.client.data.PassiveGoal.TriggerType ONCE;
+    enum_constant public static final androidx.health.services.client.data.PassiveGoal.TriggerType REPEATED;
+    field public static final androidx.health.services.client.data.PassiveGoal.TriggerType.Companion Companion;
+  }
+
+  public static final class PassiveGoal.TriggerType.Companion {
+    method public androidx.health.services.client.data.PassiveGoal.TriggerType? fromId(int id);
+  }
+
+  public final class PassiveMonitoringCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities> {
     ctor public PassiveMonitoringCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring, java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public java.util.Set<androidx.health.services.client.data.DataType> component2();
-    method public androidx.health.services.client.data.PassiveMonitoringCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring, java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesEvents();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesPassiveMonitoring();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents;
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringCapabilities> CREATOR;
@@ -698,19 +757,42 @@
   public static final class PassiveMonitoringCapabilities.Companion {
   }
 
-  public final class PassiveMonitoringUpdate implements android.os.Parcelable {
+  public final class PassiveMonitoringConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringConfig> {
+    ctor protected PassiveMonitoringConfig(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.content.ComponentName componentName, boolean shouldIncludeUserActivityState);
+    method public static androidx.health.services.client.data.PassiveMonitoringConfig.Builder builder();
+    method public android.content.ComponentName getComponentName();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringConfig getProto();
+    method public boolean getShouldIncludeUserActivityState();
+    property public final android.content.ComponentName componentName;
+    property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
+    property public final boolean shouldIncludeUserActivityState;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringConfig> CREATOR;
+    field public static final androidx.health.services.client.data.PassiveMonitoringConfig.Companion Companion;
+  }
+
+  public static final class PassiveMonitoringConfig.Builder {
+    ctor public PassiveMonitoringConfig.Builder();
+    method public androidx.health.services.client.data.PassiveMonitoringConfig build();
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setComponentName(android.content.ComponentName componentName);
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setShouldIncludeUserActivityState(boolean shouldIncludeUserActivityState);
+  }
+
+  public static final class PassiveMonitoringConfig.Companion {
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder builder();
+  }
+
+  public final class PassiveMonitoringUpdate extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate> {
     ctor public PassiveMonitoringUpdate(java.util.List<androidx.health.services.client.data.DataPoint> dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
-    method public java.util.List<androidx.health.services.client.data.DataPoint> component1();
-    method public java.util.List<androidx.health.services.client.data.UserActivityInfo> component2();
-    method public androidx.health.services.client.data.PassiveMonitoringUpdate copy(java.util.List<androidx.health.services.client.data.DataPoint> dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
-    method public int describeContents();
     method public static androidx.health.services.client.data.PassiveMonitoringUpdate? fromIntent(android.content.Intent intent);
     method public java.util.List<androidx.health.services.client.data.DataPoint> getDataPoints();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate getProto();
     method public java.util.List<androidx.health.services.client.data.UserActivityInfo> getUserActivityInfoUpdates();
     method public void putToIntent(android.content.Intent intent);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.List<androidx.health.services.client.data.DataPoint> dataPoints;
     property public final java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates;
+    field public static final String ACTION_DATA = "hs.passivemonitoring.DATA";
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringUpdate> CREATOR;
     field public static final androidx.health.services.client.data.PassiveMonitoringUpdate.Companion Companion;
   }
@@ -719,23 +801,53 @@
     method public androidx.health.services.client.data.PassiveMonitoringUpdate? fromIntent(android.content.Intent intent);
   }
 
-  public final class UserActivityInfo implements android.os.Parcelable {
-    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseType? exerciseType, java.time.Instant stateChangeTime);
-    method public androidx.health.services.client.data.UserActivityState component1();
-    method public androidx.health.services.client.data.ExerciseType? component2();
-    method public java.time.Instant component3();
-    method public androidx.health.services.client.data.UserActivityInfo copy(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseType? exerciseType, java.time.Instant stateChangeTime);
-    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseType exerciseType, java.time.Instant stateChangeTime);
+  public abstract class ProtoParcelable<T extends com.google.protobuf.MessageLite> implements android.os.Parcelable {
+    ctor public ProtoParcelable();
+    method public int describeContents();
+    method protected final byte[] getBytes();
+    method public abstract T getProto();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property protected final byte[] bytes;
+    property public abstract T proto;
+    field public static final androidx.health.services.client.data.ProtoParcelable.Companion Companion;
+  }
+
+  public static final class ProtoParcelable.Companion {
+  }
+
+  public final class StatisticalDataPoint extends androidx.health.services.client.data.AggregateDataPoint {
+    ctor public StatisticalDataPoint(java.time.Instant startTime, java.time.Instant endTime, androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value min, androidx.health.services.client.data.Value max, androidx.health.services.client.data.Value average);
+    method public androidx.health.services.client.data.Value getAverage();
+    method public androidx.health.services.client.data.DataType getDataType();
+    method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.data.Value getMax();
+    method public androidx.health.services.client.data.Value getMin();
+    method public androidx.health.services.client.proto.DataProto.AggregateDataPoint getProto();
+    method public java.time.Instant getStartTime();
+    property public final androidx.health.services.client.data.Value average;
+    property public final androidx.health.services.client.data.DataType dataType;
+    property public final java.time.Instant endTime;
+    property public final androidx.health.services.client.data.Value max;
+    property public final androidx.health.services.client.data.Value min;
+    property public final java.time.Instant startTime;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.StatisticalDataPoint> CREATOR;
+    field public static final androidx.health.services.client.data.StatisticalDataPoint.Companion Companion;
+  }
+
+  public static final class StatisticalDataPoint.Companion {
+  }
+
+  public final class UserActivityInfo extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.UserActivityInfo> {
+    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseInfo? exerciseInfo, java.time.Instant stateChangeTime);
+    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
-    method public static androidx.health.services.client.data.UserActivityInfo createInactiveState(java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
-    method public int describeContents();
-    method public androidx.health.services.client.data.ExerciseType? getExerciseType();
+    method public androidx.health.services.client.data.ExerciseInfo? getExerciseInfo();
+    method public androidx.health.services.client.proto.DataProto.UserActivityInfo getProto();
     method public java.time.Instant getStateChangeTime();
     method public androidx.health.services.client.data.UserActivityState getUserActivityState();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final androidx.health.services.client.data.ExerciseType? exerciseType;
+    property public final androidx.health.services.client.data.ExerciseInfo? exerciseInfo;
     property public final java.time.Instant stateChangeTime;
     property public final androidx.health.services.client.data.UserActivityState userActivityState;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.UserActivityInfo> CREATOR;
@@ -743,9 +855,8 @@
   }
 
   public static final class UserActivityInfo.Companion {
-    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseType exerciseType, java.time.Instant stateChangeTime);
+    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
-    method public androidx.health.services.client.data.UserActivityInfo createInactiveState(java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
   }
@@ -756,7 +867,6 @@
     property public final int id;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_ASLEEP;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_EXERCISE;
-    enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_INACTIVE;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_PASSIVE;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_UNKNOWN;
     field public static final androidx.health.services.client.data.UserActivityState.Companion Companion;
@@ -766,19 +876,14 @@
     method public androidx.health.services.client.data.UserActivityState? fromId(int id);
   }
 
-  public final class Value implements android.os.Parcelable {
+  public final class Value extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.Value> {
     method public boolean asBoolean();
     method public double asDouble();
     method public double[] asDoubleArray();
     method public long asLong();
-    method public int component1();
-    method public java.util.List<java.lang.Double> component2();
-    method public long component3();
-    method public androidx.health.services.client.data.Value copy(int format, java.util.List<java.lang.Double> doubleList, long longValue);
-    method public int describeContents();
-    method public java.util.List<java.lang.Double> getDoubleList();
+    method public static int compare(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
     method public int getFormat();
-    method public long getLongValue();
+    method public androidx.health.services.client.proto.DataProto.Value getProto();
     method public boolean isBoolean();
     method public boolean isDouble();
     method public boolean isDoubleArray();
@@ -788,14 +893,11 @@
     method public static androidx.health.services.client.data.Value ofDoubleArray(double... doubleArray);
     method public static androidx.health.services.client.data.Value ofLong(long value);
     method public static androidx.health.services.client.data.Value sum(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final java.util.List<java.lang.Double> doubleList;
     property public final int format;
     property public final boolean isBoolean;
     property public final boolean isDouble;
     property public final boolean isDoubleArray;
     property public final boolean isLong;
-    property public final long longValue;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.Value> CREATOR;
     field public static final androidx.health.services.client.data.Value.Companion Companion;
     field public static final int FORMAT_BOOLEAN = 4; // 0x4
@@ -805,6 +907,7 @@
   }
 
   public static final class Value.Companion {
+    method public int compare(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
     method public androidx.health.services.client.data.Value ofBoolean(boolean value);
     method public androidx.health.services.client.data.Value ofDouble(double value);
     method public androidx.health.services.client.data.Value ofDoubleArray(double... doubleArray);
@@ -812,40 +915,27 @@
     method public androidx.health.services.client.data.Value sum(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
   }
 
-}
-
-package androidx.health.services.client.data.event {
-
-  public final class Event implements android.os.Parcelable {
-    ctor public Event(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.event.Event.TriggerType triggerType);
-    method public androidx.health.services.client.data.DataTypeCondition component1();
-    method public androidx.health.services.client.data.event.Event.TriggerType component2();
-    method public androidx.health.services.client.data.event.Event copy(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.event.Event.TriggerType triggerType);
-    method public int describeContents();
-    method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
-    method public androidx.health.services.client.data.event.Event.TriggerType getTriggerType();
-    method public boolean isTriggered(androidx.health.services.client.data.DataPoint dataPoint);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
-    property public final androidx.health.services.client.data.event.Event.TriggerType triggerType;
-    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.event.Event> CREATOR;
-    field public static final androidx.health.services.client.data.event.Event.Companion Companion;
+  public final class WarmUpConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.WarmUpConfig> {
+    ctor protected WarmUpConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public static androidx.health.services.client.data.WarmUpConfig.Builder builder();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
+    method public androidx.health.services.client.data.ExerciseType getExerciseType();
+    method public androidx.health.services.client.proto.DataProto.WarmUpConfig getProto();
+    property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
+    property public final androidx.health.services.client.data.ExerciseType exerciseType;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.WarmUpConfig> CREATOR;
+    field public static final androidx.health.services.client.data.WarmUpConfig.Companion Companion;
   }
 
-  public static final class Event.Companion {
+  public static final class WarmUpConfig.Builder {
+    ctor public WarmUpConfig.Builder();
+    method public androidx.health.services.client.data.WarmUpConfig build();
+    method public androidx.health.services.client.data.WarmUpConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public androidx.health.services.client.data.WarmUpConfig.Builder setExerciseType(androidx.health.services.client.data.ExerciseType exerciseType);
   }
 
-  public enum Event.TriggerType {
-    method public static final androidx.health.services.client.data.event.Event.TriggerType? fromId(int id);
-    method public final int getId();
-    property public final int id;
-    enum_constant public static final androidx.health.services.client.data.event.Event.TriggerType ONCE;
-    enum_constant public static final androidx.health.services.client.data.event.Event.TriggerType REPEATED;
-    field public static final androidx.health.services.client.data.event.Event.TriggerType.Companion Companion;
-  }
-
-  public static final class Event.TriggerType.Companion {
-    method public androidx.health.services.client.data.event.Event.TriggerType? fromId(int id);
+  public static final class WarmUpConfig.Companion {
+    method public androidx.health.services.client.data.WarmUpConfig.Builder builder();
   }
 
 }
diff --git a/health/health-services-client/api/public_plus_experimental_current.txt b/health/health-services-client/api/public_plus_experimental_current.txt
index fa85cf7..edfe8a1 100644
--- a/health/health-services-client/api/public_plus_experimental_current.txt
+++ b/health/health-services-client/api/public_plus_experimental_current.txt
@@ -5,11 +5,14 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> addGoalToActiveExercise(androidx.health.services.client.data.ExerciseGoal exerciseGoal);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> endExercise();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flushExercise();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseCapabilities> getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseInfo> getCurrentExerciseInfo();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> markLap();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> overrideAutoPauseAndResumeForActiveExercise(boolean enabled);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> pauseExercise();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> prepareExercise(androidx.health.services.client.data.WarmUpConfig configuration);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> removeGoalFromActiveExercise(androidx.health.services.client.data.ExerciseGoal exerciseGoal);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> resumeExercise();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener, java.util.concurrent.Executor executor);
@@ -19,6 +22,7 @@
   }
 
   public interface ExerciseUpdateListener {
+    method public void onAvailabilityChanged(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Availability availability);
     method public void onExerciseUpdate(androidx.health.services.client.data.ExerciseUpdate update);
     method public void onLapSummary(androidx.health.services.client.data.ExerciseLapSummary lapSummary);
   }
@@ -55,12 +59,13 @@
   }
 
   public interface PassiveMonitoringClient {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flush();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> getCapabilities();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.app.PendingIntent callbackIntent);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.app.PendingIntent callbackIntent, androidx.health.services.client.PassiveMonitoringCallback callback);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerEventCallback(androidx.health.services.client.data.event.Event event, android.app.PendingIntent callbackIntent);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig configuration);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig configuration, androidx.health.services.client.PassiveMonitoringCallback callback);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerPassiveGoalCallback(androidx.health.services.client.data.PassiveGoal passiveGoal, android.content.ComponentName componentName);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterDataCallback();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterEventCallback(androidx.health.services.client.data.event.Event event);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterPassiveGoalCallback(androidx.health.services.client.data.PassiveGoal passiveGoal);
     property public abstract com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> capabilities;
   }
 
@@ -68,13 +73,10 @@
 
 package androidx.health.services.client.data {
 
-  public final class AchievedExerciseGoal implements android.os.Parcelable {
+  public final class AchievedExerciseGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.AchievedExerciseGoal> {
     ctor public AchievedExerciseGoal(androidx.health.services.client.data.ExerciseGoal goal);
-    method public androidx.health.services.client.data.ExerciseGoal component1();
-    method public androidx.health.services.client.data.AchievedExerciseGoal copy(androidx.health.services.client.data.ExerciseGoal goal);
-    method public int describeContents();
     method public androidx.health.services.client.data.ExerciseGoal getGoal();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.AchievedExerciseGoal getProto();
     property public final androidx.health.services.client.data.ExerciseGoal goal;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.AchievedExerciseGoal> CREATOR;
     field public static final androidx.health.services.client.data.AchievedExerciseGoal.Companion Companion;
@@ -83,19 +85,30 @@
   public static final class AchievedExerciseGoal.Companion {
   }
 
-  public enum Availability {
-    method public static final androidx.health.services.client.data.Availability? fromId(int id);
-    method public final int getId();
-    property public final int id;
-    enum_constant public static final androidx.health.services.client.data.Availability ACQUIRING;
-    enum_constant public static final androidx.health.services.client.data.Availability AVAILABLE;
-    enum_constant public static final androidx.health.services.client.data.Availability UNAVAILABLE;
-    enum_constant public static final androidx.health.services.client.data.Availability UNKNOWN;
+  public abstract class AggregateDataPoint extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.AggregateDataPoint> {
+    ctor public AggregateDataPoint();
+  }
+
+  @Keep public final class AggregateDataPoints {
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateAbsoluteElevation(double minAbsElevation, double maxAbsElevation, double avgAbsElevation, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateCalories(double kcalories, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateDistance(double distance, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateElevationGain(double gainMeters, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateHeartRate(double minBpm, double maxBpm, double avgBpm, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregatePace(double minMillisPerKm, double maxMillisPerKm, double avgMillisPerKm, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateSpeed(double minMetersPerSecond, double maxMetersPerSecond, double avgMetersPerSecond, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateSteps(long steps, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateSwimmingStrokes(long swimmingStrokes, java.time.Instant startTime, java.time.Instant endTime);
+    field public static final androidx.health.services.client.data.AggregateDataPoints INSTANCE;
+  }
+
+  public interface Availability {
+    method public int getId();
+    property public abstract int id;
     field public static final androidx.health.services.client.data.Availability.Companion Companion;
   }
 
   public static final class Availability.Companion {
-    method public androidx.health.services.client.data.Availability? fromId(int id);
   }
 
   public enum ComparisonType {
@@ -113,26 +126,41 @@
     method public androidx.health.services.client.data.ComparisonType? fromId(int id);
   }
 
-  public final class DataPoint implements android.os.Parcelable {
-    method public androidx.health.services.client.data.DataType component1();
-    method public androidx.health.services.client.data.Value component2();
-    method public java.time.Duration component3();
-    method public java.time.Duration component4();
-    method public android.os.Bundle component5();
-    method public androidx.health.services.client.data.DataPoint copy(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, android.os.Bundle metadata);
+  public final class CumulativeDataPoint extends androidx.health.services.client.data.AggregateDataPoint {
+    ctor public CumulativeDataPoint(java.time.Instant startTime, java.time.Instant endTime, androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value total);
+    method public androidx.health.services.client.data.DataType getDataType();
+    method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.proto.DataProto.AggregateDataPoint getProto();
+    method public java.time.Instant getStartTime();
+    method public androidx.health.services.client.data.Value getTotal();
+    property public final androidx.health.services.client.data.DataType dataType;
+    property public final java.time.Instant endTime;
+    property public final java.time.Instant startTime;
+    property public final androidx.health.services.client.data.Value total;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.CumulativeDataPoint> CREATOR;
+    field public static final androidx.health.services.client.data.CumulativeDataPoint.Companion Companion;
+  }
+
+  public static final class CumulativeDataPoint.Companion {
+  }
+
+  public final class DataPoint extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataPoint> {
+    method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata);
     method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata);
     method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot);
-    method public int describeContents();
+    method public androidx.health.services.client.data.DataPointAccuracy? getAccuracy();
     method public androidx.health.services.client.data.DataType getDataType();
     method public java.time.Duration getEndDurationFromBoot();
     method public java.time.Instant getEndInstant(java.time.Instant bootInstant);
     method public android.os.Bundle getMetadata();
+    method public androidx.health.services.client.proto.DataProto.DataPoint getProto();
     method public java.time.Duration getStartDurationFromBoot();
     method public java.time.Instant getStartInstant(java.time.Instant bootInstant);
     method public androidx.health.services.client.data.Value getValue();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final androidx.health.services.client.data.DataPointAccuracy? accuracy;
     property public final androidx.health.services.client.data.DataType dataType;
     property public final java.time.Duration endDurationFromBoot;
     property public final android.os.Bundle metadata;
@@ -143,96 +171,85 @@
   }
 
   public static final class DataPoint.Companion {
+    method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata);
     method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata);
     method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot);
   }
 
+  public abstract class DataPointAccuracy extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataPointAccuracy> {
+    ctor public DataPointAccuracy();
+  }
+
   @Keep public final class DataPoints {
-    method public static androidx.health.services.client.data.DataPoint aggregateCalories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateDistance(double distance, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateSteps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateSwimmingStrokes(long swimmingStrokes, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint altitude(double meters, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint averagePace(double millisPerKm, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint averageSpeed(double metersPerSecond, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint absoluteElevation(double meters, java.time.Duration durationFromBoot, optional android.os.Bundle? metadata);
+    method public static androidx.health.services.client.data.DataPoint absoluteElevation(double meters, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint calories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint calories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyCalories(double calories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyDistance(double distance, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyFloors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailySteps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint distance(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint distance(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint elevation(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint elevationGain(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
+    method public static androidx.health.services.client.data.DataPoint elevationGain(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint floors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint floors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     method @Keep public static java.util.List<androidx.health.services.client.data.DataPoint> getDataPoints(android.content.Intent intent);
     method public static boolean getPermissionsGranted(android.content.Intent intent);
+    method public static androidx.health.services.client.data.DataPoint heartRate(double bpm, java.time.Duration durationFromBoot, optional androidx.health.services.client.data.HrAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint heartRate(double bpm, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, optional double bearing, java.time.Duration durationFromBoot, optional androidx.health.services.client.data.LocationAccuracy? accuracy);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, optional double bearing, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, java.time.Duration durationFromBoot);
     method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, double altitude, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint maxSpeed(double metersPerSecond, java.time.Duration durationFromBoot);
     method public static androidx.health.services.client.data.DataPoint pace(double millisPerKm, java.time.Duration durationFromBoot);
     method public static void putDataPoints(android.content.Intent intent, java.util.Collection<androidx.health.services.client.data.DataPoint> dataPoints);
     method public static void putPermissionsGranted(android.content.Intent intent, boolean granted);
+    method public static androidx.health.services.client.data.DataPoint speed(double metersPerSecond, java.time.Duration durationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint speed(double metersPerSecond, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint spo2(double percent, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint steps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint steps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     method public static androidx.health.services.client.data.DataPoint stepsPerMinute(long stepsPerMinute, java.time.Duration startDurationFromBoot);
     method public static androidx.health.services.client.data.DataPoint swimmingStrokes(long strokes, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     field public static final androidx.health.services.client.data.DataPoints INSTANCE;
     field public static final int LOCATION_DATA_POINT_ALTITUDE_INDEX = 2; // 0x2
+    field public static final int LOCATION_DATA_POINT_BEARING_INDEX = 3; // 0x3
     field public static final int LOCATION_DATA_POINT_LATITUDE_INDEX = 0; // 0x0
     field public static final int LOCATION_DATA_POINT_LONGITUDE_INDEX = 1; // 0x1
   }
 
-  public final class DataType implements android.os.Parcelable {
+  public final class DataType extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataType> {
     ctor public DataType(String name, androidx.health.services.client.data.DataType.TimeType timeType, int format);
-    method public String component1();
-    method public androidx.health.services.client.data.DataType.TimeType component2();
-    method public int component3();
-    method public androidx.health.services.client.data.DataType copy(String name, androidx.health.services.client.data.DataType.TimeType timeType, int format);
-    method public int describeContents();
     method public int getFormat();
     method public String getName();
+    method public androidx.health.services.client.proto.DataProto.DataType getProto();
     method public androidx.health.services.client.data.DataType.TimeType getTimeType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final int format;
     property public final String name;
     property public final androidx.health.services.client.data.DataType.TimeType timeType;
     field public static final androidx.health.services.client.data.DataType ABSOLUTE_ELEVATION;
     field public static final androidx.health.services.client.data.DataType ACTIVE_EXERCISE_DURATION;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_CALORIES_EXPENDED;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DECLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DECLINE_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_ELEVATION;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLAT_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLAT_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLOORS;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_INCLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_INCLINE_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_RUNNING_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_SWIMMING_STROKE_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_WALKING_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType ALTITUDE;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_HEART_RATE_BPM;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_PACE;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_SPEED;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.DataType> CREATOR;
     field public static final androidx.health.services.client.data.DataType.Companion Companion;
+    field public static final androidx.health.services.client.data.DataType DAILY_CALORIES;
+    field public static final androidx.health.services.client.data.DataType DAILY_DISTANCE;
+    field public static final androidx.health.services.client.data.DataType DAILY_FLOORS;
+    field public static final androidx.health.services.client.data.DataType DAILY_STEPS;
     field public static final androidx.health.services.client.data.DataType DECLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType DECLINE_TIME;
+    field public static final androidx.health.services.client.data.DataType DECLINE_DURATION;
     field public static final androidx.health.services.client.data.DataType DISTANCE;
-    field public static final androidx.health.services.client.data.DataType ELEVATION;
-    field public static final androidx.health.services.client.data.DataType FLAT_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType FLAT_TIME;
+    field public static final androidx.health.services.client.data.DataType ELEVATION_GAIN;
+    field public static final androidx.health.services.client.data.DataType FLAT_GROUND_DISTANCE;
+    field public static final androidx.health.services.client.data.DataType FLAT_GROUND_DURATION;
     field public static final androidx.health.services.client.data.DataType FLOORS;
     field public static final androidx.health.services.client.data.DataType HEART_RATE_BPM;
     field public static final androidx.health.services.client.data.DataType INCLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType INCLINE_TIME;
+    field public static final androidx.health.services.client.data.DataType INCLINE_DURATION;
     field public static final androidx.health.services.client.data.DataType LOCATION;
-    field public static final androidx.health.services.client.data.DataType MAX_ALTITUDE;
-    field public static final androidx.health.services.client.data.DataType MAX_HEART_RATE_BPM;
-    field public static final androidx.health.services.client.data.DataType MAX_PACE;
-    field public static final androidx.health.services.client.data.DataType MAX_SPEED;
-    field public static final androidx.health.services.client.data.DataType MIN_ALTITUDE;
     field public static final androidx.health.services.client.data.DataType PACE;
     field public static final androidx.health.services.client.data.DataType REP_COUNT;
     field public static final androidx.health.services.client.data.DataType RESTING_EXERCISE_DURATION;
@@ -257,19 +274,29 @@
     enum_constant public static final androidx.health.services.client.data.DataType.TimeType SAMPLE;
   }
 
-  public final class DataTypeCondition implements android.os.Parcelable {
+  public enum DataTypeAvailability implements androidx.health.services.client.data.Availability {
+    method public static final androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
+    method public int getId();
+    property public int id;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability ACQUIRING;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability AVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability UNAVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability UNKNOWN;
+    field public static final androidx.health.services.client.data.DataTypeAvailability.Companion Companion;
+  }
+
+  public static final class DataTypeAvailability.Companion {
+    method public androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
+  }
+
+  public final class DataTypeCondition extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataTypeCondition> {
     ctor public DataTypeCondition(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value threshold, androidx.health.services.client.data.ComparisonType comparisonType);
-    method public androidx.health.services.client.data.DataType component1();
-    method public androidx.health.services.client.data.Value component2();
-    method public androidx.health.services.client.data.ComparisonType component3();
-    method public androidx.health.services.client.data.DataTypeCondition copy(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value threshold, androidx.health.services.client.data.ComparisonType comparisonType);
-    method public int describeContents();
     method public androidx.health.services.client.data.ComparisonType getComparisonType();
     method public androidx.health.services.client.data.DataType getDataType();
+    method public androidx.health.services.client.proto.DataProto.DataTypeCondition getProto();
     method public androidx.health.services.client.data.Value getThreshold();
     method public boolean isSatisfied(androidx.health.services.client.data.DataPoint dataPoint);
     method public boolean isThresholdSatisfied(androidx.health.services.client.data.Value value);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final androidx.health.services.client.data.ComparisonType comparisonType;
     property public final androidx.health.services.client.data.DataType dataType;
     property public final androidx.health.services.client.data.Value threshold;
@@ -281,30 +308,18 @@
   }
 
   public final class DataTypes {
-    method public static androidx.health.services.client.data.DataType? getAggregateTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static java.util.Set<androidx.health.services.client.data.DataType> getAggregatedDataTypesFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getAverageTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getMaxTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromAggregateType(androidx.health.services.client.data.DataType aggregateType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromAverageType(androidx.health.services.client.data.DataType averageType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromMaxType(androidx.health.services.client.data.DataType maxType);
-    method public static boolean isAggregateDataType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isRawType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isStatisticalAverageDataType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isStatisticalMaxDataType(androidx.health.services.client.data.DataType dataType);
+    method public static boolean isCumulativeDataType(androidx.health.services.client.data.DataType dataType);
+    method public static boolean isStatisticalDataType(androidx.health.services.client.data.DataType dataType);
     field public static final androidx.health.services.client.data.DataTypes INSTANCE;
   }
 
-  public final class ExerciseCapabilities implements android.os.Parcelable {
+  public final class ExerciseCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseCapabilities> {
     ctor public ExerciseCapabilities(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
-    method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> component1();
-    method public androidx.health.services.client.data.ExerciseCapabilities copy(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
-    method public int describeContents();
     method public java.util.Set<androidx.health.services.client.data.ExerciseType> getAutoPauseAndResumeEnabledExercises();
     method public androidx.health.services.client.data.ExerciseTypeCapabilities getExerciseTypeCapabilities(androidx.health.services.client.data.ExerciseType exercise);
+    method public androidx.health.services.client.proto.DataProto.ExerciseCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.ExerciseType> getSupportedExerciseTypes();
     method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> getTypeToCapabilities();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.ExerciseType> autoPauseAndResumeEnabledExercises;
     property public final java.util.Set<androidx.health.services.client.data.ExerciseType> supportedExerciseTypes;
     property public final java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities;
@@ -315,27 +330,24 @@
   public static final class ExerciseCapabilities.Companion {
   }
 
-  public final class ExerciseConfig implements android.os.Parcelable {
-    ctor protected ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, boolean autoPauseAndResume, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
+  public final class ExerciseConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseConfig> {
+    ctor protected ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, java.util.Set<androidx.health.services.client.data.DataType> aggregateDataTypes, boolean shouldEnableAutoPauseAndResume, boolean shouldEnableGps, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
     method public static androidx.health.services.client.data.ExerciseConfig.Builder builder();
-    method public androidx.health.services.client.data.ExerciseType component1();
-    method public java.util.Set<androidx.health.services.client.data.DataType> component2();
-    method public boolean component3();
-    method public java.util.List<androidx.health.services.client.data.ExerciseGoal> component4();
-    method public android.os.Bundle component5();
-    method public androidx.health.services.client.data.ExerciseConfig copy(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, boolean autoPauseAndResume, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
-    method public int describeContents();
-    method public boolean getAutoPauseAndResume();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getAggregateDataTypes();
     method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
     method public java.util.List<androidx.health.services.client.data.ExerciseGoal> getExerciseGoals();
     method public android.os.Bundle getExerciseParams();
     method public androidx.health.services.client.data.ExerciseType getExerciseType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final boolean autoPauseAndResume;
+    method public androidx.health.services.client.proto.DataProto.ExerciseConfig getProto();
+    method public boolean getShouldEnableAutoPauseAndResume();
+    method public boolean getShouldEnableGps();
+    property public final java.util.Set<androidx.health.services.client.data.DataType> aggregateDataTypes;
     property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
     property public final java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals;
     property public final android.os.Bundle exerciseParams;
     property public final androidx.health.services.client.data.ExerciseType exerciseType;
+    property public final boolean shouldEnableAutoPauseAndResume;
+    property public final boolean shouldEnableGps;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseConfig> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseConfig.Companion Companion;
   }
@@ -343,31 +355,27 @@
   public static final class ExerciseConfig.Builder {
     ctor public ExerciseConfig.Builder();
     method public androidx.health.services.client.data.ExerciseConfig build();
-    method public androidx.health.services.client.data.ExerciseConfig.Builder setAutoPauseAndResume(boolean autoPauseAndResume);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setAggregateDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseGoals(java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseParams(android.os.Bundle exerciseParams);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseType(androidx.health.services.client.data.ExerciseType exerciseType);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setShouldEnableAutoPauseAndResume(boolean shouldEnableAutoPauseAndResume);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setShouldEnableGps(boolean shouldEnableGps);
   }
 
   public static final class ExerciseConfig.Companion {
     method public androidx.health.services.client.data.ExerciseConfig.Builder builder();
   }
 
-  public final class ExerciseGoal implements android.os.Parcelable {
-    ctor protected ExerciseGoal(androidx.health.services.client.data.ExerciseGoalType exerciseGoalType, androidx.health.services.client.data.DataTypeCondition dataTypeCondition, optional androidx.health.services.client.data.Value? period);
-    method public androidx.health.services.client.data.ExerciseGoalType component1();
-    method public androidx.health.services.client.data.DataTypeCondition component2();
-    method public androidx.health.services.client.data.Value? component3();
-    method public androidx.health.services.client.data.ExerciseGoal copy(androidx.health.services.client.data.ExerciseGoalType exerciseGoalType, androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.Value? period);
+  public final class ExerciseGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseGoal> {
     method public static androidx.health.services.client.data.ExerciseGoal createMilestone(androidx.health.services.client.data.DataTypeCondition condition, androidx.health.services.client.data.Value period);
     method public static androidx.health.services.client.data.ExerciseGoal createMilestoneGoalWithUpdatedThreshold(androidx.health.services.client.data.ExerciseGoal goal, androidx.health.services.client.data.Value newThreshold);
     method public static androidx.health.services.client.data.ExerciseGoal createOneTimeGoal(androidx.health.services.client.data.DataTypeCondition condition);
-    method public int describeContents();
     method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
     method public androidx.health.services.client.data.ExerciseGoalType getExerciseGoalType();
     method public androidx.health.services.client.data.Value? getPeriod();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.ExerciseGoal getProto();
     property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
     property public final androidx.health.services.client.data.ExerciseGoalType exerciseGoalType;
     property public final androidx.health.services.client.data.Value? period;
@@ -394,15 +402,11 @@
     method public androidx.health.services.client.data.ExerciseGoalType? fromId(int id);
   }
 
-  public final class ExerciseInfo implements android.os.Parcelable {
+  public final class ExerciseInfo extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseInfo> {
     ctor public ExerciseInfo(androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
-    method public androidx.health.services.client.data.ExerciseTrackedStatus component1();
-    method public androidx.health.services.client.data.ExerciseType component2();
-    method public androidx.health.services.client.data.ExerciseInfo copy(androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
-    method public int describeContents();
     method public androidx.health.services.client.data.ExerciseTrackedStatus getExerciseTrackedStatus();
     method public androidx.health.services.client.data.ExerciseType getExerciseType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.ExerciseInfo getProto();
     property public final androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus;
     property public final androidx.health.services.client.data.ExerciseType exerciseType;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseInfo> CREATOR;
@@ -412,25 +416,18 @@
   public static final class ExerciseInfo.Companion {
   }
 
-  public final class ExerciseLapSummary implements android.os.Parcelable {
-    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics);
-    method public int component1();
-    method public java.time.Instant component2();
-    method public java.time.Instant component3();
-    method public java.time.Duration component4();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> component5();
-    method public androidx.health.services.client.data.ExerciseLapSummary copy(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics);
-    method public int describeContents();
+  public final class ExerciseLapSummary extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseLapSummary> {
+    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> lapMetrics);
     method public java.time.Duration getActiveDuration();
     method public java.time.Instant getEndTime();
     method public int getLapCount();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> getLapMetrics();
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getLapMetrics();
+    method public androidx.health.services.client.proto.DataProto.ExerciseLapSummary getProto();
     method public java.time.Instant getStartTime();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.time.Duration activeDuration;
     property public final java.time.Instant endTime;
     property public final int lapCount;
-    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> lapMetrics;
     property public final java.time.Instant startTime;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseLapSummary> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseLapSummary.Companion Companion;
@@ -443,18 +440,23 @@
     method public static final androidx.health.services.client.data.ExerciseState? fromId(int id);
     method public final int getId();
     method public final boolean isEnded();
+    method public final boolean isEnding();
     method public final boolean isPaused();
     method public final boolean isResuming();
     property public final int id;
     property public final boolean isEnded;
+    property public final boolean isEnding;
     property public final boolean isPaused;
     property public final boolean isResuming;
     enum_constant public static final androidx.health.services.client.data.ExerciseState ACTIVE;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_RESUMING;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState PREPARING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     enum_constant public static final androidx.health.services.client.data.ExerciseState TERMINATING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
@@ -517,10 +519,11 @@
     enum_constant public static final androidx.health.services.client.data.ExerciseType FENCING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AMERICAN;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AUSTRALIAN;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType FORWARD_TWIST;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FRISBEE_DISC;
     enum_constant public static final androidx.health.services.client.data.ExerciseType GOLF;
     enum_constant public static final androidx.health.services.client.data.ExerciseType GUIDED_BREATHING;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType GYNMASTICS;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType GYMNASTICS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HANDBALL;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HIGH_INTENSITY_INTERVAL_TRAINING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HIKING;
@@ -564,12 +567,12 @@
     enum_constant public static final androidx.health.services.client.data.ExerciseType TABLE_TENNIS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType TENNIS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType UNKNOWN;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType UPPER_TWIST;
     enum_constant public static final androidx.health.services.client.data.ExerciseType VOLLEYBALL;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WALKING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WATER_POLO;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WEIGHTLIFTING;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT_INDOOR;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT_OUTDOOR;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT;
     enum_constant public static final androidx.health.services.client.data.ExerciseType YOGA;
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
   }
@@ -578,21 +581,14 @@
     method public androidx.health.services.client.data.ExerciseType fromId(int id);
   }
 
-  public final class ExerciseTypeCapabilities implements android.os.Parcelable {
+  public final class ExerciseTypeCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities> {
     ctor public ExerciseTypeCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume, boolean supportsLaps);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> component2();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> component3();
-    method public boolean component4();
-    method public boolean component5();
-    method public androidx.health.services.client.data.ExerciseTypeCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume, boolean supportsLaps);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypes();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedGoals();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedMilestones();
     method public boolean getSupportsAutoPauseAndResume();
     method public boolean getSupportsLaps();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedGoals;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedMilestones;
@@ -605,31 +601,24 @@
   public static final class ExerciseTypeCapabilities.Companion {
   }
 
-  public final class ExerciseUpdate implements android.os.Parcelable {
-    ctor public ExerciseUpdate(androidx.health.services.client.data.ExerciseState state, java.time.Instant startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig exerciseConfig);
-    method public androidx.health.services.client.data.ExerciseState component1();
-    method public java.time.Instant component2();
-    method public java.time.Duration component3();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> component4();
-    method public java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> component5();
-    method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> component6();
-    method public androidx.health.services.client.data.ExerciseConfig component7();
-    method public androidx.health.services.client.data.ExerciseUpdate copy(androidx.health.services.client.data.ExerciseState state, java.time.Instant startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig exerciseConfig);
-    method public int describeContents();
+  public final class ExerciseUpdate extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseUpdate> {
+    ctor public ExerciseUpdate(androidx.health.services.client.data.ExerciseState state, java.time.Instant? startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> latestAggregateMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig? exerciseConfig);
     method public java.time.Duration getActiveDuration();
-    method public androidx.health.services.client.data.ExerciseConfig getExerciseConfig();
+    method public androidx.health.services.client.data.ExerciseConfig? getExerciseConfig();
     method public java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> getLatestAchievedGoals();
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getLatestAggregateMetrics();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> getLatestMetrics();
     method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> getLatestMilestoneMarkerSummaries();
-    method public java.time.Instant getStartTime();
+    method public androidx.health.services.client.proto.DataProto.ExerciseUpdate getProto();
+    method public java.time.Instant? getStartTime();
     method public androidx.health.services.client.data.ExerciseState getState();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.time.Duration activeDuration;
-    property public final androidx.health.services.client.data.ExerciseConfig exerciseConfig;
+    property public final androidx.health.services.client.data.ExerciseConfig? exerciseConfig;
     property public final java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> latestAggregateMetrics;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics;
     property public final java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries;
-    property public final java.time.Instant startTime;
+    property public final java.time.Instant? startTime;
     property public final androidx.health.services.client.data.ExerciseState state;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseUpdate> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseUpdate.Companion Companion;
@@ -638,13 +627,62 @@
   public static final class ExerciseUpdate.Companion {
   }
 
-  public final class MeasureCapabilities implements android.os.Parcelable {
+  public final class HrAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
+    ctor public HrAccuracy(androidx.health.services.client.data.HrAccuracy.SensorStatus sensorStatus);
+    method public androidx.health.services.client.proto.DataProto.DataPointAccuracy getProto();
+    method public androidx.health.services.client.data.HrAccuracy.SensorStatus getSensorStatus();
+    property public final androidx.health.services.client.data.HrAccuracy.SensorStatus sensorStatus;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.HrAccuracy> CREATOR;
+    field public static final androidx.health.services.client.data.HrAccuracy.Companion Companion;
+  }
+
+  public static final class HrAccuracy.Companion {
+  }
+
+  public enum HrAccuracy.SensorStatus {
+    method public final int getId();
+    property public final int id;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_HIGH;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_LOW;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_MEDIUM;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus NO_CONTACT;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus UNKNOWN;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus UNRELIABLE;
+  }
+
+  public final class LocationAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
+    ctor public LocationAccuracy(double horizontalPositionError);
+    method public double getHorizontalPositionError();
+    method public androidx.health.services.client.proto.DataProto.DataPointAccuracy getProto();
+    property public final double horizontalPositionError;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.LocationAccuracy> CREATOR;
+    field public static final androidx.health.services.client.data.LocationAccuracy.Companion Companion;
+  }
+
+  public static final class LocationAccuracy.Companion {
+  }
+
+  public enum LocationAvailability implements androidx.health.services.client.data.Availability {
+    method public static final androidx.health.services.client.data.LocationAvailability? fromId(int id);
+    method public int getId();
+    property public int id;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_TETHERED;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_UNTETHERED;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRING;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability NO_GPS;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability UNAVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability UNKNOWN;
+    field public static final androidx.health.services.client.data.LocationAvailability.Companion Companion;
+  }
+
+  public static final class LocationAvailability.Companion {
+    method public androidx.health.services.client.data.LocationAvailability? fromId(int id);
+  }
+
+  public final class MeasureCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.MeasureCapabilities> {
     ctor public MeasureCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public androidx.health.services.client.data.MeasureCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.MeasureCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesMeasure();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.MeasureCapabilities> CREATOR;
     field public static final androidx.health.services.client.data.MeasureCapabilities.Companion Companion;
@@ -653,26 +691,19 @@
   public static final class MeasureCapabilities.Companion {
   }
 
-  public final class MilestoneMarkerSummary implements android.os.Parcelable {
-    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics);
-    method public java.time.Instant component1();
-    method public java.time.Instant component2();
-    method public java.time.Duration component3();
-    method public androidx.health.services.client.data.AchievedExerciseGoal component4();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> component5();
-    method public androidx.health.services.client.data.MilestoneMarkerSummary copy(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics);
-    method public int describeContents();
+  public final class MilestoneMarkerSummary extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary> {
+    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> summaryMetrics);
     method public androidx.health.services.client.data.AchievedExerciseGoal getAchievedGoal();
     method public java.time.Duration getActiveDuration();
     method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary getProto();
     method public java.time.Instant getStartTime();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> getSummaryMetrics();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getSummaryMetrics();
     property public final androidx.health.services.client.data.AchievedExerciseGoal achievedGoal;
     property public final java.time.Duration activeDuration;
     property public final java.time.Instant endTime;
     property public final java.time.Instant startTime;
-    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> summaryMetrics;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.MilestoneMarkerSummary> CREATOR;
     field public static final androidx.health.services.client.data.MilestoneMarkerSummary.Companion Companion;
   }
@@ -680,15 +711,43 @@
   public static final class MilestoneMarkerSummary.Companion {
   }
 
-  public final class PassiveMonitoringCapabilities implements android.os.Parcelable {
+  public final class PassiveGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveGoal> {
+    ctor public PassiveGoal(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.PassiveGoal.TriggerType triggerType);
+    method public static androidx.health.services.client.data.PassiveGoal? fromIntent(android.content.Intent intent);
+    method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
+    method public androidx.health.services.client.proto.DataProto.PassiveGoal getProto();
+    method public androidx.health.services.client.data.PassiveGoal.TriggerType getTriggerType();
+    method public boolean isTriggered(androidx.health.services.client.data.DataPoint dataPoint);
+    method public void putToIntent(android.content.Intent intent);
+    property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
+    property public final androidx.health.services.client.data.PassiveGoal.TriggerType triggerType;
+    field public static final String ACTION_GOAL = "hs.passivemonitoring.GOAL";
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveGoal> CREATOR;
+    field public static final androidx.health.services.client.data.PassiveGoal.Companion Companion;
+  }
+
+  public static final class PassiveGoal.Companion {
+    method public androidx.health.services.client.data.PassiveGoal? fromIntent(android.content.Intent intent);
+  }
+
+  public enum PassiveGoal.TriggerType {
+    method public static final androidx.health.services.client.data.PassiveGoal.TriggerType? fromId(int id);
+    method public final int getId();
+    property public final int id;
+    enum_constant public static final androidx.health.services.client.data.PassiveGoal.TriggerType ONCE;
+    enum_constant public static final androidx.health.services.client.data.PassiveGoal.TriggerType REPEATED;
+    field public static final androidx.health.services.client.data.PassiveGoal.TriggerType.Companion Companion;
+  }
+
+  public static final class PassiveGoal.TriggerType.Companion {
+    method public androidx.health.services.client.data.PassiveGoal.TriggerType? fromId(int id);
+  }
+
+  public final class PassiveMonitoringCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities> {
     ctor public PassiveMonitoringCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring, java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public java.util.Set<androidx.health.services.client.data.DataType> component2();
-    method public androidx.health.services.client.data.PassiveMonitoringCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring, java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesEvents();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesPassiveMonitoring();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents;
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringCapabilities> CREATOR;
@@ -698,19 +757,42 @@
   public static final class PassiveMonitoringCapabilities.Companion {
   }
 
-  public final class PassiveMonitoringUpdate implements android.os.Parcelable {
+  public final class PassiveMonitoringConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringConfig> {
+    ctor protected PassiveMonitoringConfig(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.content.ComponentName componentName, boolean shouldIncludeUserActivityState);
+    method public static androidx.health.services.client.data.PassiveMonitoringConfig.Builder builder();
+    method public android.content.ComponentName getComponentName();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringConfig getProto();
+    method public boolean getShouldIncludeUserActivityState();
+    property public final android.content.ComponentName componentName;
+    property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
+    property public final boolean shouldIncludeUserActivityState;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringConfig> CREATOR;
+    field public static final androidx.health.services.client.data.PassiveMonitoringConfig.Companion Companion;
+  }
+
+  public static final class PassiveMonitoringConfig.Builder {
+    ctor public PassiveMonitoringConfig.Builder();
+    method public androidx.health.services.client.data.PassiveMonitoringConfig build();
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setComponentName(android.content.ComponentName componentName);
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setShouldIncludeUserActivityState(boolean shouldIncludeUserActivityState);
+  }
+
+  public static final class PassiveMonitoringConfig.Companion {
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder builder();
+  }
+
+  public final class PassiveMonitoringUpdate extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate> {
     ctor public PassiveMonitoringUpdate(java.util.List<androidx.health.services.client.data.DataPoint> dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
-    method public java.util.List<androidx.health.services.client.data.DataPoint> component1();
-    method public java.util.List<androidx.health.services.client.data.UserActivityInfo> component2();
-    method public androidx.health.services.client.data.PassiveMonitoringUpdate copy(java.util.List<androidx.health.services.client.data.DataPoint> dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
-    method public int describeContents();
     method public static androidx.health.services.client.data.PassiveMonitoringUpdate? fromIntent(android.content.Intent intent);
     method public java.util.List<androidx.health.services.client.data.DataPoint> getDataPoints();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate getProto();
     method public java.util.List<androidx.health.services.client.data.UserActivityInfo> getUserActivityInfoUpdates();
     method public void putToIntent(android.content.Intent intent);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.List<androidx.health.services.client.data.DataPoint> dataPoints;
     property public final java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates;
+    field public static final String ACTION_DATA = "hs.passivemonitoring.DATA";
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringUpdate> CREATOR;
     field public static final androidx.health.services.client.data.PassiveMonitoringUpdate.Companion Companion;
   }
@@ -719,23 +801,53 @@
     method public androidx.health.services.client.data.PassiveMonitoringUpdate? fromIntent(android.content.Intent intent);
   }
 
-  public final class UserActivityInfo implements android.os.Parcelable {
-    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseType? exerciseType, java.time.Instant stateChangeTime);
-    method public androidx.health.services.client.data.UserActivityState component1();
-    method public androidx.health.services.client.data.ExerciseType? component2();
-    method public java.time.Instant component3();
-    method public androidx.health.services.client.data.UserActivityInfo copy(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseType? exerciseType, java.time.Instant stateChangeTime);
-    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseType exerciseType, java.time.Instant stateChangeTime);
+  public abstract class ProtoParcelable<T extends com.google.protobuf.MessageLite> implements android.os.Parcelable {
+    ctor public ProtoParcelable();
+    method public int describeContents();
+    method protected final byte[] getBytes();
+    method public abstract T getProto();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property protected final byte[] bytes;
+    property public abstract T proto;
+    field public static final androidx.health.services.client.data.ProtoParcelable.Companion Companion;
+  }
+
+  public static final class ProtoParcelable.Companion {
+  }
+
+  public final class StatisticalDataPoint extends androidx.health.services.client.data.AggregateDataPoint {
+    ctor public StatisticalDataPoint(java.time.Instant startTime, java.time.Instant endTime, androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value min, androidx.health.services.client.data.Value max, androidx.health.services.client.data.Value average);
+    method public androidx.health.services.client.data.Value getAverage();
+    method public androidx.health.services.client.data.DataType getDataType();
+    method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.data.Value getMax();
+    method public androidx.health.services.client.data.Value getMin();
+    method public androidx.health.services.client.proto.DataProto.AggregateDataPoint getProto();
+    method public java.time.Instant getStartTime();
+    property public final androidx.health.services.client.data.Value average;
+    property public final androidx.health.services.client.data.DataType dataType;
+    property public final java.time.Instant endTime;
+    property public final androidx.health.services.client.data.Value max;
+    property public final androidx.health.services.client.data.Value min;
+    property public final java.time.Instant startTime;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.StatisticalDataPoint> CREATOR;
+    field public static final androidx.health.services.client.data.StatisticalDataPoint.Companion Companion;
+  }
+
+  public static final class StatisticalDataPoint.Companion {
+  }
+
+  public final class UserActivityInfo extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.UserActivityInfo> {
+    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseInfo? exerciseInfo, java.time.Instant stateChangeTime);
+    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
-    method public static androidx.health.services.client.data.UserActivityInfo createInactiveState(java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
-    method public int describeContents();
-    method public androidx.health.services.client.data.ExerciseType? getExerciseType();
+    method public androidx.health.services.client.data.ExerciseInfo? getExerciseInfo();
+    method public androidx.health.services.client.proto.DataProto.UserActivityInfo getProto();
     method public java.time.Instant getStateChangeTime();
     method public androidx.health.services.client.data.UserActivityState getUserActivityState();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final androidx.health.services.client.data.ExerciseType? exerciseType;
+    property public final androidx.health.services.client.data.ExerciseInfo? exerciseInfo;
     property public final java.time.Instant stateChangeTime;
     property public final androidx.health.services.client.data.UserActivityState userActivityState;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.UserActivityInfo> CREATOR;
@@ -743,9 +855,8 @@
   }
 
   public static final class UserActivityInfo.Companion {
-    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseType exerciseType, java.time.Instant stateChangeTime);
+    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
-    method public androidx.health.services.client.data.UserActivityInfo createInactiveState(java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
   }
@@ -756,7 +867,6 @@
     property public final int id;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_ASLEEP;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_EXERCISE;
-    enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_INACTIVE;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_PASSIVE;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_UNKNOWN;
     field public static final androidx.health.services.client.data.UserActivityState.Companion Companion;
@@ -766,19 +876,14 @@
     method public androidx.health.services.client.data.UserActivityState? fromId(int id);
   }
 
-  public final class Value implements android.os.Parcelable {
+  public final class Value extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.Value> {
     method public boolean asBoolean();
     method public double asDouble();
     method public double[] asDoubleArray();
     method public long asLong();
-    method public int component1();
-    method public java.util.List<java.lang.Double> component2();
-    method public long component3();
-    method public androidx.health.services.client.data.Value copy(int format, java.util.List<java.lang.Double> doubleList, long longValue);
-    method public int describeContents();
-    method public java.util.List<java.lang.Double> getDoubleList();
+    method public static int compare(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
     method public int getFormat();
-    method public long getLongValue();
+    method public androidx.health.services.client.proto.DataProto.Value getProto();
     method public boolean isBoolean();
     method public boolean isDouble();
     method public boolean isDoubleArray();
@@ -788,14 +893,11 @@
     method public static androidx.health.services.client.data.Value ofDoubleArray(double... doubleArray);
     method public static androidx.health.services.client.data.Value ofLong(long value);
     method public static androidx.health.services.client.data.Value sum(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final java.util.List<java.lang.Double> doubleList;
     property public final int format;
     property public final boolean isBoolean;
     property public final boolean isDouble;
     property public final boolean isDoubleArray;
     property public final boolean isLong;
-    property public final long longValue;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.Value> CREATOR;
     field public static final androidx.health.services.client.data.Value.Companion Companion;
     field public static final int FORMAT_BOOLEAN = 4; // 0x4
@@ -805,6 +907,7 @@
   }
 
   public static final class Value.Companion {
+    method public int compare(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
     method public androidx.health.services.client.data.Value ofBoolean(boolean value);
     method public androidx.health.services.client.data.Value ofDouble(double value);
     method public androidx.health.services.client.data.Value ofDoubleArray(double... doubleArray);
@@ -812,40 +915,27 @@
     method public androidx.health.services.client.data.Value sum(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
   }
 
-}
-
-package androidx.health.services.client.data.event {
-
-  public final class Event implements android.os.Parcelable {
-    ctor public Event(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.event.Event.TriggerType triggerType);
-    method public androidx.health.services.client.data.DataTypeCondition component1();
-    method public androidx.health.services.client.data.event.Event.TriggerType component2();
-    method public androidx.health.services.client.data.event.Event copy(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.event.Event.TriggerType triggerType);
-    method public int describeContents();
-    method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
-    method public androidx.health.services.client.data.event.Event.TriggerType getTriggerType();
-    method public boolean isTriggered(androidx.health.services.client.data.DataPoint dataPoint);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
-    property public final androidx.health.services.client.data.event.Event.TriggerType triggerType;
-    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.event.Event> CREATOR;
-    field public static final androidx.health.services.client.data.event.Event.Companion Companion;
+  public final class WarmUpConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.WarmUpConfig> {
+    ctor protected WarmUpConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public static androidx.health.services.client.data.WarmUpConfig.Builder builder();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
+    method public androidx.health.services.client.data.ExerciseType getExerciseType();
+    method public androidx.health.services.client.proto.DataProto.WarmUpConfig getProto();
+    property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
+    property public final androidx.health.services.client.data.ExerciseType exerciseType;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.WarmUpConfig> CREATOR;
+    field public static final androidx.health.services.client.data.WarmUpConfig.Companion Companion;
   }
 
-  public static final class Event.Companion {
+  public static final class WarmUpConfig.Builder {
+    ctor public WarmUpConfig.Builder();
+    method public androidx.health.services.client.data.WarmUpConfig build();
+    method public androidx.health.services.client.data.WarmUpConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public androidx.health.services.client.data.WarmUpConfig.Builder setExerciseType(androidx.health.services.client.data.ExerciseType exerciseType);
   }
 
-  public enum Event.TriggerType {
-    method public static final androidx.health.services.client.data.event.Event.TriggerType? fromId(int id);
-    method public final int getId();
-    property public final int id;
-    enum_constant public static final androidx.health.services.client.data.event.Event.TriggerType ONCE;
-    enum_constant public static final androidx.health.services.client.data.event.Event.TriggerType REPEATED;
-    field public static final androidx.health.services.client.data.event.Event.TriggerType.Companion Companion;
-  }
-
-  public static final class Event.TriggerType.Companion {
-    method public androidx.health.services.client.data.event.Event.TriggerType? fromId(int id);
+  public static final class WarmUpConfig.Companion {
+    method public androidx.health.services.client.data.WarmUpConfig.Builder builder();
   }
 
 }
diff --git a/health/health-services-client/api/restricted_current.txt b/health/health-services-client/api/restricted_current.txt
index fa85cf7..edfe8a1 100644
--- a/health/health-services-client/api/restricted_current.txt
+++ b/health/health-services-client/api/restricted_current.txt
@@ -5,11 +5,14 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> addGoalToActiveExercise(androidx.health.services.client.data.ExerciseGoal exerciseGoal);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> endExercise();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flushExercise();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseCapabilities> getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseInfo> getCurrentExerciseInfo();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> markLap();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> overrideAutoPauseAndResumeForActiveExercise(boolean enabled);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> pauseExercise();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> prepareExercise(androidx.health.services.client.data.WarmUpConfig configuration);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> removeGoalFromActiveExercise(androidx.health.services.client.data.ExerciseGoal exerciseGoal);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> resumeExercise();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setUpdateListener(androidx.health.services.client.ExerciseUpdateListener listener, java.util.concurrent.Executor executor);
@@ -19,6 +22,7 @@
   }
 
   public interface ExerciseUpdateListener {
+    method public void onAvailabilityChanged(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Availability availability);
     method public void onExerciseUpdate(androidx.health.services.client.data.ExerciseUpdate update);
     method public void onLapSummary(androidx.health.services.client.data.ExerciseLapSummary lapSummary);
   }
@@ -55,12 +59,13 @@
   }
 
   public interface PassiveMonitoringClient {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flush();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> getCapabilities();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.app.PendingIntent callbackIntent);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.app.PendingIntent callbackIntent, androidx.health.services.client.PassiveMonitoringCallback callback);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerEventCallback(androidx.health.services.client.data.event.Event event, android.app.PendingIntent callbackIntent);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig configuration);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerDataCallback(androidx.health.services.client.data.PassiveMonitoringConfig configuration, androidx.health.services.client.PassiveMonitoringCallback callback);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> registerPassiveGoalCallback(androidx.health.services.client.data.PassiveGoal passiveGoal, android.content.ComponentName componentName);
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterDataCallback();
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterEventCallback(androidx.health.services.client.data.event.Event event);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterPassiveGoalCallback(androidx.health.services.client.data.PassiveGoal passiveGoal);
     property public abstract com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> capabilities;
   }
 
@@ -68,13 +73,10 @@
 
 package androidx.health.services.client.data {
 
-  public final class AchievedExerciseGoal implements android.os.Parcelable {
+  public final class AchievedExerciseGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.AchievedExerciseGoal> {
     ctor public AchievedExerciseGoal(androidx.health.services.client.data.ExerciseGoal goal);
-    method public androidx.health.services.client.data.ExerciseGoal component1();
-    method public androidx.health.services.client.data.AchievedExerciseGoal copy(androidx.health.services.client.data.ExerciseGoal goal);
-    method public int describeContents();
     method public androidx.health.services.client.data.ExerciseGoal getGoal();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.AchievedExerciseGoal getProto();
     property public final androidx.health.services.client.data.ExerciseGoal goal;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.AchievedExerciseGoal> CREATOR;
     field public static final androidx.health.services.client.data.AchievedExerciseGoal.Companion Companion;
@@ -83,19 +85,30 @@
   public static final class AchievedExerciseGoal.Companion {
   }
 
-  public enum Availability {
-    method public static final androidx.health.services.client.data.Availability? fromId(int id);
-    method public final int getId();
-    property public final int id;
-    enum_constant public static final androidx.health.services.client.data.Availability ACQUIRING;
-    enum_constant public static final androidx.health.services.client.data.Availability AVAILABLE;
-    enum_constant public static final androidx.health.services.client.data.Availability UNAVAILABLE;
-    enum_constant public static final androidx.health.services.client.data.Availability UNKNOWN;
+  public abstract class AggregateDataPoint extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.AggregateDataPoint> {
+    ctor public AggregateDataPoint();
+  }
+
+  @Keep public final class AggregateDataPoints {
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateAbsoluteElevation(double minAbsElevation, double maxAbsElevation, double avgAbsElevation, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateCalories(double kcalories, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateDistance(double distance, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateElevationGain(double gainMeters, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateHeartRate(double minBpm, double maxBpm, double avgBpm, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregatePace(double minMillisPerKm, double maxMillisPerKm, double avgMillisPerKm, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.StatisticalDataPoint aggregateSpeed(double minMetersPerSecond, double maxMetersPerSecond, double avgMetersPerSecond, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateSteps(long steps, java.time.Instant startTime, java.time.Instant endTime);
+    method public static androidx.health.services.client.data.AggregateDataPoint aggregateSwimmingStrokes(long swimmingStrokes, java.time.Instant startTime, java.time.Instant endTime);
+    field public static final androidx.health.services.client.data.AggregateDataPoints INSTANCE;
+  }
+
+  public interface Availability {
+    method public int getId();
+    property public abstract int id;
     field public static final androidx.health.services.client.data.Availability.Companion Companion;
   }
 
   public static final class Availability.Companion {
-    method public androidx.health.services.client.data.Availability? fromId(int id);
   }
 
   public enum ComparisonType {
@@ -113,26 +126,41 @@
     method public androidx.health.services.client.data.ComparisonType? fromId(int id);
   }
 
-  public final class DataPoint implements android.os.Parcelable {
-    method public androidx.health.services.client.data.DataType component1();
-    method public androidx.health.services.client.data.Value component2();
-    method public java.time.Duration component3();
-    method public java.time.Duration component4();
-    method public android.os.Bundle component5();
-    method public androidx.health.services.client.data.DataPoint copy(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, android.os.Bundle metadata);
+  public final class CumulativeDataPoint extends androidx.health.services.client.data.AggregateDataPoint {
+    ctor public CumulativeDataPoint(java.time.Instant startTime, java.time.Instant endTime, androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value total);
+    method public androidx.health.services.client.data.DataType getDataType();
+    method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.proto.DataProto.AggregateDataPoint getProto();
+    method public java.time.Instant getStartTime();
+    method public androidx.health.services.client.data.Value getTotal();
+    property public final androidx.health.services.client.data.DataType dataType;
+    property public final java.time.Instant endTime;
+    property public final java.time.Instant startTime;
+    property public final androidx.health.services.client.data.Value total;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.CumulativeDataPoint> CREATOR;
+    field public static final androidx.health.services.client.data.CumulativeDataPoint.Companion Companion;
+  }
+
+  public static final class CumulativeDataPoint.Companion {
+  }
+
+  public final class DataPoint extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataPoint> {
+    method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata);
     method public static androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata);
     method public static androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot);
-    method public int describeContents();
+    method public androidx.health.services.client.data.DataPointAccuracy? getAccuracy();
     method public androidx.health.services.client.data.DataType getDataType();
     method public java.time.Duration getEndDurationFromBoot();
     method public java.time.Instant getEndInstant(java.time.Instant bootInstant);
     method public android.os.Bundle getMetadata();
+    method public androidx.health.services.client.proto.DataProto.DataPoint getProto();
     method public java.time.Duration getStartDurationFromBoot();
     method public java.time.Instant getStartInstant(java.time.Instant bootInstant);
     method public androidx.health.services.client.data.Value getValue();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property public final androidx.health.services.client.data.DataPointAccuracy? accuracy;
     property public final androidx.health.services.client.data.DataType dataType;
     property public final java.time.Duration endDurationFromBoot;
     property public final android.os.Bundle metadata;
@@ -143,96 +171,85 @@
   }
 
   public static final class DataPoint.Companion {
+    method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata);
     method public androidx.health.services.client.data.DataPoint createInterval(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
     method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot, optional android.os.Bundle metadata);
     method public androidx.health.services.client.data.DataPoint createSample(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value value, java.time.Duration durationFromBoot);
   }
 
+  public abstract class DataPointAccuracy extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataPointAccuracy> {
+    ctor public DataPointAccuracy();
+  }
+
   @Keep public final class DataPoints {
-    method public static androidx.health.services.client.data.DataPoint aggregateCalories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateDistance(double distance, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateSteps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint aggregateSwimmingStrokes(long swimmingStrokes, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint altitude(double meters, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint averagePace(double millisPerKm, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint averageSpeed(double metersPerSecond, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint absoluteElevation(double meters, java.time.Duration durationFromBoot, optional android.os.Bundle? metadata);
+    method public static androidx.health.services.client.data.DataPoint absoluteElevation(double meters, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint calories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint calories(double kcalories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyCalories(double calories, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyDistance(double distance, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailyFloors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint dailySteps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint distance(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint distance(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint elevation(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint elevationGain(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
+    method public static androidx.health.services.client.data.DataPoint elevationGain(double meters, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint floors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint floors(double floors, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     method @Keep public static java.util.List<androidx.health.services.client.data.DataPoint> getDataPoints(android.content.Intent intent);
     method public static boolean getPermissionsGranted(android.content.Intent intent);
+    method public static androidx.health.services.client.data.DataPoint heartRate(double bpm, java.time.Duration durationFromBoot, optional androidx.health.services.client.data.HrAccuracy? accuracy);
     method public static androidx.health.services.client.data.DataPoint heartRate(double bpm, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, optional double bearing, java.time.Duration durationFromBoot, optional androidx.health.services.client.data.LocationAccuracy? accuracy);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, optional double bearing, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, optional double altitude, java.time.Duration durationFromBoot);
     method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint location(double latitude, double longitude, double altitude, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint maxSpeed(double metersPerSecond, java.time.Duration durationFromBoot);
     method public static androidx.health.services.client.data.DataPoint pace(double millisPerKm, java.time.Duration durationFromBoot);
     method public static void putDataPoints(android.content.Intent intent, java.util.Collection<androidx.health.services.client.data.DataPoint> dataPoints);
     method public static void putPermissionsGranted(android.content.Intent intent, boolean granted);
+    method public static androidx.health.services.client.data.DataPoint speed(double metersPerSecond, java.time.Duration durationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint speed(double metersPerSecond, java.time.Duration durationFromBoot);
-    method public static androidx.health.services.client.data.DataPoint spo2(double percent, java.time.Duration durationFromBoot);
+    method public static androidx.health.services.client.data.DataPoint steps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle? metadata);
     method public static androidx.health.services.client.data.DataPoint steps(long steps, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     method public static androidx.health.services.client.data.DataPoint stepsPerMinute(long stepsPerMinute, java.time.Duration startDurationFromBoot);
     method public static androidx.health.services.client.data.DataPoint swimmingStrokes(long strokes, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot);
     field public static final androidx.health.services.client.data.DataPoints INSTANCE;
     field public static final int LOCATION_DATA_POINT_ALTITUDE_INDEX = 2; // 0x2
+    field public static final int LOCATION_DATA_POINT_BEARING_INDEX = 3; // 0x3
     field public static final int LOCATION_DATA_POINT_LATITUDE_INDEX = 0; // 0x0
     field public static final int LOCATION_DATA_POINT_LONGITUDE_INDEX = 1; // 0x1
   }
 
-  public final class DataType implements android.os.Parcelable {
+  public final class DataType extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataType> {
     ctor public DataType(String name, androidx.health.services.client.data.DataType.TimeType timeType, int format);
-    method public String component1();
-    method public androidx.health.services.client.data.DataType.TimeType component2();
-    method public int component3();
-    method public androidx.health.services.client.data.DataType copy(String name, androidx.health.services.client.data.DataType.TimeType timeType, int format);
-    method public int describeContents();
     method public int getFormat();
     method public String getName();
+    method public androidx.health.services.client.proto.DataProto.DataType getProto();
     method public androidx.health.services.client.data.DataType.TimeType getTimeType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final int format;
     property public final String name;
     property public final androidx.health.services.client.data.DataType.TimeType timeType;
     field public static final androidx.health.services.client.data.DataType ABSOLUTE_ELEVATION;
     field public static final androidx.health.services.client.data.DataType ACTIVE_EXERCISE_DURATION;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_CALORIES_EXPENDED;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DECLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DECLINE_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_ELEVATION;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLAT_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLAT_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_FLOORS;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_INCLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_INCLINE_TIME;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_RUNNING_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_SWIMMING_STROKE_COUNT;
-    field public static final androidx.health.services.client.data.DataType AGGREGATE_WALKING_STEP_COUNT;
-    field public static final androidx.health.services.client.data.DataType ALTITUDE;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_HEART_RATE_BPM;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_PACE;
-    field public static final androidx.health.services.client.data.DataType AVERAGE_SPEED;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.DataType> CREATOR;
     field public static final androidx.health.services.client.data.DataType.Companion Companion;
+    field public static final androidx.health.services.client.data.DataType DAILY_CALORIES;
+    field public static final androidx.health.services.client.data.DataType DAILY_DISTANCE;
+    field public static final androidx.health.services.client.data.DataType DAILY_FLOORS;
+    field public static final androidx.health.services.client.data.DataType DAILY_STEPS;
     field public static final androidx.health.services.client.data.DataType DECLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType DECLINE_TIME;
+    field public static final androidx.health.services.client.data.DataType DECLINE_DURATION;
     field public static final androidx.health.services.client.data.DataType DISTANCE;
-    field public static final androidx.health.services.client.data.DataType ELEVATION;
-    field public static final androidx.health.services.client.data.DataType FLAT_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType FLAT_TIME;
+    field public static final androidx.health.services.client.data.DataType ELEVATION_GAIN;
+    field public static final androidx.health.services.client.data.DataType FLAT_GROUND_DISTANCE;
+    field public static final androidx.health.services.client.data.DataType FLAT_GROUND_DURATION;
     field public static final androidx.health.services.client.data.DataType FLOORS;
     field public static final androidx.health.services.client.data.DataType HEART_RATE_BPM;
     field public static final androidx.health.services.client.data.DataType INCLINE_DISTANCE;
-    field public static final androidx.health.services.client.data.DataType INCLINE_TIME;
+    field public static final androidx.health.services.client.data.DataType INCLINE_DURATION;
     field public static final androidx.health.services.client.data.DataType LOCATION;
-    field public static final androidx.health.services.client.data.DataType MAX_ALTITUDE;
-    field public static final androidx.health.services.client.data.DataType MAX_HEART_RATE_BPM;
-    field public static final androidx.health.services.client.data.DataType MAX_PACE;
-    field public static final androidx.health.services.client.data.DataType MAX_SPEED;
-    field public static final androidx.health.services.client.data.DataType MIN_ALTITUDE;
     field public static final androidx.health.services.client.data.DataType PACE;
     field public static final androidx.health.services.client.data.DataType REP_COUNT;
     field public static final androidx.health.services.client.data.DataType RESTING_EXERCISE_DURATION;
@@ -257,19 +274,29 @@
     enum_constant public static final androidx.health.services.client.data.DataType.TimeType SAMPLE;
   }
 
-  public final class DataTypeCondition implements android.os.Parcelable {
+  public enum DataTypeAvailability implements androidx.health.services.client.data.Availability {
+    method public static final androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
+    method public int getId();
+    property public int id;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability ACQUIRING;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability AVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability UNAVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.DataTypeAvailability UNKNOWN;
+    field public static final androidx.health.services.client.data.DataTypeAvailability.Companion Companion;
+  }
+
+  public static final class DataTypeAvailability.Companion {
+    method public androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
+  }
+
+  public final class DataTypeCondition extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.DataTypeCondition> {
     ctor public DataTypeCondition(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value threshold, androidx.health.services.client.data.ComparisonType comparisonType);
-    method public androidx.health.services.client.data.DataType component1();
-    method public androidx.health.services.client.data.Value component2();
-    method public androidx.health.services.client.data.ComparisonType component3();
-    method public androidx.health.services.client.data.DataTypeCondition copy(androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value threshold, androidx.health.services.client.data.ComparisonType comparisonType);
-    method public int describeContents();
     method public androidx.health.services.client.data.ComparisonType getComparisonType();
     method public androidx.health.services.client.data.DataType getDataType();
+    method public androidx.health.services.client.proto.DataProto.DataTypeCondition getProto();
     method public androidx.health.services.client.data.Value getThreshold();
     method public boolean isSatisfied(androidx.health.services.client.data.DataPoint dataPoint);
     method public boolean isThresholdSatisfied(androidx.health.services.client.data.Value value);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final androidx.health.services.client.data.ComparisonType comparisonType;
     property public final androidx.health.services.client.data.DataType dataType;
     property public final androidx.health.services.client.data.Value threshold;
@@ -281,30 +308,18 @@
   }
 
   public final class DataTypes {
-    method public static androidx.health.services.client.data.DataType? getAggregateTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static java.util.Set<androidx.health.services.client.data.DataType> getAggregatedDataTypesFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getAverageTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getMaxTypeFromRawType(androidx.health.services.client.data.DataType rawType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromAggregateType(androidx.health.services.client.data.DataType aggregateType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromAverageType(androidx.health.services.client.data.DataType averageType);
-    method public static androidx.health.services.client.data.DataType? getRawTypeFromMaxType(androidx.health.services.client.data.DataType maxType);
-    method public static boolean isAggregateDataType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isRawType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isStatisticalAverageDataType(androidx.health.services.client.data.DataType dataType);
-    method public static boolean isStatisticalMaxDataType(androidx.health.services.client.data.DataType dataType);
+    method public static boolean isCumulativeDataType(androidx.health.services.client.data.DataType dataType);
+    method public static boolean isStatisticalDataType(androidx.health.services.client.data.DataType dataType);
     field public static final androidx.health.services.client.data.DataTypes INSTANCE;
   }
 
-  public final class ExerciseCapabilities implements android.os.Parcelable {
+  public final class ExerciseCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseCapabilities> {
     ctor public ExerciseCapabilities(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
-    method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> component1();
-    method public androidx.health.services.client.data.ExerciseCapabilities copy(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
-    method public int describeContents();
     method public java.util.Set<androidx.health.services.client.data.ExerciseType> getAutoPauseAndResumeEnabledExercises();
     method public androidx.health.services.client.data.ExerciseTypeCapabilities getExerciseTypeCapabilities(androidx.health.services.client.data.ExerciseType exercise);
+    method public androidx.health.services.client.proto.DataProto.ExerciseCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.ExerciseType> getSupportedExerciseTypes();
     method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> getTypeToCapabilities();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.ExerciseType> autoPauseAndResumeEnabledExercises;
     property public final java.util.Set<androidx.health.services.client.data.ExerciseType> supportedExerciseTypes;
     property public final java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities;
@@ -315,27 +330,24 @@
   public static final class ExerciseCapabilities.Companion {
   }
 
-  public final class ExerciseConfig implements android.os.Parcelable {
-    ctor protected ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, boolean autoPauseAndResume, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
+  public final class ExerciseConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseConfig> {
+    ctor protected ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, java.util.Set<androidx.health.services.client.data.DataType> aggregateDataTypes, boolean shouldEnableAutoPauseAndResume, boolean shouldEnableGps, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
     method public static androidx.health.services.client.data.ExerciseConfig.Builder builder();
-    method public androidx.health.services.client.data.ExerciseType component1();
-    method public java.util.Set<androidx.health.services.client.data.DataType> component2();
-    method public boolean component3();
-    method public java.util.List<androidx.health.services.client.data.ExerciseGoal> component4();
-    method public android.os.Bundle component5();
-    method public androidx.health.services.client.data.ExerciseConfig copy(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes, boolean autoPauseAndResume, java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals, android.os.Bundle exerciseParams);
-    method public int describeContents();
-    method public boolean getAutoPauseAndResume();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getAggregateDataTypes();
     method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
     method public java.util.List<androidx.health.services.client.data.ExerciseGoal> getExerciseGoals();
     method public android.os.Bundle getExerciseParams();
     method public androidx.health.services.client.data.ExerciseType getExerciseType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final boolean autoPauseAndResume;
+    method public androidx.health.services.client.proto.DataProto.ExerciseConfig getProto();
+    method public boolean getShouldEnableAutoPauseAndResume();
+    method public boolean getShouldEnableGps();
+    property public final java.util.Set<androidx.health.services.client.data.DataType> aggregateDataTypes;
     property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
     property public final java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals;
     property public final android.os.Bundle exerciseParams;
     property public final androidx.health.services.client.data.ExerciseType exerciseType;
+    property public final boolean shouldEnableAutoPauseAndResume;
+    property public final boolean shouldEnableGps;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseConfig> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseConfig.Companion Companion;
   }
@@ -343,31 +355,27 @@
   public static final class ExerciseConfig.Builder {
     ctor public ExerciseConfig.Builder();
     method public androidx.health.services.client.data.ExerciseConfig build();
-    method public androidx.health.services.client.data.ExerciseConfig.Builder setAutoPauseAndResume(boolean autoPauseAndResume);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setAggregateDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseGoals(java.util.List<androidx.health.services.client.data.ExerciseGoal> exerciseGoals);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseParams(android.os.Bundle exerciseParams);
     method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseType(androidx.health.services.client.data.ExerciseType exerciseType);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setShouldEnableAutoPauseAndResume(boolean shouldEnableAutoPauseAndResume);
+    method public androidx.health.services.client.data.ExerciseConfig.Builder setShouldEnableGps(boolean shouldEnableGps);
   }
 
   public static final class ExerciseConfig.Companion {
     method public androidx.health.services.client.data.ExerciseConfig.Builder builder();
   }
 
-  public final class ExerciseGoal implements android.os.Parcelable {
-    ctor protected ExerciseGoal(androidx.health.services.client.data.ExerciseGoalType exerciseGoalType, androidx.health.services.client.data.DataTypeCondition dataTypeCondition, optional androidx.health.services.client.data.Value? period);
-    method public androidx.health.services.client.data.ExerciseGoalType component1();
-    method public androidx.health.services.client.data.DataTypeCondition component2();
-    method public androidx.health.services.client.data.Value? component3();
-    method public androidx.health.services.client.data.ExerciseGoal copy(androidx.health.services.client.data.ExerciseGoalType exerciseGoalType, androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.Value? period);
+  public final class ExerciseGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseGoal> {
     method public static androidx.health.services.client.data.ExerciseGoal createMilestone(androidx.health.services.client.data.DataTypeCondition condition, androidx.health.services.client.data.Value period);
     method public static androidx.health.services.client.data.ExerciseGoal createMilestoneGoalWithUpdatedThreshold(androidx.health.services.client.data.ExerciseGoal goal, androidx.health.services.client.data.Value newThreshold);
     method public static androidx.health.services.client.data.ExerciseGoal createOneTimeGoal(androidx.health.services.client.data.DataTypeCondition condition);
-    method public int describeContents();
     method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
     method public androidx.health.services.client.data.ExerciseGoalType getExerciseGoalType();
     method public androidx.health.services.client.data.Value? getPeriod();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.ExerciseGoal getProto();
     property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
     property public final androidx.health.services.client.data.ExerciseGoalType exerciseGoalType;
     property public final androidx.health.services.client.data.Value? period;
@@ -394,15 +402,11 @@
     method public androidx.health.services.client.data.ExerciseGoalType? fromId(int id);
   }
 
-  public final class ExerciseInfo implements android.os.Parcelable {
+  public final class ExerciseInfo extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseInfo> {
     ctor public ExerciseInfo(androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
-    method public androidx.health.services.client.data.ExerciseTrackedStatus component1();
-    method public androidx.health.services.client.data.ExerciseType component2();
-    method public androidx.health.services.client.data.ExerciseInfo copy(androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
-    method public int describeContents();
     method public androidx.health.services.client.data.ExerciseTrackedStatus getExerciseTrackedStatus();
     method public androidx.health.services.client.data.ExerciseType getExerciseType();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public androidx.health.services.client.proto.DataProto.ExerciseInfo getProto();
     property public final androidx.health.services.client.data.ExerciseTrackedStatus exerciseTrackedStatus;
     property public final androidx.health.services.client.data.ExerciseType exerciseType;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseInfo> CREATOR;
@@ -412,25 +416,18 @@
   public static final class ExerciseInfo.Companion {
   }
 
-  public final class ExerciseLapSummary implements android.os.Parcelable {
-    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics);
-    method public int component1();
-    method public java.time.Instant component2();
-    method public java.time.Instant component3();
-    method public java.time.Duration component4();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> component5();
-    method public androidx.health.services.client.data.ExerciseLapSummary copy(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics);
-    method public int describeContents();
+  public final class ExerciseLapSummary extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseLapSummary> {
+    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> lapMetrics);
     method public java.time.Duration getActiveDuration();
     method public java.time.Instant getEndTime();
     method public int getLapCount();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> getLapMetrics();
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getLapMetrics();
+    method public androidx.health.services.client.proto.DataProto.ExerciseLapSummary getProto();
     method public java.time.Instant getStartTime();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.time.Duration activeDuration;
     property public final java.time.Instant endTime;
     property public final int lapCount;
-    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> lapMetrics;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> lapMetrics;
     property public final java.time.Instant startTime;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseLapSummary> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseLapSummary.Companion Companion;
@@ -443,18 +440,23 @@
     method public static final androidx.health.services.client.data.ExerciseState? fromId(int id);
     method public final int getId();
     method public final boolean isEnded();
+    method public final boolean isEnding();
     method public final boolean isPaused();
     method public final boolean isResuming();
     property public final int id;
     property public final boolean isEnded;
+    property public final boolean isEnding;
     property public final boolean isPaused;
     property public final boolean isResuming;
     enum_constant public static final androidx.health.services.client.data.ExerciseState ACTIVE;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDED_PERMISSION_LOST;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_ENDING_PERMISSION_LOST;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState AUTO_RESUMING;
+    enum_constant public static final androidx.health.services.client.data.ExerciseState PREPARING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState TERMINATED;
     enum_constant public static final androidx.health.services.client.data.ExerciseState TERMINATING;
     enum_constant public static final androidx.health.services.client.data.ExerciseState USER_ENDED;
@@ -517,10 +519,11 @@
     enum_constant public static final androidx.health.services.client.data.ExerciseType FENCING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AMERICAN;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AUSTRALIAN;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType FORWARD_TWIST;
     enum_constant public static final androidx.health.services.client.data.ExerciseType FRISBEE_DISC;
     enum_constant public static final androidx.health.services.client.data.ExerciseType GOLF;
     enum_constant public static final androidx.health.services.client.data.ExerciseType GUIDED_BREATHING;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType GYNMASTICS;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType GYMNASTICS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HANDBALL;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HIGH_INTENSITY_INTERVAL_TRAINING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType HIKING;
@@ -564,12 +567,12 @@
     enum_constant public static final androidx.health.services.client.data.ExerciseType TABLE_TENNIS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType TENNIS;
     enum_constant public static final androidx.health.services.client.data.ExerciseType UNKNOWN;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType UPPER_TWIST;
     enum_constant public static final androidx.health.services.client.data.ExerciseType VOLLEYBALL;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WALKING;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WATER_POLO;
     enum_constant public static final androidx.health.services.client.data.ExerciseType WEIGHTLIFTING;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT_INDOOR;
-    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT_OUTDOOR;
+    enum_constant public static final androidx.health.services.client.data.ExerciseType WORKOUT;
     enum_constant public static final androidx.health.services.client.data.ExerciseType YOGA;
     field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
   }
@@ -578,21 +581,14 @@
     method public androidx.health.services.client.data.ExerciseType fromId(int id);
   }
 
-  public final class ExerciseTypeCapabilities implements android.os.Parcelable {
+  public final class ExerciseTypeCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities> {
     ctor public ExerciseTypeCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume, boolean supportsLaps);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> component2();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> component3();
-    method public boolean component4();
-    method public boolean component5();
-    method public androidx.health.services.client.data.ExerciseTypeCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.Set<? extends androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume, boolean supportsLaps);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypes();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedGoals();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedMilestones();
     method public boolean getSupportsAutoPauseAndResume();
     method public boolean getSupportsLaps();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypes;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedGoals;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedMilestones;
@@ -605,31 +601,24 @@
   public static final class ExerciseTypeCapabilities.Companion {
   }
 
-  public final class ExerciseUpdate implements android.os.Parcelable {
-    ctor public ExerciseUpdate(androidx.health.services.client.data.ExerciseState state, java.time.Instant startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig exerciseConfig);
-    method public androidx.health.services.client.data.ExerciseState component1();
-    method public java.time.Instant component2();
-    method public java.time.Duration component3();
-    method public java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> component4();
-    method public java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> component5();
-    method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> component6();
-    method public androidx.health.services.client.data.ExerciseConfig component7();
-    method public androidx.health.services.client.data.ExerciseUpdate copy(androidx.health.services.client.data.ExerciseState state, java.time.Instant startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig exerciseConfig);
-    method public int describeContents();
+  public final class ExerciseUpdate extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.ExerciseUpdate> {
+    ctor public ExerciseUpdate(androidx.health.services.client.data.ExerciseState state, java.time.Instant? startTime, java.time.Duration activeDuration, java.util.Map<androidx.health.services.client.data.DataType,? extends java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> latestAggregateMetrics, java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals, java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries, androidx.health.services.client.data.ExerciseConfig? exerciseConfig);
     method public java.time.Duration getActiveDuration();
-    method public androidx.health.services.client.data.ExerciseConfig getExerciseConfig();
+    method public androidx.health.services.client.data.ExerciseConfig? getExerciseConfig();
     method public java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> getLatestAchievedGoals();
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getLatestAggregateMetrics();
     method public java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> getLatestMetrics();
     method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> getLatestMilestoneMarkerSummaries();
-    method public java.time.Instant getStartTime();
+    method public androidx.health.services.client.proto.DataProto.ExerciseUpdate getProto();
+    method public java.time.Instant? getStartTime();
     method public androidx.health.services.client.data.ExerciseState getState();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.time.Duration activeDuration;
-    property public final androidx.health.services.client.data.ExerciseConfig exerciseConfig;
+    property public final androidx.health.services.client.data.ExerciseConfig? exerciseConfig;
     property public final java.util.Set<androidx.health.services.client.data.AchievedExerciseGoal> latestAchievedGoals;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> latestAggregateMetrics;
     property public final java.util.Map<androidx.health.services.client.data.DataType,java.util.List<androidx.health.services.client.data.DataPoint>> latestMetrics;
     property public final java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries;
-    property public final java.time.Instant startTime;
+    property public final java.time.Instant? startTime;
     property public final androidx.health.services.client.data.ExerciseState state;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseUpdate> CREATOR;
     field public static final androidx.health.services.client.data.ExerciseUpdate.Companion Companion;
@@ -638,13 +627,62 @@
   public static final class ExerciseUpdate.Companion {
   }
 
-  public final class MeasureCapabilities implements android.os.Parcelable {
+  public final class HrAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
+    ctor public HrAccuracy(androidx.health.services.client.data.HrAccuracy.SensorStatus sensorStatus);
+    method public androidx.health.services.client.proto.DataProto.DataPointAccuracy getProto();
+    method public androidx.health.services.client.data.HrAccuracy.SensorStatus getSensorStatus();
+    property public final androidx.health.services.client.data.HrAccuracy.SensorStatus sensorStatus;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.HrAccuracy> CREATOR;
+    field public static final androidx.health.services.client.data.HrAccuracy.Companion Companion;
+  }
+
+  public static final class HrAccuracy.Companion {
+  }
+
+  public enum HrAccuracy.SensorStatus {
+    method public final int getId();
+    property public final int id;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_HIGH;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_LOW;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus ACCURACY_MEDIUM;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus NO_CONTACT;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus UNKNOWN;
+    enum_constant public static final androidx.health.services.client.data.HrAccuracy.SensorStatus UNRELIABLE;
+  }
+
+  public final class LocationAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
+    ctor public LocationAccuracy(double horizontalPositionError);
+    method public double getHorizontalPositionError();
+    method public androidx.health.services.client.proto.DataProto.DataPointAccuracy getProto();
+    property public final double horizontalPositionError;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.LocationAccuracy> CREATOR;
+    field public static final androidx.health.services.client.data.LocationAccuracy.Companion Companion;
+  }
+
+  public static final class LocationAccuracy.Companion {
+  }
+
+  public enum LocationAvailability implements androidx.health.services.client.data.Availability {
+    method public static final androidx.health.services.client.data.LocationAvailability? fromId(int id);
+    method public int getId();
+    property public int id;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_TETHERED;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_UNTETHERED;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability ACQUIRING;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability NO_GPS;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability UNAVAILABLE;
+    enum_constant public static final androidx.health.services.client.data.LocationAvailability UNKNOWN;
+    field public static final androidx.health.services.client.data.LocationAvailability.Companion Companion;
+  }
+
+  public static final class LocationAvailability.Companion {
+    method public androidx.health.services.client.data.LocationAvailability? fromId(int id);
+  }
+
+  public final class MeasureCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.MeasureCapabilities> {
     ctor public MeasureCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public androidx.health.services.client.data.MeasureCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.MeasureCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesMeasure();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesMeasure;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.MeasureCapabilities> CREATOR;
     field public static final androidx.health.services.client.data.MeasureCapabilities.Companion Companion;
@@ -653,26 +691,19 @@
   public static final class MeasureCapabilities.Companion {
   }
 
-  public final class MilestoneMarkerSummary implements android.os.Parcelable {
-    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics);
-    method public java.time.Instant component1();
-    method public java.time.Instant component2();
-    method public java.time.Duration component3();
-    method public androidx.health.services.client.data.AchievedExerciseGoal component4();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> component5();
-    method public androidx.health.services.client.data.MilestoneMarkerSummary copy(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics);
-    method public int describeContents();
+  public final class MilestoneMarkerSummary extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary> {
+    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.AchievedExerciseGoal achievedGoal, java.util.Map<androidx.health.services.client.data.DataType,? extends androidx.health.services.client.data.AggregateDataPoint> summaryMetrics);
     method public androidx.health.services.client.data.AchievedExerciseGoal getAchievedGoal();
     method public java.time.Duration getActiveDuration();
     method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary getProto();
     method public java.time.Instant getStartTime();
-    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> getSummaryMetrics();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
+    method public java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> getSummaryMetrics();
     property public final androidx.health.services.client.data.AchievedExerciseGoal achievedGoal;
     property public final java.time.Duration activeDuration;
     property public final java.time.Instant endTime;
     property public final java.time.Instant startTime;
-    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.DataPoint> summaryMetrics;
+    property public final java.util.Map<androidx.health.services.client.data.DataType,androidx.health.services.client.data.AggregateDataPoint> summaryMetrics;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.MilestoneMarkerSummary> CREATOR;
     field public static final androidx.health.services.client.data.MilestoneMarkerSummary.Companion Companion;
   }
@@ -680,15 +711,43 @@
   public static final class MilestoneMarkerSummary.Companion {
   }
 
-  public final class PassiveMonitoringCapabilities implements android.os.Parcelable {
+  public final class PassiveGoal extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveGoal> {
+    ctor public PassiveGoal(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.PassiveGoal.TriggerType triggerType);
+    method public static androidx.health.services.client.data.PassiveGoal? fromIntent(android.content.Intent intent);
+    method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
+    method public androidx.health.services.client.proto.DataProto.PassiveGoal getProto();
+    method public androidx.health.services.client.data.PassiveGoal.TriggerType getTriggerType();
+    method public boolean isTriggered(androidx.health.services.client.data.DataPoint dataPoint);
+    method public void putToIntent(android.content.Intent intent);
+    property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
+    property public final androidx.health.services.client.data.PassiveGoal.TriggerType triggerType;
+    field public static final String ACTION_GOAL = "hs.passivemonitoring.GOAL";
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveGoal> CREATOR;
+    field public static final androidx.health.services.client.data.PassiveGoal.Companion Companion;
+  }
+
+  public static final class PassiveGoal.Companion {
+    method public androidx.health.services.client.data.PassiveGoal? fromIntent(android.content.Intent intent);
+  }
+
+  public enum PassiveGoal.TriggerType {
+    method public static final androidx.health.services.client.data.PassiveGoal.TriggerType? fromId(int id);
+    method public final int getId();
+    property public final int id;
+    enum_constant public static final androidx.health.services.client.data.PassiveGoal.TriggerType ONCE;
+    enum_constant public static final androidx.health.services.client.data.PassiveGoal.TriggerType REPEATED;
+    field public static final androidx.health.services.client.data.PassiveGoal.TriggerType.Companion Companion;
+  }
+
+  public static final class PassiveGoal.TriggerType.Companion {
+    method public androidx.health.services.client.data.PassiveGoal.TriggerType? fromId(int id);
+  }
+
+  public final class PassiveMonitoringCapabilities extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities> {
     ctor public PassiveMonitoringCapabilities(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring, java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents);
-    method public java.util.Set<androidx.health.services.client.data.DataType> component1();
-    method public java.util.Set<androidx.health.services.client.data.DataType> component2();
-    method public androidx.health.services.client.data.PassiveMonitoringCapabilities copy(java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring, java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents);
-    method public int describeContents();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities getProto();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesEvents();
     method public java.util.Set<androidx.health.services.client.data.DataType> getSupportedDataTypesPassiveMonitoring();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesEvents;
     property public final java.util.Set<androidx.health.services.client.data.DataType> supportedDataTypesPassiveMonitoring;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringCapabilities> CREATOR;
@@ -698,19 +757,42 @@
   public static final class PassiveMonitoringCapabilities.Companion {
   }
 
-  public final class PassiveMonitoringUpdate implements android.os.Parcelable {
+  public final class PassiveMonitoringConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringConfig> {
+    ctor protected PassiveMonitoringConfig(java.util.Set<androidx.health.services.client.data.DataType> dataTypes, android.content.ComponentName componentName, boolean shouldIncludeUserActivityState);
+    method public static androidx.health.services.client.data.PassiveMonitoringConfig.Builder builder();
+    method public android.content.ComponentName getComponentName();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringConfig getProto();
+    method public boolean getShouldIncludeUserActivityState();
+    property public final android.content.ComponentName componentName;
+    property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
+    property public final boolean shouldIncludeUserActivityState;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringConfig> CREATOR;
+    field public static final androidx.health.services.client.data.PassiveMonitoringConfig.Companion Companion;
+  }
+
+  public static final class PassiveMonitoringConfig.Builder {
+    ctor public PassiveMonitoringConfig.Builder();
+    method public androidx.health.services.client.data.PassiveMonitoringConfig build();
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setComponentName(android.content.ComponentName componentName);
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder setShouldIncludeUserActivityState(boolean shouldIncludeUserActivityState);
+  }
+
+  public static final class PassiveMonitoringConfig.Companion {
+    method public androidx.health.services.client.data.PassiveMonitoringConfig.Builder builder();
+  }
+
+  public final class PassiveMonitoringUpdate extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate> {
     ctor public PassiveMonitoringUpdate(java.util.List<androidx.health.services.client.data.DataPoint> dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
-    method public java.util.List<androidx.health.services.client.data.DataPoint> component1();
-    method public java.util.List<androidx.health.services.client.data.UserActivityInfo> component2();
-    method public androidx.health.services.client.data.PassiveMonitoringUpdate copy(java.util.List<androidx.health.services.client.data.DataPoint> dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
-    method public int describeContents();
     method public static androidx.health.services.client.data.PassiveMonitoringUpdate? fromIntent(android.content.Intent intent);
     method public java.util.List<androidx.health.services.client.data.DataPoint> getDataPoints();
+    method public androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate getProto();
     method public java.util.List<androidx.health.services.client.data.UserActivityInfo> getUserActivityInfoUpdates();
     method public void putToIntent(android.content.Intent intent);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
     property public final java.util.List<androidx.health.services.client.data.DataPoint> dataPoints;
     property public final java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates;
+    field public static final String ACTION_DATA = "hs.passivemonitoring.DATA";
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.PassiveMonitoringUpdate> CREATOR;
     field public static final androidx.health.services.client.data.PassiveMonitoringUpdate.Companion Companion;
   }
@@ -719,23 +801,53 @@
     method public androidx.health.services.client.data.PassiveMonitoringUpdate? fromIntent(android.content.Intent intent);
   }
 
-  public final class UserActivityInfo implements android.os.Parcelable {
-    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseType? exerciseType, java.time.Instant stateChangeTime);
-    method public androidx.health.services.client.data.UserActivityState component1();
-    method public androidx.health.services.client.data.ExerciseType? component2();
-    method public java.time.Instant component3();
-    method public androidx.health.services.client.data.UserActivityInfo copy(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseType? exerciseType, java.time.Instant stateChangeTime);
-    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseType exerciseType, java.time.Instant stateChangeTime);
+  public abstract class ProtoParcelable<T extends com.google.protobuf.MessageLite> implements android.os.Parcelable {
+    ctor public ProtoParcelable();
+    method public int describeContents();
+    method protected final byte[] getBytes();
+    method public abstract T getProto();
+    method public void writeToParcel(android.os.Parcel dest, int flags);
+    property protected final byte[] bytes;
+    property public abstract T proto;
+    field public static final androidx.health.services.client.data.ProtoParcelable.Companion Companion;
+  }
+
+  public static final class ProtoParcelable.Companion {
+  }
+
+  public final class StatisticalDataPoint extends androidx.health.services.client.data.AggregateDataPoint {
+    ctor public StatisticalDataPoint(java.time.Instant startTime, java.time.Instant endTime, androidx.health.services.client.data.DataType dataType, androidx.health.services.client.data.Value min, androidx.health.services.client.data.Value max, androidx.health.services.client.data.Value average);
+    method public androidx.health.services.client.data.Value getAverage();
+    method public androidx.health.services.client.data.DataType getDataType();
+    method public java.time.Instant getEndTime();
+    method public androidx.health.services.client.data.Value getMax();
+    method public androidx.health.services.client.data.Value getMin();
+    method public androidx.health.services.client.proto.DataProto.AggregateDataPoint getProto();
+    method public java.time.Instant getStartTime();
+    property public final androidx.health.services.client.data.Value average;
+    property public final androidx.health.services.client.data.DataType dataType;
+    property public final java.time.Instant endTime;
+    property public final androidx.health.services.client.data.Value max;
+    property public final androidx.health.services.client.data.Value min;
+    property public final java.time.Instant startTime;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.StatisticalDataPoint> CREATOR;
+    field public static final androidx.health.services.client.data.StatisticalDataPoint.Companion Companion;
+  }
+
+  public static final class StatisticalDataPoint.Companion {
+  }
+
+  public final class UserActivityInfo extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.UserActivityInfo> {
+    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseInfo? exerciseInfo, java.time.Instant stateChangeTime);
+    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
-    method public static androidx.health.services.client.data.UserActivityInfo createInactiveState(java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
     method public static androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
-    method public int describeContents();
-    method public androidx.health.services.client.data.ExerciseType? getExerciseType();
+    method public androidx.health.services.client.data.ExerciseInfo? getExerciseInfo();
+    method public androidx.health.services.client.proto.DataProto.UserActivityInfo getProto();
     method public java.time.Instant getStateChangeTime();
     method public androidx.health.services.client.data.UserActivityState getUserActivityState();
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final androidx.health.services.client.data.ExerciseType? exerciseType;
+    property public final androidx.health.services.client.data.ExerciseInfo? exerciseInfo;
     property public final java.time.Instant stateChangeTime;
     property public final androidx.health.services.client.data.UserActivityState userActivityState;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.UserActivityInfo> CREATOR;
@@ -743,9 +855,8 @@
   }
 
   public static final class UserActivityInfo.Companion {
-    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseType exerciseType, java.time.Instant stateChangeTime);
+    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
-    method public androidx.health.services.client.data.UserActivityInfo createInactiveState(java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
     method public androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
   }
@@ -756,7 +867,6 @@
     property public final int id;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_ASLEEP;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_EXERCISE;
-    enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_INACTIVE;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_PASSIVE;
     enum_constant public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_UNKNOWN;
     field public static final androidx.health.services.client.data.UserActivityState.Companion Companion;
@@ -766,19 +876,14 @@
     method public androidx.health.services.client.data.UserActivityState? fromId(int id);
   }
 
-  public final class Value implements android.os.Parcelable {
+  public final class Value extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.Value> {
     method public boolean asBoolean();
     method public double asDouble();
     method public double[] asDoubleArray();
     method public long asLong();
-    method public int component1();
-    method public java.util.List<java.lang.Double> component2();
-    method public long component3();
-    method public androidx.health.services.client.data.Value copy(int format, java.util.List<java.lang.Double> doubleList, long longValue);
-    method public int describeContents();
-    method public java.util.List<java.lang.Double> getDoubleList();
+    method public static int compare(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
     method public int getFormat();
-    method public long getLongValue();
+    method public androidx.health.services.client.proto.DataProto.Value getProto();
     method public boolean isBoolean();
     method public boolean isDouble();
     method public boolean isDoubleArray();
@@ -788,14 +893,11 @@
     method public static androidx.health.services.client.data.Value ofDoubleArray(double... doubleArray);
     method public static androidx.health.services.client.data.Value ofLong(long value);
     method public static androidx.health.services.client.data.Value sum(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final java.util.List<java.lang.Double> doubleList;
     property public final int format;
     property public final boolean isBoolean;
     property public final boolean isDouble;
     property public final boolean isDoubleArray;
     property public final boolean isLong;
-    property public final long longValue;
     field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.Value> CREATOR;
     field public static final androidx.health.services.client.data.Value.Companion Companion;
     field public static final int FORMAT_BOOLEAN = 4; // 0x4
@@ -805,6 +907,7 @@
   }
 
   public static final class Value.Companion {
+    method public int compare(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
     method public androidx.health.services.client.data.Value ofBoolean(boolean value);
     method public androidx.health.services.client.data.Value ofDouble(double value);
     method public androidx.health.services.client.data.Value ofDoubleArray(double... doubleArray);
@@ -812,40 +915,27 @@
     method public androidx.health.services.client.data.Value sum(androidx.health.services.client.data.Value first, androidx.health.services.client.data.Value second);
   }
 
-}
-
-package androidx.health.services.client.data.event {
-
-  public final class Event implements android.os.Parcelable {
-    ctor public Event(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.event.Event.TriggerType triggerType);
-    method public androidx.health.services.client.data.DataTypeCondition component1();
-    method public androidx.health.services.client.data.event.Event.TriggerType component2();
-    method public androidx.health.services.client.data.event.Event copy(androidx.health.services.client.data.DataTypeCondition dataTypeCondition, androidx.health.services.client.data.event.Event.TriggerType triggerType);
-    method public int describeContents();
-    method public androidx.health.services.client.data.DataTypeCondition getDataTypeCondition();
-    method public androidx.health.services.client.data.event.Event.TriggerType getTriggerType();
-    method public boolean isTriggered(androidx.health.services.client.data.DataPoint dataPoint);
-    method public void writeToParcel(android.os.Parcel dest, int flags);
-    property public final androidx.health.services.client.data.DataTypeCondition dataTypeCondition;
-    property public final androidx.health.services.client.data.event.Event.TriggerType triggerType;
-    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.event.Event> CREATOR;
-    field public static final androidx.health.services.client.data.event.Event.Companion Companion;
+  public final class WarmUpConfig extends androidx.health.services.client.data.ProtoParcelable<androidx.health.services.client.proto.DataProto.WarmUpConfig> {
+    ctor protected WarmUpConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public static androidx.health.services.client.data.WarmUpConfig.Builder builder();
+    method public java.util.Set<androidx.health.services.client.data.DataType> getDataTypes();
+    method public androidx.health.services.client.data.ExerciseType getExerciseType();
+    method public androidx.health.services.client.proto.DataProto.WarmUpConfig getProto();
+    property public final java.util.Set<androidx.health.services.client.data.DataType> dataTypes;
+    property public final androidx.health.services.client.data.ExerciseType exerciseType;
+    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.WarmUpConfig> CREATOR;
+    field public static final androidx.health.services.client.data.WarmUpConfig.Companion Companion;
   }
 
-  public static final class Event.Companion {
+  public static final class WarmUpConfig.Builder {
+    ctor public WarmUpConfig.Builder();
+    method public androidx.health.services.client.data.WarmUpConfig build();
+    method public androidx.health.services.client.data.WarmUpConfig.Builder setDataTypes(java.util.Set<androidx.health.services.client.data.DataType> dataTypes);
+    method public androidx.health.services.client.data.WarmUpConfig.Builder setExerciseType(androidx.health.services.client.data.ExerciseType exerciseType);
   }
 
-  public enum Event.TriggerType {
-    method public static final androidx.health.services.client.data.event.Event.TriggerType? fromId(int id);
-    method public final int getId();
-    property public final int id;
-    enum_constant public static final androidx.health.services.client.data.event.Event.TriggerType ONCE;
-    enum_constant public static final androidx.health.services.client.data.event.Event.TriggerType REPEATED;
-    field public static final androidx.health.services.client.data.event.Event.TriggerType.Companion Companion;
-  }
-
-  public static final class Event.TriggerType.Companion {
-    method public androidx.health.services.client.data.event.Event.TriggerType? fromId(int id);
+  public static final class WarmUpConfig.Companion {
+    method public androidx.health.services.client.data.WarmUpConfig.Builder builder();
   }
 
 }
diff --git a/health/health-services-client/build.gradle b/health/health-services-client/build.gradle
index 51f8485..7cb9dcc 100644
--- a/health/health-services-client/build.gradle
+++ b/health/health-services-client/build.gradle
@@ -17,10 +17,12 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
 import androidx.build.LibraryVersions
+import androidx.build.dependencies.DependenciesKt
 
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
+    id("com.google.protobuf")
     id("org.jetbrains.kotlin.android")
 }
 
@@ -30,6 +32,7 @@
     implementation(libs.guavaListenableFuture)
     implementation(libs.guavaAndroid)
     implementation("androidx.core:core-ktx:1.5.0-alpha04")
+    implementation "com.google.protobuf:protobuf-javalite:3.10.0"
 }
 
 android {
@@ -41,6 +44,25 @@
     }
 }
 
+protobuf {
+    protoc {
+        artifact = "com.google.protobuf:protoc:3.10.0"
+    }
+
+    // Generates the java proto-lite code for the protos in this project. See
+    // https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
+    // for more information.
+    generateProtoTasks {
+        all().each { task ->
+                task.builtins {
+                    java {
+                        option 'lite'
+                    }
+                }
+        }
+    }
+}
+
 androidx {
     name = "AndroidX Health Services Client Library"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/health/health-services-client/lint-baseline.xml b/health/health-services-client/lint-baseline.xml
index 5171b78..c44cc29 100644
--- a/health/health-services-client/lint-baseline.xml
+++ b/health/health-services-client/lint-baseline.xml
@@ -1,5 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-dev)" variant="all" version="7.1.0-dev">
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+    <issue
+        id="BanKeepAnnotation"
+        message="Uses @Keep annotation"
+        errorLine1="@Keep"
+        errorLine2="~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/data/AggregateDataPoints.kt"
+            line="25"
+            column="1"/>
+    </issue>
 
     <issue
         id="BanKeepAnnotation"
@@ -8,7 +19,7 @@
         errorLine2="~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/data/DataPoints.kt"
-            line="27"
+            line="28"
             column="1"/>
     </issue>
 
@@ -19,189 +30,13 @@
         errorLine2="    ~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/data/DataPoints.kt"
-            line="56"
+            line="64"
             column="5"/>
     </issue>
 
     <issue
         id="BanParcelableUsage"
         message="Class implements android.os.Parcelable"
-        errorLine1="public data class AchievedExerciseGoal("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/AchievedExerciseGoal.kt"
-            line="23"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class AutoPauseAndResumeConfigRequest("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/AutoPauseAndResumeConfigRequest.kt"
-            line="27"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class AvailabilityResponse("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/AvailabilityResponse.kt"
-            line="29"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class BackgroundRegistrationRequest("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/BackgroundRegistrationRequest.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class BackgroundUnregistrationRequest(val packageName: String) : Parcelable {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/BackgroundUnregistrationRequest.kt"
-            line="27"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class CapabilitiesRequest(val packageName: String) : Parcelable {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/CapabilitiesRequest.kt"
-            line="27"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class DataPoint"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/DataPoint.kt"
-            line="31"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class DataPointsResponse(val dataPoints: List&lt;DataPoint>) : Parcelable {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/DataPointsResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class DataType("
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/DataType.kt"
-            line="32"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class DataTypeCondition("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/DataTypeCondition.kt"
-            line="23"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class Event("
-        errorLine2="                  ~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/event/Event.kt"
-            line="25"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class EventRequest(val packageName: String, val event: Event) : Parcelable {"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/EventRequest.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseCapabilities("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseCapabilities.kt"
-            line="27"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseCapabilitiesResponse("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/ExerciseCapabilitiesResponse.kt"
-            line="29"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseConfig"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseConfig.kt"
-            line="26"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseGoal"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseGoal.kt"
-            line="26"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
         errorLine1="public data class ExerciseGoalRequest(val packageName: String, val exerciseGoal: ExerciseGoal) :"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -211,222 +46,13 @@
     </issue>
 
     <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseInfo("
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseInfo.kt"
-            line="23"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseInfoResponse(val exerciseInfo: ExerciseInfo) : Parcelable {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/ExerciseInfoResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseLapSummary("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseLapSummary.kt"
-            line="25"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseLapSummaryResponse(val exerciseLapSummary: ExerciseLapSummary) :"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/ExerciseLapSummaryResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseTypeCapabilities("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt"
-            line="23"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseUpdate("
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseUpdate.kt"
-            line="25"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class ExerciseUpdateResponse(val exerciseUpdate: ExerciseUpdate) : Parcelable {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/ExerciseUpdateResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class MeasureCapabilities("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/MeasureCapabilities.kt"
-            line="26"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class MeasureCapabilitiesResponse("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/MeasureCapabilitiesResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class MeasureRegistrationRequest("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/MeasureRegistrationRequest.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class MeasureUnregistrationRequest("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/MeasureUnregistrationRequest.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class MilestoneMarkerSummary("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/MilestoneMarkerSummary.kt"
-            line="27"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class PassiveMonitoringCapabilities("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/PassiveMonitoringCapabilities.kt"
-            line="26"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class PassiveMonitoringCapabilitiesResponse("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringCapabilitiesResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class PassiveMonitoringUpdate("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/PassiveMonitoringUpdate.kt"
-            line="29"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class PassiveMonitoringUpdateResponse("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringUpdateResponse.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class StartExerciseRequest("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/request/StartExerciseRequest.kt"
-            line="28"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class UserActivityInfo("
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/UserActivityInfo.kt"
-            line="34"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="BanParcelableUsage"
-        message="Class implements android.os.Parcelable"
-        errorLine1="public data class Value"
-        errorLine2="                  ~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/Value.kt"
-            line="24"
-            column="19"/>
-    </issue>
-
-    <issue
         id="BanSynchronizedMethods"
         message="Use of synchronized methods is not recommended"
         errorLine1="        @Synchronized"
         errorLine2="        ^">
         <location
             file="src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt"
-            line="55"
+            line="74"
             column="9"/>
     </issue>
 
@@ -437,7 +63,7 @@
         errorLine2="        ^">
         <location
             file="src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt"
-            line="63"
+            line="82"
             column="9"/>
     </issue>
 
@@ -448,7 +74,7 @@
         errorLine2="        ^">
         <location
             file="src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt"
-            line="63"
+            line="76"
             column="9"/>
     </issue>
 
@@ -459,7 +85,7 @@
         errorLine2="        ^">
         <location
             file="src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt"
-            line="86"
+            line="99"
             column="9"/>
     </issue>
 
@@ -475,36 +101,91 @@
     </issue>
 
     <issue
-        id="VisibleForTests"
-        message="This method should only be accessed from tests or within private scope"
-        errorLine1="        get() = ServiceBackedMeasureClient.getClient(applicationContext)"
-        errorLine2="                                           ~~~~~~~~~">
+        id="SyntheticAccessor"
+        message="Access to `private` field `mCurrentVersion` of class `Client` requires synthetic accessor"
+        errorLine1="                        mCurrentVersion ="
+        errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/health/services/client/impl/ServiceBackedHealthServicesClient.kt"
-            line="46"
-            column="44"/>
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="69"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="SyntheticAccessor"
+        message="Access to `private` field `mConnectionConfiguration` of class `Client` requires synthetic accessor"
+        errorLine1="                        return mConnectionConfiguration;"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="83"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="SyntheticAccessor"
+        message="Access to `private` field `mCurrentVersion` of class `Client` requires synthetic accessor"
+        errorLine1="                            mCurrentVersion ="
+        errorLine2="                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="139"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="SyntheticAccessor"
+        message="Access to `private` field `mCurrentVersion` of class `Client` requires synthetic accessor"
+        errorLine1="                            if (mCurrentVersion &lt; minApiVersion) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="141"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="SyntheticAccessor"
+        message="Access to `private` field `mCurrentVersion` of class `Client` requires synthetic accessor"
+        errorLine1="                                            mCurrentVersion, minApiVersion));"
+        errorLine2="                                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="144"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="SyntheticAccessor"
+        message="Access to `private` field `mConnectionManager` of class `Client` requires synthetic accessor"
+        errorLine1="                                mConnectionManager.scheduleForExecution("
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="146"
+            column="33"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
         message="Access to `private` method `createQueueOperation` of class `Client` requires synthetic accessor"
-        errorLine1="                                                createQueueOperation("
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="                                        createQueueOperation(operation, settableFuture));"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="133"
-            column="49"/>
+            line="147"
+            column="41"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` method `getTypeToCapabilityMap` of class `Companion` requires synthetic accessor"
-        errorLine1="                    val typeToCapabilitiesFromParcel = getTypeToCapabilityMap(parcel)"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~">
+        message="Access to `private` method `getService` of class `Client` requires synthetic accessor"
+        errorLine1="                operation.execute(getService(binder), settableFuture);"
+        errorLine2="                                  ~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseCapabilities.kt"
-            line="83"
-            column="56"/>
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="266"
+            column="35"/>
     </issue>
 
     <issue
@@ -514,62 +195,18 @@
         errorLine2="                          ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/data/ExerciseType.kt"
-            line="114"
+            line="121"
             column="27"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` method `writeSupportedDataTypes` of class `Companion` requires synthetic accessor"
-        errorLine1="        writeSupportedDataTypes(supportedGoals, dest, flags)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt"
-            line="36"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `writeSupportedDataTypes` of class `Companion` requires synthetic accessor"
-        errorLine1="        writeSupportedDataTypes(supportedMilestones, dest, flags)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt"
-            line="37"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `readSupportedDataTypes` of class `Companion` requires synthetic accessor"
-        errorLine1="                    val supportedGoals = readSupportedDataTypes(source) ?: return null"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt"
-            line="51"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `readSupportedDataTypes` of class `Companion` requires synthetic accessor"
-        errorLine1="                    val supportedMilestones = readSupportedDataTypes(source) ?: return null"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt"
-            line="52"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
         message="Access to `private` constructor of class `ExerciseUpdateListenerStub` requires synthetic accessor"
         errorLine1="            return listeners.getOrPut(listener) { ExerciseUpdateListenerStub(listener, executor) }"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt"
-            line="60"
+            line="79"
             column="51"/>
     </issue>
 
@@ -580,52 +217,19 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt"
-            line="79"
+            line="92"
             column="39"/>
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `Value` requires synthetic accessor"
-        errorLine1="                            return Value(format, listOf(), parcel.readLong())"
-        errorLine2="                                   ~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/Value.kt"
-            line="142"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `Value` requires synthetic accessor"
-        errorLine1="                            return Value(format, listOf(parcel.readDouble()), /* longValue= */ 0)"
-        errorLine2="                                   ~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/Value.kt"
-            line="144"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `Value` requires synthetic accessor"
-        errorLine1="                            return Value(format, doubleArray.toList(), /* longValue= */ 0)"
-        errorLine2="                                   ~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/data/Value.kt"
-            line="148"
-            column="36"/>
-    </issue>
-
-    <issue
         id="LambdaLast"
         message="Functional interface parameters (such as parameter 1, &quot;operation&quot;, in androidx.health.services.client.impl.ipc.Client.executeWithVersionCheck) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
-        errorLine1="            ServiceOperation&lt;R> operation, int minApiVersion) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~">
+        errorLine1="            RemoteFutureOperation&lt;S, R> operation, int minApiVersion) {"
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="115"
-            column="44"/>
+            line="130"
+            column="52"/>
     </issue>
 
     <issue
@@ -697,33 +301,11 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        Integer readVersion(IBinder binder) throws RemoteException;"
-        errorLine2="        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="53"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        Integer readVersion(IBinder binder) throws RemoteException;"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="53"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="            ClientConfiguration clientConfiguration,"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="65"
+            line="61"
             column="13"/>
     </issue>
 
@@ -734,47 +316,58 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="66"
+            line="62"
             column="13"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            VersionGetter versionGetter) {"
-        errorLine2="            ~~~~~~~~~~~~~">
+        errorLine1="            ServiceGetter&lt;S> serviceGetter,"
+        errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="67"
+            line="63"
             column="13"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected &lt;R> ListenableFuture&lt;R> execute(ServiceOperation&lt;R> operation) {"
+        errorLine1="            RemoteOperation&lt;S, Integer> remoteVersionGetter) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="64"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> execute(RemoteOperation&lt;S, R> operation) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="107"
+            line="102"
             column="19"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected &lt;R> ListenableFuture&lt;R> execute(ServiceOperation&lt;R> operation) {"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> execute(RemoteOperation&lt;S, R> operation) {"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="107"
+            line="102"
             column="47"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected &lt;R> ListenableFuture&lt;R> executeWithVersionCheck("
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> execute(RemoteFutureOperation&lt;S, R> operation) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
@@ -785,11 +378,33 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            ServiceOperation&lt;R> operation, int minApiVersion) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> execute(RemoteFutureOperation&lt;S, R> operation) {"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="115"
+            line="114"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> executeWithVersionCheck("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="129"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="            RemoteFutureOperation&lt;S, R> operation, int minApiVersion) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="130"
             column="13"/>
     </issue>
 
@@ -800,29 +415,62 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="173"
+            line="184"
             column="19"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            ListenerKey listenerKey, ServiceOperation&lt;R> registerListenerOperation) {"
+        errorLine1="            ListenerKey listenerKey, RemoteOperation&lt;S, R> registerListenerOperation) {"
         errorLine2="            ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="174"
+            line="185"
             column="13"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            ListenerKey listenerKey, ServiceOperation&lt;R> registerListenerOperation) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="            ListenerKey listenerKey, RemoteOperation&lt;S, R> registerListenerOperation) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="174"
+            line="185"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> registerListener("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="205"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="            ListenerKey listenerKey, RemoteFutureOperation&lt;S, R> registerListenerOperation) {"
+        errorLine2="            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="206"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="            ListenerKey listenerKey, RemoteFutureOperation&lt;S, R> registerListenerOperation) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="206"
             column="38"/>
     </issue>
 
@@ -833,29 +481,62 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="193"
+            line="223"
             column="19"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            ListenerKey listenerKey, ServiceOperation&lt;R> unregisterListenerOperation) {"
+        errorLine1="            ListenerKey listenerKey, RemoteOperation&lt;S, R> unregisterListenerOperation) {"
         errorLine2="            ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="194"
+            line="224"
             column="13"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            ListenerKey listenerKey, ServiceOperation&lt;R> unregisterListenerOperation) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="            ListenerKey listenerKey, RemoteOperation&lt;S, R> unregisterListenerOperation) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="194"
+            line="224"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    protected &lt;R> ListenableFuture&lt;R> unregisterListener("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="241"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="            ListenerKey listenerKey, RemoteFutureOperation&lt;S, R> unregisterListenerOperation) {"
+        errorLine2="            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="242"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="            ListenerKey listenerKey, RemoteFutureOperation&lt;S, R> unregisterListenerOperation) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="242"
             column="38"/>
     </issue>
 
@@ -866,7 +547,7 @@
         errorLine2="              ~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="203"
+            line="249"
             column="15"/>
     </issue>
 
@@ -1203,6 +884,17 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    void execute(S service, SettableFuture&lt;R> resultFuture) throws RemoteException;"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/RemoteFutureOperation.java"
+            line="44"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        void onConnected(ServiceConnection connection);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~">
         <location
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseApiService.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseApiService.aidl
index 54ca575..c4f225e 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseApiService.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseApiService.aidl
@@ -21,14 +21,16 @@
 import androidx.health.services.client.impl.internal.IStatusCallback;
 import androidx.health.services.client.impl.request.AutoPauseAndResumeConfigRequest;
 import androidx.health.services.client.impl.request.CapabilitiesRequest;
+import androidx.health.services.client.impl.request.FlushRequest;
 import androidx.health.services.client.impl.request.ExerciseGoalRequest;
+import androidx.health.services.client.impl.request.PrepareExerciseRequest;
 import androidx.health.services.client.impl.request.StartExerciseRequest;
 import androidx.health.services.client.impl.response.ExerciseCapabilitiesResponse;
 
 /**
  * Interface to make ipc calls for health services exercise api.
  *
- * The next method added to the interface should use ID: 12
+ * The next method added to the interface should use ID: 15
  * (this id needs to be incremented for each added method)
  *
  * @hide
@@ -50,6 +52,11 @@
     int getApiVersion() = 0;
 
     /**
+     * Handles a given request to prepare an exercise.
+     */
+    void prepareExercise(in PrepareExerciseRequest prepareExerciseRequest, IStatusCallback statusCallback) = 14;
+
+    /**
      * Handles a given request to start an exercise.
      */
     void startExercise(in StartExerciseRequest startExerciseRequest, IStatusCallback statusCallback) = 1;
@@ -100,6 +107,15 @@
     void addGoalToActiveExercise(in ExerciseGoalRequest request, IStatusCallback statusCallback) = 9;
 
     /**
+     * Removes an exercise goal for an active exercise.
+     *
+     * <p>Takes into account equivalent milestones (i.e. milestones which are not equal but are
+     * different representation of a common milestone. e.g. milestone A for every 2kms, currently
+     * at threshold of 10kms, and milestone B for every 2kms, currently at threshold of 8kms).
+     */
+    void removeGoalFromActiveExercise(in ExerciseGoalRequest request, IStatusCallback statusCallback) = 13;
+
+    /**
      * Sets whether auto-pause should be enabled
      */
     void overrideAutoPauseAndResumeForActiveExercise(in AutoPauseAndResumeConfigRequest request, IStatusCallback statusCallback) = 10;
@@ -108,4 +124,7 @@
      * Method to get capabilities.
      */
     ExerciseCapabilitiesResponse getCapabilities(in CapabilitiesRequest request) = 11;
-}
\ No newline at end of file
+
+    /** Method to flush data metrics. */
+    void flushExercise(in FlushRequest request, in IStatusCallback statusCallback) = 12;
+}
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseUpdateListener.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseUpdateListener.aidl
index df6420bd..eaa41b4 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseUpdateListener.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IExerciseUpdateListener.aidl
@@ -16,6 +16,8 @@
 
 package androidx.health.services.client.impl;
 
+import androidx.health.services.client.impl.event.ExerciseUpdateListenerEvent;
+import androidx.health.services.client.impl.response.AvailabilityResponse;
 import androidx.health.services.client.impl.response.ExerciseLapSummaryResponse;
 import androidx.health.services.client.impl.response.ExerciseUpdateResponse;
 
@@ -25,9 +27,6 @@
  * @hide
  */
 oneway interface IExerciseUpdateListener {
-    /** Called when there is an update of exercise state or metrics. */
-    void onExerciseUpdate(in ExerciseUpdateResponse update) = 0;
-
-    /** Called when a lap has been marked. */
-    void onLapSummary(in ExerciseLapSummaryResponse summaryResponse) = 1;
+    /** Called when there is an exercise update event. */
+    void onExerciseUpdateListenerEvent(in ExerciseUpdateListenerEvent event) = 0;
 }
\ No newline at end of file
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IMeasureCallback.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IMeasureCallback.aidl
index ff7f983..fd2fc2c 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IMeasureCallback.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IMeasureCallback.aidl
@@ -16,8 +16,7 @@
 
 package androidx.health.services.client.impl;
 
-import androidx.health.services.client.impl.response.AvailabilityResponse;
-import androidx.health.services.client.impl.response.DataPointsResponse;
+import androidx.health.services.client.impl.event.MeasureCallbackEvent;
 
 /**
  * Interface to get callback for measure api.
@@ -25,7 +24,5 @@
  * @hide
  */
 oneway interface IMeasureCallback {
-    void onAvailabilityChanged(in AvailabilityResponse response) = 0;
-
-    void onData(in DataPointsResponse response) = 1;
+    void onMeasureCallbackEvent(in MeasureCallbackEvent event) = 0;
 }
\ No newline at end of file
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringApiService.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringApiService.aidl
index 1bf6bc3..2402cafd 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringApiService.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringApiService.aidl
@@ -16,12 +16,12 @@
 
 package androidx.health.services.client.impl;
 
-import android.app.PendingIntent;
 import androidx.health.services.client.impl.IPassiveMonitoringCallback;
 import androidx.health.services.client.impl.internal.IStatusCallback;
 import androidx.health.services.client.impl.request.BackgroundRegistrationRequest;
 import androidx.health.services.client.impl.request.CapabilitiesRequest;
-import androidx.health.services.client.impl.request.EventRequest;
+import androidx.health.services.client.impl.request.FlushRequest;
+import androidx.health.services.client.impl.request.PassiveGoalRequest;
 import androidx.health.services.client.impl.response.PassiveMonitoringCapabilitiesResponse;
 
 /** @hide */
@@ -30,7 +30,7 @@
      * API version of the AIDL interface. Should be incremented every time a new
      * method is added.
      */
-    const int API_VERSION = 1;
+    const int API_VERSION = 2;
 
     /**
      * Returns version of this AIDL interface.
@@ -41,18 +41,18 @@
     int getApiVersion() = 0;
 
     /**
-     * Method to subscribe to an event with corresponding callback intent.
+     * Method to subscribe to an passive goal with corresponding callback intent.
      */
-    void registerEventCallback(in EventRequest request, in PendingIntent intent, in IStatusCallback statusCallback) = 1;
+    void registerPassiveGoalCallback(in PassiveGoalRequest request, in IStatusCallback statusCallback) = 1;
 
     /**
      * Method to subscribe to a set of data types with corresponding callback
      * intent and an optional callback.
      *
      * <p>If a callback is present and is active, updates are provided via the callback. Otherwise,
-     * the provided PendingIntent gets the updates.
+     * an intent will be broadcast with the data.
      */
-    void registerDataCallback(in BackgroundRegistrationRequest request, in PendingIntent fallbackIntent, in IPassiveMonitoringCallback callback, in IStatusCallback statusCallback) = 2;
+    void registerDataCallback(in BackgroundRegistrationRequest request, in IPassiveMonitoringCallback callback, in IStatusCallback statusCallback) = 2;
 
     /**
      * Method to subscribe to a set of data types with corresponding callback intent.
@@ -62,8 +62,11 @@
     /**
      * Method to subscribe to a set of data types with corresponding callback intent.
      */
-    void unregisterEventCallback(in EventRequest request, in IStatusCallback statusCallback) = 4;
+    void unregisterPassiveGoalCallback(in PassiveGoalRequest request, in IStatusCallback statusCallback) = 4;
 
     /** Method to get capabilities. */
     PassiveMonitoringCapabilitiesResponse getCapabilities(in CapabilitiesRequest request) = 5;
+
+    /** Method to flush data metrics. */
+    void flush(in FlushRequest request, in IStatusCallback statusCallback) = 6;
 }
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringCallback.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringCallback.aidl
index 25a39d7..0d7163b 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringCallback.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/IPassiveMonitoringCallback.aidl
@@ -16,7 +16,7 @@
 
 package androidx.health.services.client.impl;
 
-import androidx.health.services.client.impl.response.PassiveMonitoringUpdateResponse;
+import androidx.health.services.client.impl.event.PassiveCallbackEvent;
 
 /**
  * Interface to get passive monitoring updates.
@@ -24,6 +24,5 @@
  * @hide
  */
 oneway interface IPassiveMonitoringCallback {
-    /** Called when a new passive monitoring update response is available. */
-    void onPassiveMonitoringUpdate(in PassiveMonitoringUpdateResponse response) = 0;
+    void onPassiveCallbackEvent(in PassiveCallbackEvent event) = 0;
 }
\ No newline at end of file
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/ExerciseUpdateListenerEvent.aidl
similarity index 86%
rename from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
rename to health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/ExerciseUpdateListenerEvent.aidl
index 6464078..c1c8f56 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/ExerciseUpdateListenerEvent.aidl
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.health.services.client.impl.event;
 
 /** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+parcelable ExerciseUpdateListenerEvent;
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/MeasureCallbackEvent.aidl
similarity index 86%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
copy to health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/MeasureCallbackEvent.aidl
index 6464078..fe2e44c 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/MeasureCallbackEvent.aidl
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.health.services.client.impl.event;
 
 /** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+parcelable MeasureCallbackEvent;
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/PassiveCallbackEvent.aidl
similarity index 86%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
copy to health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/PassiveCallbackEvent.aidl
index 6464078..6d971c7 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/event/PassiveCallbackEvent.aidl
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.health.services.client.impl.event;
 
 /** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+parcelable PassiveCallbackEvent;
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/FlushRequest.aidl
similarity index 86%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
copy to health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/FlushRequest.aidl
index 6464078..358fc36 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/FlushRequest.aidl
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.health.services.client.impl.request;
 
 /** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+parcelable FlushRequest;
\ No newline at end of file
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/PassiveGoalRequest.aidl
similarity index 86%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
copy to health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/PassiveGoalRequest.aidl
index 6464078..362d56f 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/PassiveGoalRequest.aidl
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.health.services.client.impl.request;
 
 /** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+parcelable PassiveGoalRequest;
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/PrepareExerciseRequest.aidl
similarity index 86%
copy from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
copy to health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/PrepareExerciseRequest.aidl
index 6464078..9bb2a65 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/HeartRateAlertParamsResponse.aidl
+++ b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/request/PrepareExerciseRequest.aidl
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
+package androidx.health.services.client.impl.request;
 
 /** @hide */
-parcelable HeartRateAlertParamsResponse;
\ No newline at end of file
+parcelable PrepareExerciseRequest;
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseDetectionStateResponse.aidl b/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseDetectionStateResponse.aidl
deleted file mode 100644
index 4b38fe1..0000000
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseDetectionStateResponse.aidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.impl.response;
-
-/** @hide */
-parcelable AutoExerciseDetectionStateResponse;
\ No newline at end of file
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseClient.kt
index 2737346..2ef3f84 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseClient.kt
@@ -21,38 +21,87 @@
 import androidx.health.services.client.data.ExerciseGoal
 import androidx.health.services.client.data.ExerciseInfo
 import androidx.health.services.client.data.ExerciseUpdate
+import androidx.health.services.client.data.WarmUpConfig
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.Executor
 
 /** Client which provides a way to subscribe to the health data of a device during an exercise. */
 public interface ExerciseClient {
     /**
+     * Prepares for a new exercise.
+     *
+     * Once called, Health Services will warmup the sensors based on the [ExerciseType] and
+     * requested [DataType]s
+     *
+     * If the calling app already has an active exercise in progress or if it does not have the
+     * required permissions, then this call returns a failed future. If another app owns the active
+     * exercise then this call will succeed.
+     *
+     * Sensors available for warmup are GPS [DataType.LOCATION] and HeartRate
+     * [DataType.HEART_RATE_BPM]. Other [DataType]s requested for warmup based on exercise
+     * capabilities will be a no-op for the prepare stage.
+     *
+     * The DataType availability can be obtained through the
+     * [ExerciseUpdateListener.onAvailabilityChanged] callback. [ExerciseUpdate]s with the supported
+     * DataType [DataPoint] will also be returned in the [ExerciseState#PREPARING] state, though no
+     * aggregation will occur until the exercise is started.
+     *
+     * If an app is actively preparing and another app starts tracking an active exercise then the
+     * preparing app should expect to receive an [ExerciseUpdate] with [ExerciseState#TERMINATED]
+     * indicating that their session has been superseded and ended. At that point no additional
+     * updates to availability or data will be sent until the app calls prepareExercise again.
+     *
+     * @return a [ListenableFuture] that completes once Health Services starts preparing the sensors
+     * or fails due to missing permissions or the app owning another active exercise.
+     */
+    public fun prepareExercise(configuration: WarmUpConfig): ListenableFuture<Void>
+
+    /**
      * Starts a new exercise.
      *
      * Once started, Health Services will begin collecting data associated with the exercise.
      *
      * Since Health Services only allows a single active exercise at a time, this will terminate any
-     * active exercise currently in progress before starting the new one.
+     * active exercise currently in progress before starting the new one. If this occurs, clients
+     * can expect to receive an [ExerciseUpdate] with [ExerciseState#TERMINATED], indicating that
+     * their exercise has been superseded and that no additional updates will be sent. Clients can
+     * use [currentExerciseInfo] (described below) to check if they or another app has an active
+     * exercise in-progress.
      *
-     * @return a [ListenableFuture] that completes once the exercise has been started.
+     * If the client fails to maintain a live [ExerciseStateListener] for at least five minutes
+     * during the duration of the exercise, Health Services can decide to terminate the exercise. If
+     * this occurs, clients can expect to receive an [ExerciseUpdate] with
+     * [ExerciseState#AUTO_ENDED] indicating that their exercise has been automatically ended due to
+     * the lack of listener.
+     *
+     * Clients should only request [ExerciseType]s, [DataType]s, goals, and auto-pause enabled that
+     * matches the [ExerciseCapabilities] returned by [capabilities] since Health Services will
+     * reject requests asking for unsupported configurations.
+     *
+     * @return a [ListenableFuture] that completes once the exercise has been started or fails due
+     * to the application missing the required permissions or requesting metrics which are not
+     * supported for the given [ExerciseType].
      */
     public fun startExercise(configuration: ExerciseConfig): ListenableFuture<Void>
 
     /**
      * Pauses the current exercise, if it is currently started.
      *
-     * While the exercise is paused active time and cumulative metrics such as distance will not
-     * accumulate. Instantaneous measurements such as speed and heart rate will continue to update
-     * if requested in the [ExerciseConfig].
+     * Before transitioning to [ExerciseState.PAUSED], Health Services will flush and return the
+     * sensor data. While the exercise is paused, active time and cumulative metrics such as
+     * distance will not accumulate. Instantaneous measurements such as speed and heart rate will
+     * continue to update if requested in the [ExerciseConfig].
      *
-     * If the exercise remains paused for a long period of time, Health Services will reduce or
-     * suspend access to sensors and GPS in order to conserve battery. Should this happen, access
-     * will automatically resume when the exercise is resumed.
+     * Note that GPS and other sensors may be stopped when the exercise is paused in order to
+     * conserve battery. This may happen immediately, or after some time. (The exact behavior is
+     * hardware dependent.) Should this happen, access will automatically resume when the exercise
+     * is resumed.
      *
      * If the exercise is already paused then this method has no effect. If the exercise has ended
      * then the returned future will fail.
      *
-     * @return a [ListenableFuture] that completes once the exercise has been paused.
+     * @return a [ListenableFuture] that completes once the exercise has been paused or fails if the
+     * calling application does not own the active exercise.
      */
     public fun pauseExercise(): ListenableFuture<Void>
 
@@ -64,20 +113,36 @@
      * If the exercise has been started but is not currently paused this method has no effect. If
      * the exercise has ended then the returned future will fail.
      *
-     * @return a [ListenableFuture] that completes once the exercise has been resumed.
+     * @return a [ListenableFuture] that completes once the exercise has been resumed or fails if
+     * the calling application does not own the active exercise.
      */
     public fun resumeExercise(): ListenableFuture<Void>
 
     /**
-     * Ends the current exercise, if it has been started. If the exercise has ended then this future
-     * will fail.
+     * Ends the current exercise, if it has been started.
+     *
+     * Health Services will flush and then shut down the active sensors and return an
+     * [ExerciseUpdate] with [ExerciseState#USER_ENDED] to the [ExerciseUpdateListener]. If the
+     * exercise has ended then this future will fail.
      *
      * No additional metrics will be produced for the exercise and any on device persisted data
      * about the exercise will be deleted after the summary has been sent back.
+     *
+     * @return a [ListenableFuture] that completes once the exercise has been ended or fails if the
+     * calling application does not own the active exercise.
      */
     public fun endExercise(): ListenableFuture<Void>
 
     /**
+     * Flushes the sensors for the active exercise. This call should be used sparingly and will be
+     * subject to throttling by Health Services.
+     *
+     * @return a [ListenableFuture] that completes once the flush has been completed or fails if the
+     * calling application does not own the active exercise.
+     */
+    public fun flushExercise(): ListenableFuture<Void>
+
+    /**
      * Ends the current lap, calls [ExerciseStateListener.onLapSummary] with data spanning the
      * marked lap and starts a new lap. If the exercise supports laps this method can be called at
      * any point after an exercise has been started and before it has been ended regardless of the
@@ -91,18 +156,31 @@
      */
     public fun markLap(): ListenableFuture<Void>
 
-    /** Returns the [ExerciseInfo]. */
+    /**
+     * Returns the current [ExerciseInfo].
+     *
+     * This can be used by clients to determine if they or another app already owns an active
+     * exercise being tracked by Health Services. For example, if an app is killed and it learns it
+     * owns the active exercise it can register a new [ExerciseUpdateListener] and pick tracking up
+     * from where it left off.
+     */
     public val currentExerciseInfo: ListenableFuture<ExerciseInfo>
 
     /**
      * Sets the listener for the current [ExerciseUpdate].
      *
-     * This listener won't be called until an exercise is in progress. It will also only receive
-     * updates from exercises tracked in this app.
+     * This listener won't be called until the calling application prepares or starts an exercise.
+     * It will only receive updates from exercises tracked by this app.
      *
      * If an exercise is in progress, the [ExerciseUpdateListener] is immediately called with the
      * associated [ExerciseUpdate], and subsequently whenever the state is updated or an event is
-     * triggered.
+     * triggered. Health Services will cache [ExerciseUpdate]s of an active exercise that are
+     * generated while a listener is not active (for example, due to the app getting killed) and
+     * deliver them as soon as the listener is registered again. If the client fails to maintain a
+     * live [ExerciseStateListener] for at least five minutes during the duration of the exercise
+     * Health Services can decide to terminate the exercise automatically. If this occurs, clients
+     * can expect to receive an [ExerciseUpdate] with [ExerciseState#AUTO_ENDED] indicating that
+     * their exercise has been automatically ended due to the lack of listener.
      *
      * Calls to the listener will be executed on the main application thread. To control where to
      * execute the listener, see the overload taking an [Executor]. To remove the listener use
@@ -122,30 +200,51 @@
     /**
      * Clears the listener set using [setUpdateListener].
      *
-     * If the listener wasn't set, the returned [ListenableFuture] will fail.
+     * If this listener is not already registered then this will be a no-op.
+     *
+     * @return a [ListenableFuture] that completes once the listener has been cleared (or verified
+     * not to be set).
      */
     public fun clearUpdateListener(listener: ExerciseUpdateListener): ListenableFuture<Void>
 
     /**
      * Adds an [ExerciseGoal] for an active exercise.
      *
-     * An [ExerciseGoal] is a one-time goal, such as achieving a target total step count.
-     *
      * Goals apply to only active exercises owned by the client, and will be invalidated once the
      * exercise is complete.
      *
      * @return a [ListenableFuture] that completes once the exercise goal has been added. This
-     * returned [ListenableFuture] fails if the exercise is not active.
+     * returned [ListenableFuture] fails if the calling app does not own the active exercise.
      */
     public fun addGoalToActiveExercise(exerciseGoal: ExerciseGoal): ListenableFuture<Void>
 
     /**
-     * Enables or disables the auto pause/resume for the current exercise.
+     * Removes an exercise goal for an active exercise.
+     *
+     * Takes into account equivalent milestones (i.e. milestones which are not equal but are
+     * different representation of a common milestone. e.g. milestone A for every 2kms, currently at
+     * threshold of 10kms, and milestone B for every 2kms, currently at threshold of 8kms).
+     *
+     * @return a [ListenableFuture] that completes once the exercise goal has been removed. This
+     * returned [ListenableFuture] fails if the exercise is not active, and will be a no-op if
+     * [exerciseGoal] has not been added in the past.
+     */
+    public fun removeGoalFromActiveExercise(exerciseGoal: ExerciseGoal): ListenableFuture<Void>
+
+    /**
+     * Enables or disables auto pause/resume for the current exercise.
      *
      * @param enabled a boolean to indicate if should be enabled or disabled
      */
     public fun overrideAutoPauseAndResumeForActiveExercise(enabled: Boolean): ListenableFuture<Void>
 
-    /** Returns the [ExerciseCapabilities] of this client for the device. */
+    /**
+     * Returns the [ExerciseCapabilities] of this client for the device.
+     *
+     * This can be used to determine what [ExerciseType]s and [DataType]s this device supports.
+     * Clients should use the capabilities to inform their requests since Health Services will
+     * typically reject requests made for [DataTypes] or features (such as auto-pause) which are not
+     * enabled for the rejected [ExerciseType].
+     */
     public val capabilities: ListenableFuture<ExerciseCapabilities>
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseUpdateListener.kt b/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseUpdateListener.kt
index d622d43..b6c8f9b 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseUpdateListener.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/ExerciseUpdateListener.kt
@@ -16,6 +16,8 @@
 
 package androidx.health.services.client
 
+import androidx.health.services.client.data.Availability
+import androidx.health.services.client.data.DataType
 import androidx.health.services.client.data.ExerciseLapSummary
 import androidx.health.services.client.data.ExerciseState
 import androidx.health.services.client.data.ExerciseUpdate
@@ -28,4 +30,7 @@
 
     /** Called during an ACTIVE exercise once a lap has been marked. */
     public fun onLapSummary(lapSummary: ExerciseLapSummary)
+
+    /** Called during an ACTIVE exercise when the availability of a [DataType] changes. */
+    public fun onAvailabilityChanged(dataType: DataType, availability: Availability)
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/MeasureClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/MeasureClient.kt
index 782ae0d..4aa9510 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/MeasureClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/MeasureClient.kt
@@ -43,7 +43,10 @@
      *
      * Registering a [DataType] for live measurement capture is expected to increase the sample rate
      * on the associated sensor(s); this is typically used for one-off measurements. Do not use this
-     * method for background capture or workout tracking.
+     * method for background capture or workout tracking. The client is responsible for ensuring
+     * that their requested [DataType] is supported on this device by checking the
+     * [MeasureCapabilities]. The returned future will fail if the request is not supported on a
+     * given device.
      *
      * The callback will continue to be called until the app is killed or [unregisterCallback] is
      * called.
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/PassiveMonitoringClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/PassiveMonitoringClient.kt
index 23793f7..298a7cc 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/PassiveMonitoringClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/PassiveMonitoringClient.kt
@@ -16,10 +16,13 @@
 
 package androidx.health.services.client
 
-import android.app.PendingIntent
+import android.content.BroadcastReceiver
+import android.content.ComponentName
 import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.PassiveGoal
 import androidx.health.services.client.data.PassiveMonitoringCapabilities
-import androidx.health.services.client.data.event.Event
+import androidx.health.services.client.data.PassiveMonitoringConfig
+import androidx.health.services.client.data.PassiveMonitoringUpdate
 import com.google.common.util.concurrent.ListenableFuture
 
 /**
@@ -27,8 +30,8 @@
  *
  * The lifetimes of registrations made through this client are independent of the lifetime of the
  * subscribing app. These registrations are therefore suitable for notifying of ongoing measurements
- * or triggered events, regardless of whether or not the subscribing app is currently running, in
- * the foreground or engaged in a workout.
+ * or triggered passive goals, regardless of whether or not the subscribing app is currently
+ * running, in the foreground or engaged in a workout.
  */
 public interface PassiveMonitoringClient {
     /**
@@ -37,62 +40,74 @@
      * Data will be batched. Higher frequency updates are available through [ExerciseClient] or
      * [MeasureClient].
      *
-     * The provided [PendingIntent] will be invoked periodically with the collected data.
+     * The data will be broadcast to the provided [ComponentName] periodically to the action:
+     * [PassiveMonitoringUpdate.INTENT_DATA_ACTION]. A [PassiveMonitoringUpdate] can be extracted
+     * from the intent using [PassiveMonitoringUpdate.fromIntent].
      *
-     * Subscribing apps are responsible for ensuring they can receive the [callbackIntent] by e.g.
-     * declaring a suitable [android.content.BroadcastReceiver] in their app manifest.
+     * Subscribing apps are responsible for ensuring they can receive the intent by e.g. declaring a
+     * suitable [BroadcastReceiver] in their app manifest.
      *
      * This registration is unique per subscribing app. Subsequent registrations will replace the
-     * previous registration, if one had been made.
+     * previous registration, if one had been made. The client is responsible for ensuring that
+     * their requested [PassiveMonitoringConfig] is supported on this device by checking the
+     * [PassiveMonitoringCapabilities]. The returned future will fail if the request is not
+     * supported on a given device.
      */
-    public fun registerDataCallback(
-        dataTypes: Set<@JvmSuppressWildcards DataType>,
-        callbackIntent: PendingIntent
-    ): ListenableFuture<Void>
+    public fun registerDataCallback(configuration: PassiveMonitoringConfig): ListenableFuture<Void>
 
     /**
      * Subscribes an intent callback (the same way as [PassiveMonitoringClient.registerDataCallback]
      * ) and a [PassiveMonitoringCallback] for updates on a set of data types periodically.
      *
      * The provided [callback] will take priority in receiving updates as long the app is alive and
-     * the callback can be successfully notified. Otherwise, updates will be delivered to the
-     * [callbackIntent].
+     * the callback can be successfully notified. Otherwise, updates will be delivered via Intent to
+     * the [componentName] with the provided actionName.
      *
      * This registration is unique per subscribing app. Subsequent registrations will replace the
      * previous registration, if one had been made.
      */
+    @SuppressWarnings("ExecutorRegistration")
     public fun registerDataCallback(
-        dataTypes: Set<@JvmSuppressWildcards DataType>,
-        callbackIntent: PendingIntent,
+        configuration: PassiveMonitoringConfig,
         callback: PassiveMonitoringCallback
     ): ListenableFuture<Void>
 
     /**
      * Unregisters the subscription made by [PassiveMonitoringClient.registerDataCallback].
      *
-     * The associated [PendingIntent] will be called one last time with any remaining buffered data.
+     * The [Intent] will be broadcast to the [ComponentName] one last time with any remaining
+     * buffered data.
      */
     public fun unregisterDataCallback(): ListenableFuture<Void>
 
     /**
-     * Registers for notification of the [event] being triggered.
+     * Registers for notification of the [passiveGoal] being triggered.
      *
-     * The provided [PendingIntent] will be sent whenever [event] is triggered.
+     * An Intent will be broadcast to the provided [ComponentName] with the action
+     * [PassiveMonitoringUpdate.INTENT_GOAL_ACTION] whenever the [passiveGoal] is triggered.
      *
-     * Subscribing apps are responsible for ensuring they can receive the [callbackIntent] by e.g.
-     * declaring a suitable [android.content.BroadcastReceiver] in their app manifest.
+     * Subscribing apps are responsible for ensuring they can receive the intent by e.g. declaring a
+     * suitable [BroadcastReceiver] in their app manifest.
      *
-     * Registration of multiple events is possible except where there already exists an event that
-     * is equal, as per the definition of [Event.equals], in which case the existing registration
-     * for that event will be replaced.
+     * Registration of multiple passive goals is possible except where there already exists an
+     * passive goal that is equal, as per the definition of [PassiveGoal.equals], in which case the
+     * existing registration for that passive goal will be replaced.
      */
-    public fun registerEventCallback(
-        event: Event,
-        callbackIntent: PendingIntent
+    public fun registerPassiveGoalCallback(
+        passiveGoal: PassiveGoal,
+        componentName: ComponentName,
     ): ListenableFuture<Void>
 
-    /** Unregisters the subscription for the given [Event]. */
-    public fun unregisterEventCallback(event: Event): ListenableFuture<Void>
+    /** Unregisters the subscription for the given [PassiveGoal]. */
+    public fun unregisterPassiveGoalCallback(passiveGoal: PassiveGoal): ListenableFuture<Void>
+
+    /**
+     * Flushes the sensors for the registered [DataType]s.
+     *
+     * If no intent has been registered by this client, this will be a no-op. This call should be
+     * used sparingly and will be subject to throttling by Health Services.
+     */
+    public fun flush(): ListenableFuture<Void>
 
     /** Returns the [PassiveMonitoringCapabilities] of this client for the device. */
     public val capabilities: ListenableFuture<PassiveMonitoringCapabilities>
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/AchievedExerciseGoal.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/AchievedExerciseGoal.kt
index 6463d58..59414b8 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/AchievedExerciseGoal.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/AchievedExerciseGoal.kt
@@ -16,38 +16,36 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
 
 /** Defines an achieved [ExerciseGoal]. */
-public data class AchievedExerciseGoal(
+@Suppress("ParcelCreator")
+public class AchievedExerciseGoal(
     /** [ExerciseGoal] that has been achieved. */
     // TODO(b/181235444): do we need to deliver the DataPoint to the user again here, given
     // that they will have already gotten it in the ExerciseState? And, what other data do we need
     // to
     // tag along an achieved ExerciseGoal?
-    val goal: ExerciseGoal,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val goal: ExerciseGoal,
+) : ProtoParcelable<DataProto.AchievedExerciseGoal>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(goal, flags)
+    internal constructor(
+        proto: DataProto.AchievedExerciseGoal
+    ) : this(ExerciseGoal(proto.exerciseGoal))
+
+    /** @hide */
+    override val proto: DataProto.AchievedExerciseGoal by lazy {
+        DataProto.AchievedExerciseGoal.newBuilder().setExerciseGoal(goal.proto).build()
     }
 
+    override fun toString(): String = "AchievedExerciseGoal(goal=$goal)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<AchievedExerciseGoal> =
-            object : Parcelable.Creator<AchievedExerciseGoal> {
-                override fun createFromParcel(source: Parcel): AchievedExerciseGoal? {
-                    val goal =
-                        source.readParcelable<ExerciseGoal>(ExerciseGoal::class.java.classLoader)
-                            ?: return null
-                    return AchievedExerciseGoal(goal)
-                }
-
-                override fun newArray(size: Int): Array<AchievedExerciseGoal?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<AchievedExerciseGoal> = newCreator {
+            val proto = DataProto.AchievedExerciseGoal.parseFrom(it)
+            AchievedExerciseGoal(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/AggregateDataPoint.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/AggregateDataPoint.kt
new file mode 100644
index 0000000..2edd65a
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/AggregateDataPoint.kt
@@ -0,0 +1,21 @@
+package androidx.health.services.client.data
+
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.AggregateCase.AGGREGATE_NOT_SET
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.AggregateCase.CUMULATIVE_DATA_POINT
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.AggregateCase.STATISTICAL_DATA_POINT
+
+/** Accuracy of a [DataPoint]. */
+@Suppress("ParcelCreator", "ParcelNotFinal")
+public abstract class AggregateDataPoint : ProtoParcelable<DataProto.AggregateDataPoint>() {
+
+    internal companion object {
+        internal fun fromProto(proto: DataProto.AggregateDataPoint): AggregateDataPoint =
+            when (proto.aggregateCase) {
+                CUMULATIVE_DATA_POINT -> CumulativeDataPoint(proto)
+                STATISTICAL_DATA_POINT -> StatisticalDataPoint(proto)
+                null, AGGREGATE_NOT_SET ->
+                    throw IllegalStateException("Aggregate not set on $proto")
+            }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/AggregateDataPoints.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/AggregateDataPoints.kt
new file mode 100644
index 0000000..63ef304
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/AggregateDataPoints.kt
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import androidx.annotation.Keep
+import java.time.Instant
+
+/** Helper class to facilitate working with [DataPoint] s. */
+// TODO(b/177504986): Remove all @Keep annotations once we figure out why this class gets stripped
+// away by proguard.
+@Keep
+public object AggregateDataPoints {
+
+    /**
+     * Creates a new [StatisticalDataPoint] of type [DataType.ABSOLUTE_ELEVATION] with the given
+     * elevations in meters.
+     */
+    @JvmStatic
+    public fun aggregateAbsoluteElevation(
+        minAbsElevation: Double,
+        maxAbsElevation: Double,
+        avgAbsElevation: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): StatisticalDataPoint =
+        StatisticalDataPoint(
+            startTime,
+            endTime,
+            DataType.ABSOLUTE_ELEVATION,
+            Value.ofDouble(minAbsElevation),
+            Value.ofDouble(maxAbsElevation),
+            Value.ofDouble(avgAbsElevation)
+        )
+
+    /**
+     * Creates a new [AggregateDataPoint] of type [DataType.TOTAL_CALORIES] with the given
+     * `kcalories`.
+     */
+    @JvmStatic
+    public fun aggregateCalories(
+        kcalories: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): AggregateDataPoint =
+        CumulativeDataPoint(startTime, endTime, DataType.TOTAL_CALORIES, Value.ofDouble(kcalories))
+
+    /** Creates a new [AggregateDataPoint] for the [DataType.DISTANCE] with the given `distance`. */
+    @JvmStatic
+    public fun aggregateDistance(
+        distance: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): AggregateDataPoint =
+        CumulativeDataPoint(startTime, endTime, DataType.DISTANCE, Value.ofDouble(distance))
+
+    /**
+     * Creates a new [AggregateDataPoint] for the [DataType.ELEVATION_GAIN] with the given
+     * `gainMeters`.
+     */
+    @JvmStatic
+    public fun aggregateElevationGain(
+        gainMeters: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): AggregateDataPoint =
+        CumulativeDataPoint(startTime, endTime, DataType.ELEVATION_GAIN, Value.ofDouble(gainMeters))
+
+    /**
+     * Creates a new [AggregateDataPoint] of type [DataType.HEART_RATE_BPM] with the given `bpm`s.
+     */
+    @JvmStatic
+    public fun aggregateHeartRate(
+        minBpm: Double,
+        maxBpm: Double,
+        avgBpm: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): StatisticalDataPoint =
+        StatisticalDataPoint(
+            startTime,
+            endTime,
+            DataType.HEART_RATE_BPM,
+            Value.ofDouble(minBpm),
+            Value.ofDouble(maxBpm),
+            Value.ofDouble(avgBpm)
+        )
+
+    /** Creates a new [AggregateDataPoint] of type [DataType.PACE] with the given `millisPerKm`. */
+    @JvmStatic
+    public fun aggregatePace(
+        minMillisPerKm: Double,
+        maxMillisPerKm: Double,
+        avgMillisPerKm: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): AggregateDataPoint =
+        StatisticalDataPoint(
+            startTime,
+            endTime,
+            DataType.PACE,
+            Value.ofDouble(minMillisPerKm),
+            Value.ofDouble(maxMillisPerKm),
+            Value.ofDouble(avgMillisPerKm)
+        )
+
+    /**
+     * Creates a new [StatisticalDataPoint] of type [DataType.SPEED] with the given
+     * `metersPerSecond`.
+     */
+    @JvmStatic
+    public fun aggregateSpeed(
+        minMetersPerSecond: Double,
+        maxMetersPerSecond: Double,
+        avgMetersPerSecond: Double,
+        startTime: Instant,
+        endTime: Instant
+    ): StatisticalDataPoint =
+        StatisticalDataPoint(
+            startTime,
+            endTime,
+            DataType.SPEED,
+            Value.ofDouble(minMetersPerSecond),
+            Value.ofDouble(maxMetersPerSecond),
+            Value.ofDouble(avgMetersPerSecond)
+        )
+
+    /** Creates a new [AggregateDataPoint] of type [DataType.STEPS] with the given `steps`. */
+    @JvmStatic
+    public fun aggregateSteps(
+        steps: Long,
+        startTime: Instant,
+        endTime: Instant
+    ): AggregateDataPoint =
+        CumulativeDataPoint(startTime, endTime, DataType.STEPS, Value.ofLong(steps))
+
+    /**
+     * Creates a new [DataPoint] of type [DataType.SWIMMING_STROKES] with the given
+     * `swimmingStrokes`.
+     */
+    @JvmStatic
+    public fun aggregateSwimmingStrokes(
+        swimmingStrokes: Long,
+        startTime: Instant,
+        endTime: Instant
+    ): AggregateDataPoint =
+        CumulativeDataPoint(
+            startTime,
+            endTime,
+            DataType.SWIMMING_STROKES,
+            Value.ofLong(swimmingStrokes)
+        )
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/Availability.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/Availability.kt
index 71a56d8..e4c64eb 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/Availability.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/Availability.kt
@@ -16,14 +16,30 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.Availability.AvailabilityCase
+import androidx.health.services.client.proto.DataProto.Availability.DataTypeAvailability as DataTypeAvailabilityProto
+
 /** Availability of a [DataType]. */
-public enum class Availability(public val id: Int) {
-    UNKNOWN(0),
-    AVAILABLE(1),
-    ACQUIRING(2),
-    UNAVAILABLE(3);
+public interface Availability {
+    public val id: Int
+
+    /** @hide */
+    public fun toProto(): DataProto.Availability =
+        DataProto.Availability.newBuilder()
+            .setDataTypeAvailability(DataTypeAvailabilityProto.DATA_TYPE_AVAILABILITY_UNKNOWN)
+            .build()
 
     public companion object {
-        @JvmStatic public fun fromId(id: Int): Availability? = values().firstOrNull { it.id == id }
+        /** @hide */
+        @JvmStatic
+        public fun fromProto(proto: DataProto.Availability): Availability =
+            when (proto.availabilityCase) {
+                AvailabilityCase.DATA_TYPE_AVAILABILITY ->
+                    DataTypeAvailability.fromProto(proto.dataTypeAvailability)
+                AvailabilityCase.LOCATION_AVAILABILITY ->
+                    LocationAvailability.fromProto(proto.locationAvailability)
+                null, AvailabilityCase.AVAILABILITY_NOT_SET -> DataTypeAvailability.UNKNOWN
+            }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/BundlesUtil.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/BundlesUtil.kt
index f20e608..cd3fb73 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/BundlesUtil.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/BundlesUtil.kt
@@ -17,64 +17,53 @@
 package androidx.health.services.client.data
 
 import android.os.Bundle
-import java.util.Objects
+import androidx.annotation.RestrictTo
+import androidx.health.services.client.proto.DataProto
+import com.google.protobuf.ByteString
 
-/** Utility methods for working with Bundles. */
-internal object BundlesUtil {
+/**
+ * Utility methods for working with Bundles.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+public object BundlesUtil {
 
-    /**
-     * Compares two Bundles recursively and returns `true` if they are equal.
-     *
-     * Equality in this case means that both bundles contain the same set of keys and their
-     * corresponding values are all equal (using the [Object.equals] method).
-     */
     @JvmStatic
-    fun equals(a: Bundle?, b: Bundle?): Boolean {
-        if (a == b) {
-            return true
-        } else if (a == null || b == null) {
-            return false
-        } else if (a.size() != b.size()) {
-            return false
-        }
-        for (key in a.keySet()) {
-            val aValue = a[key]
-            val bValue = b[key]
-            if (aValue is Bundle && bValue is Bundle) {
-                if (!equals(aValue as Bundle?, bValue as Bundle?)) {
-                    return false
-                }
-            } else if (aValue == null) {
-                if (bValue != null || !b.containsKey(key)) {
-                    return false
-                }
-            } else if (!Objects.deepEquals(aValue, bValue)) {
-                return false
+    internal fun toProto(bundle: Bundle): DataProto.Bundle {
+        val builder = DataProto.Bundle.newBuilder()
+
+        for (key in bundle.keySet()) {
+            when (val value = bundle.get(key)) {
+                is Boolean -> builder.putBools(key, value)
+                is String -> builder.putStrings(key, value)
+                is Int -> builder.putInts(key, value)
+                is Long -> builder.putLongs(key, value)
+                is Float -> builder.putFloats(key, value)
+                is Double -> builder.putDoubles(key, value)
+                is Byte -> builder.putBytes(key, value.toInt())
+                is ByteArray -> builder.putByteArrays(key, ByteString.copyFrom(value))
+                is Bundle -> if (value != bundle) builder.putBundles(key, toProto(value))
             }
         }
-        return true
+
+        return builder.build()
     }
 
-    /** Calculates a hashCode for a Bundle, examining all keys and values. */
     @JvmStatic
-    fun hashCode(b: Bundle?): Int {
-        if (b == null) {
-            return 0
-        }
-        val keySet = b.keySet()
-        val hashCodes = IntArray(keySet.size * 2)
-        var i = 0
-        for (key in keySet) {
-            hashCodes[i++] = Objects.hashCode(key)
-            val value = b[key]
-            val valueHashCode: Int =
-                if (value is Bundle) {
-                    hashCode(value as Bundle?)
-                } else {
-                    Objects.hashCode(value)
-                }
-            hashCodes[i++] = valueHashCode
-        }
-        return hashCodes.contentHashCode()
+    internal fun fromProto(proto: DataProto.Bundle): Bundle {
+        val bundle = Bundle()
+
+        proto.boolsMap.forEach { bundle.putBoolean(it.key, it.value) }
+        proto.stringsMap.forEach { bundle.putString(it.key, it.value) }
+        proto.intsMap.forEach { bundle.putInt(it.key, it.value) }
+        proto.longsMap.forEach { bundle.putLong(it.key, it.value) }
+        proto.floatsMap.forEach { bundle.putFloat(it.key, it.value) }
+        proto.doublesMap.forEach { bundle.putDouble(it.key, it.value) }
+        proto.bytesMap.forEach { bundle.putByte(it.key, it.value.toByte()) }
+        proto.byteArraysMap.forEach { bundle.putByteArray(it.key, it.value.toByteArray()) }
+        proto.bundlesMap.forEach { bundle.putBundle(it.key, fromProto(it.value)) }
+
+        return bundle
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ComparisonType.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ComparisonType.kt
index 37e2288..f5b56f0 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ComparisonType.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ComparisonType.kt
@@ -16,6 +16,13 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.ComparisonType.COMPARISON_TYPE_GREATER_THAN
+import androidx.health.services.client.proto.DataProto.ComparisonType.COMPARISON_TYPE_GREATER_THAN_OR_EQUAL
+import androidx.health.services.client.proto.DataProto.ComparisonType.COMPARISON_TYPE_LESS_THAN
+import androidx.health.services.client.proto.DataProto.ComparisonType.COMPARISON_TYPE_LESS_THAN_OR_EQUAL
+import androidx.health.services.client.proto.DataProto.ComparisonType.COMPARISON_TYPE_UNKNOWN
+
 /** For determining when a threshold has been met or exceeded in a [MetricCondition]. */
 public enum class ComparisonType(public val id: Int) {
     // TODO(b/175064823): investigate adding EQUAL comparison type
@@ -24,8 +31,28 @@
     LESS_THAN(3),
     LESS_THAN_OR_EQUAL(4);
 
+    /** @hide */
+    internal fun toProto(): DataProto.ComparisonType =
+        when (this) {
+            GREATER_THAN -> COMPARISON_TYPE_GREATER_THAN
+            GREATER_THAN_OR_EQUAL -> COMPARISON_TYPE_GREATER_THAN_OR_EQUAL
+            LESS_THAN -> COMPARISON_TYPE_LESS_THAN
+            LESS_THAN_OR_EQUAL -> COMPARISON_TYPE_LESS_THAN_OR_EQUAL
+        }
+
     public companion object {
         @JvmStatic
         public fun fromId(id: Int): ComparisonType? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        @JvmStatic
+        internal fun fromProto(proto: DataProto.ComparisonType): ComparisonType? =
+            when (proto) {
+                COMPARISON_TYPE_GREATER_THAN -> GREATER_THAN
+                COMPARISON_TYPE_GREATER_THAN_OR_EQUAL -> GREATER_THAN_OR_EQUAL
+                COMPARISON_TYPE_LESS_THAN -> LESS_THAN
+                COMPARISON_TYPE_LESS_THAN_OR_EQUAL -> LESS_THAN_OR_EQUAL
+                COMPARISON_TYPE_UNKNOWN -> null
+            }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/CumulativeDataPoint.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/CumulativeDataPoint.kt
new file mode 100644
index 0000000..ab2a337
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/CumulativeDataPoint.kt
@@ -0,0 +1,58 @@
+package androidx.health.services.client.data
+
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.CumulativeDataPoint as CumulativeDataPointProto
+import java.time.Instant
+
+/**
+ * An [AggregateDataPoint] containing a cumulative [total] for the type [dataType] between
+ * [startTime] and [endTime]. This should generally correspond with [DataPoint]s of type
+ * [DataType.TimeType.INTERVAL].
+ */
+@Suppress("ParcelCreator")
+public class CumulativeDataPoint(
+    public val startTime: Instant,
+    public val endTime: Instant,
+    public val dataType: DataType,
+    public val total: Value,
+) : AggregateDataPoint() {
+
+    internal constructor(
+        proto: DataProto.AggregateDataPoint
+    ) : this(
+        Instant.ofEpochMilli(proto.cumulativeDataPoint.startTimeEpochMs),
+        Instant.ofEpochMilli(proto.cumulativeDataPoint.endTimeEpochMs),
+        DataType(proto.cumulativeDataPoint.dataType),
+        Value(proto.cumulativeDataPoint.total)
+    )
+
+    /** @hide */
+    override val proto: DataProto.AggregateDataPoint by lazy {
+        DataProto.AggregateDataPoint.newBuilder()
+            .setCumulativeDataPoint(
+                CumulativeDataPointProto.newBuilder()
+                    .setStartTimeEpochMs(startTime.toEpochMilli())
+                    .setEndTimeEpochMs(endTime.toEpochMilli())
+                    .setDataType(dataType.proto)
+                    .setTotal(total.proto)
+                    .build()
+            )
+            .build()
+    }
+
+    override fun toString(): String =
+        "CumulativeDataPoint(" +
+            "startTime=$startTime, " +
+            "endTime=$endTime, " +
+            "dataType=$dataType, " +
+            "total=$total)"
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<CumulativeDataPoint> = newCreator {
+            val proto = DataProto.AggregateDataPoint.parseFrom(it)
+            CumulativeDataPoint(proto)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoint.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoint.kt
index 5e52737..d2a40c5 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoint.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoint.kt
@@ -17,21 +17,20 @@
 package androidx.health.services.client.data
 
 import android.os.Bundle
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
 import java.time.Duration
 import java.time.Instant
-import java.util.Objects
 
 /**
  * A data point containing a [value] of type [dataType] from either a single point in time:
  * [DataType.TimeType.SAMPLE], or a range in time: [DataType.TimeType.INTERVAL].
  */
-@Suppress("DataClassPrivateConstructor")
-public data class DataPoint
+@Suppress("DataClassPrivateConstructor", "ParcelCreator")
+public class DataPoint
 internal constructor(
-    val dataType: DataType,
-    val value: Value,
+    public val dataType: DataType,
+    public val value: Value,
 
     /**
      * Elapsed start time of this [DataPoint].
@@ -41,7 +40,7 @@
      * generated and when it is read out. Use [getStartInstant] to get the start time of this
      * [DataPoint] as an [Instant].
      */
-    val startDurationFromBoot: Duration,
+    public val startDurationFromBoot: Duration,
 
     /**
      * Elapsed end time of this [DataPoint].
@@ -53,11 +52,47 @@
      *
      * For instantaneous data points, this is equal to [startDurationFromBoot].
      */
-    val endDurationFromBoot: Duration = startDurationFromBoot,
+    public val endDurationFromBoot: Duration = startDurationFromBoot,
 
     /** Returns any provided metadata of this [DataPoint]. */
-    val metadata: Bundle = Bundle(),
-) : Parcelable {
+    public val metadata: Bundle = Bundle(),
+
+    /**
+     * Returns the accuracy of this [DataPoint].
+     *
+     * The specific [DataPointAccuracy] implementation this refers to depends on the [DataType] of
+     * the data point. For example, accuracy of [DataType.LOCATION] data points is represented by
+     * [LocationAccuracy]. If there is no associated [DataPointAccuracy] for the [DataType], this
+     * will return `null`.
+     */
+    public val accuracy: DataPointAccuracy? = null,
+) : ProtoParcelable<DataProto.DataPoint>() {
+
+    internal constructor(
+        proto: DataProto.DataPoint
+    ) : this(
+        DataType(proto.dataType),
+        Value(proto.value),
+        Duration.ofMillis(proto.startDurationFromBootMs),
+        Duration.ofMillis(proto.endDurationFromBootMs),
+        BundlesUtil.fromProto(proto.metaData),
+        if (proto.hasAccuracy()) DataPointAccuracy.fromProto(proto.accuracy) else null
+    )
+
+    /** @hide */
+    override val proto: DataProto.DataPoint by lazy {
+        val builder =
+            DataProto.DataPoint.newBuilder()
+                .setDataType(dataType.proto)
+                .setValue(value.proto)
+                .setStartDurationFromBootMs(startDurationFromBoot.toMillis())
+                .setEndDurationFromBootMs(endDurationFromBoot.toMillis())
+                .setMetaData(BundlesUtil.toProto(metadata))
+
+        accuracy?.let { builder.setAccuracy(it.proto) }
+
+        builder.build()
+    }
 
     init {
         require(dataType.format == value.format) {
@@ -85,85 +120,20 @@
         return bootInstant.plus(endDurationFromBoot)
     }
 
-    // TODO(b/180612514): Bundle doesn't have equals, so we need to override the data class default.
-    override fun equals(other: Any?): Boolean {
-        if (other === this) {
-            return true
-        }
-        if (other is DataPoint) {
-            return dataType == other.dataType &&
-                value == other.value &&
-                startDurationFromBoot == other.startDurationFromBoot &&
-                endDurationFromBoot == other.endDurationFromBoot &&
-                BundlesUtil.equals(metadata, other.metadata)
-        }
-        return false
-    }
-
-    // TODO(b/180612514): Bundle doesn't have hashCode, so we need to override the data class
-    // default.
-    override fun hashCode(): Int {
-        return Objects.hash(
-            dataType,
-            value,
-            startDurationFromBoot,
-            endDurationFromBoot,
-            BundlesUtil.hashCode(metadata)
-        )
-    }
-
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(dataType, flags)
-        dest.writeParcelable(value, flags)
-        dest.writeLong(startDurationFromBoot.toNanos())
-        dest.writeLong(endDurationFromBoot.toNanos())
-        dest.writeBundle(metadata)
-    }
+    override fun toString(): String =
+        "DataPoint(" +
+            "dataType=$dataType, " +
+            "value=$value, " +
+            "startDurationFromBoot=$startDurationFromBoot, " +
+            "endDurationFromBoot=$endDurationFromBoot, " +
+            "accuracy=$accuracy)"
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<DataPoint> =
-            object : Parcelable.Creator<DataPoint> {
-                override fun createFromParcel(parcel: Parcel): DataPoint? {
-                    val dataType: DataType =
-                        parcel.readParcelable(DataType::class.java.classLoader) ?: return null
-                    val value: Value =
-                        parcel.readParcelable(Value::class.java.classLoader) ?: return null
-                    val startDurationFromBoot = Duration.ofNanos(parcel.readLong())
-                    val endDurationFromBoot = Duration.ofNanos(parcel.readLong())
-                    val metadata: Bundle? = parcel.readBundle(Bundle::class.java.classLoader)
-
-                    return when (dataType.timeType) {
-                        DataType.TimeType.INTERVAL ->
-                            createInterval(
-                                dataType,
-                                value,
-                                startDurationFromBoot,
-                                endDurationFromBoot,
-                                metadata ?: Bundle()
-                            )
-                        DataType.TimeType.SAMPLE -> {
-                            require(endDurationFromBoot.compareTo(startDurationFromBoot) == 0) {
-                                "DataType [$dataType] has SAMPLE type, but" +
-                                    " start[$startDurationFromBoot]/end[$endDurationFromBoot]" +
-                                    " duration from boot are not the same"
-                            }
-                            createSample(
-                                dataType,
-                                value,
-                                startDurationFromBoot,
-                                metadata ?: Bundle()
-                            )
-                        }
-                    }
-                }
-
-                override fun newArray(size: Int): Array<DataPoint?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<DataPoint> = newCreator {
+            val proto = DataProto.DataPoint.parseFrom(it)
+            DataPoint(proto)
+        }
 
         /**
          * Returns a [DataPoint] representing the [value] of type [dataType] from
@@ -179,18 +149,26 @@
             value: Value,
             startDurationFromBoot: Duration,
             endDurationFromBoot: Duration,
-            metadata: Bundle = Bundle()
+            metadata: Bundle = Bundle(),
+            accuracy: DataPointAccuracy? = null
         ): DataPoint {
             require(DataType.TimeType.INTERVAL == dataType.timeType) {
                 "DataType $dataType must be of interval type to be created with an interval"
             }
 
             require(endDurationFromBoot >= startDurationFromBoot) {
-                "End timestamp mustn't be earlier than start timestamp, but got" +
-                    " $startDurationFromBoot and $endDurationFromBoot"
+                "End timestamp mustn't be earlier than start timestamp, but got " +
+                    "$startDurationFromBoot and $endDurationFromBoot"
             }
 
-            return DataPoint(dataType, value, startDurationFromBoot, endDurationFromBoot, metadata)
+            return DataPoint(
+                dataType,
+                value,
+                startDurationFromBoot,
+                endDurationFromBoot,
+                metadata,
+                accuracy
+            )
         }
 
         /**
@@ -205,7 +183,8 @@
             dataType: DataType,
             value: Value,
             durationFromBoot: Duration,
-            metadata: Bundle = Bundle()
+            metadata: Bundle = Bundle(),
+            accuracy: DataPointAccuracy? = null
         ): DataPoint {
             require(DataType.TimeType.SAMPLE == dataType.timeType) {
                 "DataType $dataType must be of sample type to be created with a single timestamp"
@@ -216,7 +195,8 @@
                 value,
                 durationFromBoot,
                 endDurationFromBoot = durationFromBoot,
-                metadata
+                metadata,
+                accuracy
             )
         }
     }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPointAccuracy.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPointAccuracy.kt
new file mode 100644
index 0000000..4942d1a
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPointAccuracy.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.DataPointAccuracy.AccuracyCase.ACCURACY_NOT_SET
+import androidx.health.services.client.proto.DataProto.DataPointAccuracy.AccuracyCase.HR_ACCURACY
+import androidx.health.services.client.proto.DataProto.DataPointAccuracy.AccuracyCase.LOCATION_ACCURACY
+
+/** Accuracy of a [DataPoint]. */
+@Suppress("ParcelCreator", "ParcelNotFinal")
+public abstract class DataPointAccuracy : ProtoParcelable<DataProto.DataPointAccuracy>() {
+
+    internal companion object {
+        internal fun fromProto(proto: DataProto.DataPointAccuracy): DataPointAccuracy =
+            when (proto.accuracyCase) {
+                HR_ACCURACY -> HrAccuracy(proto)
+                LOCATION_ACCURACY -> LocationAccuracy(proto)
+                null, ACCURACY_NOT_SET -> throw IllegalStateException("Accuracy not set on $proto")
+            }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoints.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoints.kt
index db148f2..fac68c0 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoints.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataPoints.kt
@@ -17,6 +17,7 @@
 package androidx.health.services.client.data
 
 import android.content.Intent
+import android.os.Bundle
 import androidx.annotation.Keep
 import java.time.Duration
 import java.util.ArrayList
@@ -40,11 +41,18 @@
 
     /**
      * When using [DataType.LOCATION], the value is represented as `double[]`. The `double` value at
-     * this index represents the altitude. This is an optional index and there is no guarantee that
-     * this index will be present.
+     * this index represents the altitude. This value will default to [Double.MAX_VALUE] if it is
+     * not available.
      */
     public const val LOCATION_DATA_POINT_ALTITUDE_INDEX: Int = 2
 
+    /**
+     * When using [DataType.LOCATION], the value is represented as `double[]`. The `double` value at
+     * this index represents the bearing. This value will default to [Double.MAX_VALUE] if it is not
+     * available.
+     */
+    public const val LOCATION_DATA_POINT_BEARING_INDEX: Int = 3
+
     /** Name of intent extra containing the data points set on pending intent. */
     private const val EXTRA_DATA_POINTS: String = "hs.data_points_list"
 
@@ -77,16 +85,19 @@
 
     /** Creates a new [DataPoint] of type [DataType.STEPS] with the given `steps`. */
     @JvmStatic
+    @JvmOverloads
     public fun steps(
         steps: Long,
         startDurationFromBoot: Duration,
-        endDurationFromBoot: Duration
+        endDurationFromBoot: Duration,
+        metadata: Bundle? = null
     ): DataPoint =
         DataPoint.createInterval(
             DataType.STEPS,
             Value.ofLong(steps),
             startDurationFromBoot,
-            endDurationFromBoot
+            endDurationFromBoot,
+            metadata ?: Bundle()
         )
 
     /**
@@ -103,66 +114,88 @@
 
     /** Creates a new [DataPoint] of type [DataType.DISTANCE] with the given `meters`. */
     @JvmStatic
+    @JvmOverloads
     public fun distance(
         meters: Double,
         startDurationFromBoot: Duration,
-        endDurationFromBoot: Duration
+        endDurationFromBoot: Duration,
+        metadata: Bundle? = null
     ): DataPoint =
         DataPoint.createInterval(
             DataType.DISTANCE,
             Value.ofDouble(meters),
             startDurationFromBoot,
-            endDurationFromBoot
+            endDurationFromBoot,
+            metadata ?: Bundle()
         )
 
-    /** Creates a new [DataPoint] of type [DataType.ELEVATION] with the given `meters`. */
+    /** Creates a new [DataPoint] of type [DataType.ELEVATION_GAIN] with the given `meters`. */
     @JvmStatic
-    public fun elevation(
+    @JvmOverloads
+    public fun elevationGain(
         meters: Double,
         startDurationFromBoot: Duration,
-        endDurationFromBoot: Duration
+        endDurationFromBoot: Duration,
+        metadata: Bundle? = null
     ): DataPoint =
         DataPoint.createInterval(
-            DataType.ELEVATION,
+            DataType.ELEVATION_GAIN,
             Value.ofDouble(meters),
             startDurationFromBoot,
-            endDurationFromBoot
+            endDurationFromBoot,
+            metadata ?: Bundle()
         )
 
-    /** Creates a new [DataPoint] of type [DataType.ALTITUDE] with the given `meters`. */
+    /** Creates a new [DataPoint] of type [DataType.ABSOLUTE_ELEVATION] with the given `meters`. */
     @JvmStatic
-    public fun altitude(meters: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(DataType.ALTITUDE, Value.ofDouble(meters), durationFromBoot)
+    @JvmOverloads
+    public fun absoluteElevation(
+        meters: Double,
+        durationFromBoot: Duration,
+        metadata: Bundle? = null
+    ): DataPoint =
+        DataPoint.createSample(
+            DataType.ABSOLUTE_ELEVATION,
+            Value.ofDouble(meters),
+            durationFromBoot,
+            metadata ?: Bundle()
+        )
 
     /** Creates a new [DataPoint] of type [DataType.FLOORS] with the given `floors`. */
     @JvmStatic
+    @JvmOverloads
     public fun floors(
         floors: Double,
         startDurationFromBoot: Duration,
-        endDurationFromBoot: Duration
+        endDurationFromBoot: Duration,
+        metadata: Bundle? = null
     ): DataPoint =
         DataPoint.createInterval(
             DataType.FLOORS,
             Value.ofDouble(floors),
             startDurationFromBoot,
-            endDurationFromBoot
+            endDurationFromBoot,
+            metadata ?: Bundle()
         )
 
     /** Creates a new [DataPoint] of type [DataType.TOTAL_CALORIES] with the given `kcalories`. */
     @JvmStatic
+    @JvmOverloads
     public fun calories(
         kcalories: Double,
         startDurationFromBoot: Duration,
-        endDurationFromBoot: Duration
+        endDurationFromBoot: Duration,
+        metadata: Bundle? = null
     ): DataPoint =
         DataPoint.createInterval(
             DataType.TOTAL_CALORIES,
             Value.ofDouble(kcalories),
             startDurationFromBoot,
-            endDurationFromBoot
+            endDurationFromBoot,
+            metadata ?: Bundle()
         )
 
-    /** Creates a new [DataPoint] of type [DataType.SWIMMING_STROKES] with the given `kcalories`. */
+    /** Creates a new [DataPoint] of type [DataType.SWIMMING_STROKES] with the given `strokes`. */
     @JvmStatic
     public fun swimmingStrokes(
         strokes: Long,
@@ -177,144 +210,117 @@
         )
 
     /**
-     * Creates a new [DataPoint] of type [DataType.LOCATION] with the given `latitude` and
-     * `longitude`.
+     * Creates a new [DataPoint] of type [DataType.LOCATION] with the given `latitude`, `longitude`,
+     * `altitude`, `bearing`, and `accuracy`.
      */
     @JvmStatic
+    @JvmOverloads
     public fun location(
         latitude: Double,
         longitude: Double,
-        durationFromBoot: Duration
+        altitude: Double = Double.MAX_VALUE,
+        bearing: Double = Double.MAX_VALUE,
+        durationFromBoot: Duration,
+        accuracy: LocationAccuracy? = null
     ): DataPoint =
         DataPoint.createSample(
             DataType.LOCATION,
-            Value.ofDoubleArray(latitude, longitude),
-            durationFromBoot
-        )
-
-    /**
-     * Creates a new [DataPoint] of type [DataType.LOCATION] with the given `latitude`, `longitude`
-     * and `altitude`.
-     */
-    @JvmStatic
-    public fun location(
-        latitude: Double,
-        longitude: Double,
-        altitude: Double,
-        durationFromBoot: Duration
-    ): DataPoint =
-        DataPoint.createSample(
-            DataType.LOCATION,
-            Value.ofDoubleArray(latitude, longitude, altitude),
-            durationFromBoot
+            Value.ofDoubleArray(latitude, longitude, altitude, bearing),
+            durationFromBoot,
+            accuracy = accuracy
         )
 
     /** Creates a new [DataPoint] of type [DataType.SPEED] with the given `metersPerSecond`. */
     @JvmStatic
-    public fun speed(metersPerSecond: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(DataType.SPEED, Value.ofDouble(metersPerSecond), durationFromBoot)
+    @JvmOverloads
+    public fun speed(
+        metersPerSecond: Double,
+        durationFromBoot: Duration,
+        metadata: Bundle? = null
+    ): DataPoint =
+        DataPoint.createSample(
+            DataType.SPEED,
+            Value.ofDouble(metersPerSecond),
+            durationFromBoot,
+            metadata ?: Bundle()
+        )
 
     /** Creates a new [DataPoint] of type [DataType.PACE] with the given `millisPerKm`. */
     @JvmStatic
     public fun pace(millisPerKm: Double, durationFromBoot: Duration): DataPoint =
         DataPoint.createSample(DataType.PACE, Value.ofDouble(millisPerKm), durationFromBoot)
 
-    /** Creates a new [DataPoint] of type [DataType.HEART_RATE_BPM] with the given `bpm`. */
-    @JvmStatic
-    public fun heartRate(bpm: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(DataType.HEART_RATE_BPM, Value.ofDouble(bpm), durationFromBoot)
-
-    /** Creates a new [DataPoint] of type [DataType.SPO2] with the given `percent`. */
-    @JvmStatic
-    public fun spo2(percent: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(DataType.SPO2, Value.ofDouble(percent), durationFromBoot)
-
     /**
-     * Creates a new [DataPoint] of type [DataType.AGGREGATE_DISTANCE] with the given `distance`.
+     * Creates a new [DataPoint] of type [DataType.HEART_RATE_BPM] with the given `bpm` and
+     * `accuracy`.
      */
     @JvmStatic
-    public fun aggregateDistance(
-        distance: Double,
-        startDurationFromBoot: Duration,
-        endDurationFromBoot: Duration
+    @JvmOverloads
+    public fun heartRate(
+        bpm: Double,
+        durationFromBoot: Duration,
+        accuracy: HrAccuracy? = null
     ): DataPoint =
-        DataPoint.createInterval(
-            DataType.AGGREGATE_DISTANCE,
-            Value.ofDouble(distance),
-            startDurationFromBoot,
-            endDurationFromBoot
+        DataPoint.createSample(
+            DataType.HEART_RATE_BPM,
+            Value.ofDouble(bpm),
+            durationFromBoot,
+            accuracy = accuracy
         )
 
-    /** Creates a new [DataPoint] of type [DataType.AGGREGATE_STEP_COUNT] with the given `steps`. */
+    /** Creates a new [DataPoint] of type [DataType.DAILY_STEPS] with the given `steps`. */
     @JvmStatic
-    public fun aggregateSteps(
+    public fun dailySteps(
         steps: Long,
         startDurationFromBoot: Duration,
         endDurationFromBoot: Duration
     ): DataPoint =
         DataPoint.createInterval(
-            DataType.AGGREGATE_STEP_COUNT,
+            DataType.DAILY_STEPS,
             Value.ofLong(steps),
             startDurationFromBoot,
             endDurationFromBoot
         )
 
-    /**
-     * Creates a new [DataPoint] of type [DataType.AGGREGATE_CALORIES_EXPENDED] with the given
-     * `kcalories`.
-     */
+    /** Creates a new [DataPoint] of type [DataType.DAILY_FLOORS] with the given `floors`. */
     @JvmStatic
-    public fun aggregateCalories(
-        kcalories: Double,
+    public fun dailyFloors(
+        floors: Double,
         startDurationFromBoot: Duration,
         endDurationFromBoot: Duration
     ): DataPoint =
         DataPoint.createInterval(
-            DataType.AGGREGATE_CALORIES_EXPENDED,
-            Value.ofDouble(kcalories),
+            DataType.DAILY_FLOORS,
+            Value.ofDouble(floors),
             startDurationFromBoot,
             endDurationFromBoot
         )
 
-    /**
-     * Creates a new [DataPoint] of type [DataType.AGGREGATE_SWIMMING_STROKE_COUNT] with the given
-     * `swimmingStrokes`.
-     */
+    /** Creates a new [DataPoint] of type [DataType.DAILY_CALORIES] with the given `calories`. */
     @JvmStatic
-    public fun aggregateSwimmingStrokes(
-        swimmingStrokes: Long,
+    public fun dailyCalories(
+        calories: Double,
         startDurationFromBoot: Duration,
         endDurationFromBoot: Duration
     ): DataPoint =
         DataPoint.createInterval(
-            DataType.AGGREGATE_SWIMMING_STROKE_COUNT,
-            Value.ofLong(swimmingStrokes),
+            DataType.DAILY_CALORIES,
+            Value.ofDouble(calories),
             startDurationFromBoot,
             endDurationFromBoot
         )
 
-    /** Creates a new [DataPoint] of type [DataType.AVERAGE_PACE] with the given `millisPerKm`. */
+    /** Creates a new [DataPoint] of type [DataType.DAILY_DISTANCE] with the given `distance`. */
     @JvmStatic
-    public fun averagePace(millisPerKm: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(DataType.AVERAGE_PACE, Value.ofDouble(millisPerKm), durationFromBoot)
-
-    /**
-     * Creates a new [DataPoint] of type [DataType.AVERAGE_SPEED] with the given `metersPerSecond`.
-     */
-    @JvmStatic
-    public fun averageSpeed(metersPerSecond: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(
-            DataType.AVERAGE_SPEED,
-            Value.ofDouble(metersPerSecond),
-            durationFromBoot
-        )
-
-    /** Creates a new [DataPoint] of type [DataType.MAX_SPEED] with the given `metersPerSecond`. */
-    @JvmStatic
-    public fun maxSpeed(metersPerSecond: Double, durationFromBoot: Duration): DataPoint =
-        DataPoint.createSample(
-            DataType.MAX_SPEED,
-            Value.ofDouble(metersPerSecond),
-            durationFromBoot
+    public fun dailyDistance(
+        distance: Double,
+        startDurationFromBoot: Duration,
+        endDurationFromBoot: Duration
+    ): DataPoint =
+        DataPoint.createInterval(
+            DataType.DAILY_DISTANCE,
+            Value.ofDouble(distance),
+            startDurationFromBoot,
+            endDurationFromBoot
         )
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataType.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataType.kt
index 61f0be8..f056998 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataType.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataType.kt
@@ -16,8 +16,12 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.data.DataType.TimeType
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.DataType.TimeType.TIME_TYPE_INTERVAL
+import androidx.health.services.client.proto.DataProto.DataType.TimeType.TIME_TYPE_SAMPLE
+import androidx.health.services.client.proto.DataProto.DataType.TimeType.TIME_TYPE_UNKNOWN
 
 /**
  * A data type is a representation of health data managed by Health Services.
@@ -29,14 +33,24 @@
  * Note: the data type defines only the representation and format of the data, and not how it's
  * being collected, the sensor being used, or the parameters of the collection.
  */
-public data class DataType(
+@Suppress("ParcelCreator")
+public class DataType(
     /** Returns the name of this [DataType], e.g. `"Steps"`. */
-    val name: String,
+    public val name: String,
     /** Returns the [TimeType] of this [DataType]. */
-    val timeType: TimeType,
+    public val timeType: TimeType,
     /** Returns the expected format for a [Value] of this [DataType]. */
-    val format: Int,
-) : Parcelable {
+    public val format: Int,
+) : ProtoParcelable<DataProto.DataType>() {
+    /** @hide */
+    public constructor(
+        proto: DataProto.DataType
+    ) : this(
+        proto.name,
+        TimeType.fromProto(proto.timeType)
+            ?: throw IllegalStateException("Invalid TimeType: ${proto.timeType}"),
+        proto.format
+    )
 
     /**
      * Whether the `DataType` corresponds to a measurement spanning an interval, or a sample at a
@@ -44,53 +58,62 @@
      */
     public enum class TimeType {
         INTERVAL,
-        SAMPLE
+        SAMPLE;
+
+        /** @hide */
+        internal fun toProto(): DataProto.DataType.TimeType =
+            when (this) {
+                INTERVAL -> TIME_TYPE_INTERVAL
+                SAMPLE -> TIME_TYPE_SAMPLE
+            }
+
+        internal companion object {
+            /** @hide */
+            internal fun fromProto(proto: DataProto.DataType.TimeType): TimeType? =
+                when (proto) {
+                    TIME_TYPE_INTERVAL -> INTERVAL
+                    TIME_TYPE_SAMPLE -> SAMPLE
+                    TIME_TYPE_UNKNOWN -> null
+                }
+        }
     }
 
-    override fun describeContents(): Int = 0
+    override fun toString(): String = "DataType(name=$name, timeType=$timeType, format=$format)"
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        with(dest) {
-            writeString(name)
-            writeString(timeType.name)
-            writeInt(format)
-        }
+    /** @hide */
+    override val proto: DataProto.DataType by lazy {
+        DataProto.DataType.newBuilder()
+            .setName(name)
+            .setTimeType(timeType.toProto())
+            .setFormat(format)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<DataType> =
-            object : Parcelable.Creator<DataType> {
-                override fun createFromParcel(parcel: Parcel): DataType? {
-                    return DataType(
-                        parcel.readString() ?: return null,
-                        TimeType.valueOf(parcel.readString() ?: return null),
-                        parcel.readInt()
-                    )
-                }
+        public val CREATOR: Parcelable.Creator<DataType> = newCreator {
+            val proto = DataProto.DataType.parseFrom(it)
+            DataType(proto)
+        }
 
-                override fun newArray(size: Int): Array<DataType?> {
-                    return arrayOfNulls(size)
-                }
-            }
-
-        /** Current altitude expressed in meters in `double` format. */
+        /**
+         * A measure of the gain in elevation expressed in meters in `double` format. Elevation
+         * losses are not counted in this metric (so it will only be positive or 0).
+         */
         @JvmField
-        public val ALTITUDE: DataType = DataType("Altitude", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
+        public val ELEVATION_GAIN: DataType =
+            DataType("Elevation Gain", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
+
+        /** Absolute elevation between each reading expressed in meters in `double` format. */
+        @JvmField
+        public val ABSOLUTE_ELEVATION: DataType =
+            DataType("Absolute Elevation", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
 
         /** A distance delta between each reading expressed in meters in `double` format. */
         @JvmField
         public val DISTANCE: DataType = DataType("Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
 
         /**
-         * A duration delta during an exercise over which the user was traveling down a decline,
-         * expressed in seconds in `long` format.
-         */
-        @JvmField
-        public val DECLINE_TIME: DataType =
-            DataType("Decline Time", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /**
          * A distance delta traveled over declining ground between each reading expressed in meters
          * in `double` format.
          */
@@ -99,27 +122,28 @@
             DataType("Decline Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
 
         /**
-         * A duration delta during an exercise over which the user was traveling across flat ground,
-         * expressed in seconds in `long` format.
+         * A duration delta representing the amount of time the user spent traveling over declining
+         * ground during the interval, expressed in seconds in `long` format.
          */
         @JvmField
-        public val FLAT_TIME: DataType = DataType("Flat Time", TimeType.INTERVAL, Value.FORMAT_LONG)
+        public val DECLINE_DURATION: DataType =
+            DataType("Decline Duration", TimeType.INTERVAL, Value.FORMAT_LONG)
 
         /**
          * A distance delta traveled over flat ground between each reading expressed in meters in
          * `double` format.
          */
         @JvmField
-        public val FLAT_DISTANCE: DataType =
-            DataType("Flat Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
+        public val FLAT_GROUND_DISTANCE: DataType =
+            DataType("Flat Ground Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
 
         /**
-         * A duration delta during an exercise over which the user was traveling up an incline,
-         * expressed in seconds in `long` format.
+         * A duration delta representing the amount of time the user spent traveling over flat
+         * ground during the interval, expressed in seconds in `long` format.
          */
         @JvmField
-        public val INCLINE_TIME: DataType =
-            DataType("Incline Time", TimeType.INTERVAL, Value.FORMAT_LONG)
+        public val FLAT_GROUND_DURATION: DataType =
+            DataType("Flat Ground Duration", TimeType.INTERVAL, Value.FORMAT_LONG)
 
         /**
          * A distance delta traveled over inclining ground between each reading expressed in meters
@@ -129,21 +153,24 @@
         public val INCLINE_DISTANCE: DataType =
             DataType("Incline Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
 
-        /** An elevation delta between each reading expressed in meters in `double` format. */
+        /**
+         * A duration delta representing the amount of time the user spent traveling over inclining
+         * ground during the interval, expressed in seconds in `long` format.
+         */
         @JvmField
-        public val ELEVATION: DataType =
-            DataType("Elevation", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /** Absolute elevation between each reading expressed in meters in `double` format. */
-        @JvmField
-        public val ABSOLUTE_ELEVATION: DataType =
-            DataType("Absolute Elevation", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
+        public val INCLINE_DURATION: DataType =
+            DataType("Incline Duration", TimeType.INTERVAL, Value.FORMAT_LONG)
 
         /** Number of floors climbed between each reading in `double` format */
         @JvmField
         public val FLOORS: DataType = DataType("Floors", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
 
-        /** Current heart rate, in beats per minute in `double` format. */
+        /**
+         * Current heart rate, in beats per minute in `double` format.
+         *
+         * Accuracy for a [DataPoint] of type [DataType.HEART_RATE_BPM] is represented by
+         * [HrAccuracy].
+         */
         @JvmField
         public val HEART_RATE_BPM: DataType =
             DataType("HeartRate", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
@@ -153,6 +180,9 @@
          * index [DataPoints.LOCATION_DATA_POINT_LATITUDE_INDEX], longitude at index
          * [DataPoints.LOCATION_DATA_POINT_LONGITUDE_INDEX] and if available, altitude at index
          * [DataPoints.LOCATION_DATA_POINT_ALTITUDE_INDEX]
+         *
+         * Accuracy for a [DataPoint] of type [DataType.LOCATION] is represented by
+         * [LocationAccuracy].
          */
         @JvmField
         public val LOCATION: DataType =
@@ -210,146 +240,18 @@
         /** Current pace. In millisec/km in `double` format. */
         @JvmField public val PACE: DataType = DataType("Pace", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
 
-        /** The aggregate distance over a period of time expressed in meters in `double` format. */
-        @JvmField
-        public val AGGREGATE_DISTANCE: DataType =
-            DataType("Aggregate Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /**
-         * The aggregate flat distance over a period of time expressed in meters in `double` format.
-         */
-        @JvmField
-        public val AGGREGATE_FLAT_DISTANCE: DataType =
-            DataType("Aggregate Flat Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /**
-         * The aggregate incline distance over a period of time expressed in meters in `double`
-         * format.
-         */
-        @JvmField
-        public val AGGREGATE_INCLINE_DISTANCE: DataType =
-            DataType("Aggregate Incline Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /**
-         * The aggregate incline distance over a period of time expressed in meters in `double`
-         * format.
-         */
-        @JvmField
-        public val AGGREGATE_DECLINE_DISTANCE: DataType =
-            DataType("Aggregate Decline Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /**
-         * The aggregate duration for an exercise when the user was traveling on flat ground,
-         * expressed in seconds in `long` format.
-         */
-        @JvmField
-        public val AGGREGATE_FLAT_TIME: DataType =
-            DataType("Aggregate Flat Time", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /**
-         * The aggregate duration for an exercise when the user was traveling up an incline,
-         * expressed in seconds in `long` format.
-         */
-        @JvmField
-        public val AGGREGATE_INCLINE_TIME: DataType =
-            DataType("Aggregate Incline Time", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /**
-         * The aggregate duration for an exercise when the user was traveling down a decline,
-         * expressed in seconds in `long` format.
-         */
-        @JvmField
-        public val AGGREGATE_DECLINE_TIME: DataType =
-            DataType("Aggregate Decline Time", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /**
-         * The aggregate total calories (including basal rate and activity) expended over a period
-         * of time in `double` format.
-         */
-        @JvmField
-        public val AGGREGATE_CALORIES_EXPENDED: DataType =
-            DataType("Aggregate Calories", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /** The aggregate step count over a period of time in `long` format. */
-        @JvmField
-        public val AGGREGATE_STEP_COUNT: DataType =
-            DataType("Aggregate Steps", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /** The aggregate walking step count over a period of time in `long` format. */
-        @JvmField
-        public val AGGREGATE_WALKING_STEP_COUNT: DataType =
-            DataType("Aggregate Walking Steps", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /** The aggregate running step count over a period of time in `long` format. */
-        @JvmField
-        public val AGGREGATE_RUNNING_STEP_COUNT: DataType =
-            DataType("Aggregate Running Steps", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /** The aggregate swimming stroke count over a period of time in `long` format. */
-        @JvmField
-        public val AGGREGATE_SWIMMING_STROKE_COUNT: DataType =
-            DataType("Aggregate Swimming Strokes", TimeType.INTERVAL, Value.FORMAT_LONG)
-
-        /** The aggregate elevation over a period of time in meters in `double` format. */
-        @JvmField
-        public val AGGREGATE_ELEVATION: DataType =
-            DataType("Aggregate Elevation", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /** The number of floors climbed over a period of time in `double` format */
-        @JvmField
-        public val AGGREGATE_FLOORS: DataType =
-            DataType("Aggregate Floors", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
-
-        /** The average pace over a period of time in millisec/km in `double` format. */
-        @JvmField
-        public val AVERAGE_PACE: DataType =
-            DataType("Average Pace", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The average speed over a period of time in meters/second in `double` format. */
-        @JvmField
-        public val AVERAGE_SPEED: DataType =
-            DataType("Average Speed", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The average heart rate over a period of time in beats/minute in `double` format. */
-        @JvmField
-        public val AVERAGE_HEART_RATE_BPM: DataType =
-            DataType("Average Heart Rate BPM", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The maximum altitude over a period of time in meters in `double` format. */
-        @JvmField
-        public val MAX_ALTITUDE: DataType =
-            DataType("Max Altitude", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The minimum altitude over a period of time in meters in `double` format. */
-        @JvmField
-        public val MIN_ALTITUDE: DataType =
-            DataType("Min Altitude", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The maximum pace over a period of time in millisec/km in `double` format. */
-        @JvmField
-        public val MAX_PACE: DataType = DataType("Max Pace", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The maximum speed over a period of time in meters/second in `double` format. */
-        @JvmField
-        public val MAX_SPEED: DataType = DataType("Max Speed", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
-        /** The maximum instantaneous heart rate in beats/minute in `double` format. */
-        @JvmField
-        public val MAX_HEART_RATE_BPM: DataType =
-            DataType("Max Heart Rate", TimeType.SAMPLE, Value.FORMAT_DOUBLE)
-
         /**
          * The duration during which the user was resting during an Exercise in seconds in `long`
          * format.
          */
         @JvmField
         public val RESTING_EXERCISE_DURATION: DataType =
-            DataType("Resting Exercise Duration", TimeType.SAMPLE, Value.FORMAT_LONG)
+            DataType("Resting Exercise Duration", TimeType.INTERVAL, Value.FORMAT_LONG)
 
         /** The duration of the time the Exercise was ACTIVE in seconds in `long` format. */
         @JvmField
         public val ACTIVE_EXERCISE_DURATION: DataType =
-            DataType("Active Exercise Duration", TimeType.SAMPLE, Value.FORMAT_LONG)
+            DataType("Active Exercise Duration", TimeType.INTERVAL, Value.FORMAT_LONG)
 
         /** Count of swimming laps ins `long` format. */
         @JvmField
@@ -359,5 +261,45 @@
         /** The current rep count of the exercise in `long` format. */
         @JvmField
         public val REP_COUNT: DataType = DataType("Rep Count", TimeType.INTERVAL, Value.FORMAT_LONG)
+
+        /**
+         * The total step count over a day in `long` format, where the previous day ends and a new
+         * day begins at 12:00 AM local time. Each DataPoint of this type will cover the interval
+         * from the start of day to now. In the event of time-zone shifts, the interval might be
+         * greater than 24hrs.
+         */
+        @JvmField
+        public val DAILY_STEPS: DataType =
+            DataType("Daily Steps", TimeType.INTERVAL, Value.FORMAT_LONG)
+
+        /**
+         * The total number floors climbed over a day in `double` format, where the previous day
+         * ends and a new day begins at 12:00 AM local time. Each DataPoint of this type will cover
+         * the interval from the start of day to now. In the event of time-zone shifts, the interval
+         * might be greater than 24hrs.
+         */
+        @JvmField
+        public val DAILY_FLOORS: DataType =
+            DataType("Daily Floors", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
+
+        /**
+         * The total number calories over a day in `double` format, where the previous day ends and
+         * a new day begins at 12:00 AM local time. Each DataPoint of this type will cover the
+         * interval from the start of day to now. In the event of time-zone shifts, the interval
+         * might be greater than 24hrs.
+         */
+        @JvmField
+        public val DAILY_CALORIES: DataType =
+            DataType("Daily Calories", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
+
+        /**
+         * The total distance over a day in `double` format, where the previous day ends and a new
+         * day begins at 12:00 AM local time. Each DataPoint of this type will cover the interval
+         * from the start of day to now. In the event of time-zone shifts, the interval might be
+         * greater than 24hrs.
+         */
+        @JvmField
+        public val DAILY_DISTANCE: DataType =
+            DataType("Daily Distance", TimeType.INTERVAL, Value.FORMAT_DOUBLE)
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeAvailability.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeAvailability.kt
new file mode 100644
index 0000000..58a0633
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeAvailability.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.Availability.DataTypeAvailability as DataTypeAvailabilityProto
+import androidx.health.services.client.proto.DataProto.Availability.DataTypeAvailability.DATA_TYPE_AVAILABILITY_UNKNOWN
+
+/** Availability of a [DataType]. */
+public enum class DataTypeAvailability(public override val id: Int) : Availability {
+    UNKNOWN(0),
+    AVAILABLE(1),
+    ACQUIRING(2),
+    UNAVAILABLE(3);
+
+    /** @hide */
+    public override fun toProto(): DataProto.Availability =
+        DataProto.Availability.newBuilder()
+            .setDataTypeAvailability(
+                DataTypeAvailabilityProto.forNumber(id) ?: DATA_TYPE_AVAILABILITY_UNKNOWN
+            )
+            .build()
+
+    public companion object {
+        @JvmStatic
+        public fun fromId(id: Int): DataTypeAvailability? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        public fun fromProto(proto: DataTypeAvailabilityProto): DataTypeAvailability =
+            fromId(proto.number) ?: UNKNOWN
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeCondition.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeCondition.kt
index 152c9df..93cb80e 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeCondition.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypeCondition.kt
@@ -16,21 +16,45 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
 
 /** A condition which is considered met when a data type value passes a defined threshold. */
-public data class DataTypeCondition(
-    val dataType: DataType,
-    val threshold: Value,
-    val comparisonType: ComparisonType,
-) : Parcelable {
+@Suppress("ParcelCreator")
+public class DataTypeCondition(
+    public val dataType: DataType,
+    public val threshold: Value,
+    public val comparisonType: ComparisonType,
+) : ProtoParcelable<DataProto.DataTypeCondition>() {
+
+    internal constructor(
+        proto: DataProto.DataTypeCondition
+    ) : this(
+        DataType(proto.dataType),
+        Value(proto.threshold),
+        ComparisonType.fromProto(proto.comparisonType)
+            ?: throw IllegalStateException("Invalid ComparisonType: ${proto.comparisonType}")
+    )
+
     init {
         require(dataType.format == threshold.format) {
-            "provided data type must have sample time type."
+            "provided data type and threshold must have the same formats."
         }
     }
 
+    /** @hide */
+    override val proto: DataProto.DataTypeCondition by lazy {
+        DataProto.DataTypeCondition.newBuilder()
+            .setDataType(dataType.proto)
+            .setThreshold(threshold.proto)
+            .setComparisonType(comparisonType.toProto())
+            .build()
+    }
+
+    override fun toString(): String =
+        "DataTypeCondition(" +
+            "dataType=$dataType, threshold=$threshold, comparisonType=$comparisonType)"
+
     /** Checks whether or not the condition is satisfied by a given [DataPoint]. */
     public fun isSatisfied(dataPoint: DataPoint): Boolean {
         require(dataType == dataPoint.dataType) {
@@ -51,31 +75,11 @@
         }
     }
 
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(dataType, flags)
-        dest.writeParcelable(threshold, flags)
-        dest.writeInt(comparisonType.id)
-    }
-
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<DataTypeCondition> =
-            object : Parcelable.Creator<DataTypeCondition> {
-                override fun createFromParcel(source: Parcel): DataTypeCondition? {
-                    val dataType =
-                        source.readParcelable<DataType>(DataType::class.java.classLoader)
-                            ?: return null
-                    val threshold =
-                        source.readParcelable<Value>(Value::class.java.classLoader) ?: return null
-                    val comparisonType = ComparisonType.fromId(source.readInt()) ?: return null
-                    return DataTypeCondition(dataType, threshold, comparisonType)
-                }
-
-                override fun newArray(size: Int): Array<DataTypeCondition?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<DataTypeCondition> = newCreator {
+            val proto = DataProto.DataTypeCondition.parseFrom(it)
+            DataTypeCondition(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypes.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypes.kt
index b821de8..c308f4d 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypes.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/DataTypes.kt
@@ -18,99 +18,22 @@
 
 /** Helper class to facilitate working with [DataTypes] [DataType]. */
 public object DataTypes {
-    private val AGGREGATE_TYPE_TO_RAW_TYPE =
-        DataTypeBiMap(
-            DataType.AGGREGATE_DISTANCE to DataType.DISTANCE,
-            DataType.AGGREGATE_CALORIES_EXPENDED to DataType.TOTAL_CALORIES,
-            DataType.AGGREGATE_STEP_COUNT to DataType.STEPS,
-            DataType.AGGREGATE_ELEVATION to DataType.ELEVATION,
-            DataType.AGGREGATE_FLOORS to DataType.FLOORS,
-            DataType.AGGREGATE_SWIMMING_STROKE_COUNT to DataType.SWIMMING_STROKES
-        )
 
-    private val MAX_TYPE_TO_RAW_TYPE =
-        DataTypeBiMap(
-            DataType.MAX_HEART_RATE_BPM to DataType.HEART_RATE_BPM,
-            DataType.MAX_PACE to DataType.PACE,
-            DataType.MAX_SPEED to DataType.SPEED
-        )
-
-    private val AVERAGE_TYPE_TO_RAW_TYPE =
-        DataTypeBiMap(
-            DataType.AVERAGE_HEART_RATE_BPM to DataType.HEART_RATE_BPM,
-            DataType.AVERAGE_PACE to DataType.PACE,
-            DataType.AVERAGE_SPEED to DataType.SPEED
-        )
-
-    /** Check if a [DataType] represents aggregate value of a collection of non-aggregate data. */
+    /** Check if a [DataType] will be aggregated as a statistical value. */
     @JvmStatic
-    public fun isAggregateDataType(dataType: DataType): Boolean =
-        AGGREGATE_TYPE_TO_RAW_TYPE.map.containsKey(dataType)
-
-    /** Check if a [DataType] represents the maximum value of a collection of non-aggregate data. */
-    @JvmStatic
-    public fun isStatisticalMaxDataType(dataType: DataType): Boolean =
-        MAX_TYPE_TO_RAW_TYPE.map.containsKey(dataType)
-
-    /** Check if a [DataType] represents the average value of a collection of non-aggregate data. */
-    @JvmStatic
-    public fun isStatisticalAverageDataType(dataType: DataType): Boolean =
-        AVERAGE_TYPE_TO_RAW_TYPE.map.containsKey(dataType)
+    public fun isStatisticalDataType(dataType: DataType): Boolean =
+        dataType.timeType == DataType.TimeType.SAMPLE &&
+            dataType.format != Value.FORMAT_DOUBLE_ARRAY
 
     /**
-     * Check if a [DataType] represents raw data value, i.e., neither aggregate value nor
-     * statistical value.
+     * Check if a [DataType] will be aggregated as a cumulative value.
+     *
+     * Note: [DataType.SWIMMING_LAP_COUNT] already represents the total lap count, so it is not
+     * considered a cumulative data type.
      */
     @JvmStatic
-    public fun isRawType(dataType: DataType): Boolean =
-        !isAggregateDataType(dataType) &&
-            !isStatisticalMaxDataType(dataType) &&
-            !isStatisticalAverageDataType(dataType)
-
-    /** Get the aggregate [DataType] from a raw [DataType], or null if it doesn't exist. */
-    @JvmStatic
-    public fun getAggregateTypeFromRawType(rawType: DataType): DataType? =
-        AGGREGATE_TYPE_TO_RAW_TYPE.inverse[rawType]
-
-    /** Get the raw [DataType] from an aggregate [DataType], or null if it doesn't exist. */
-    @JvmStatic
-    public fun getRawTypeFromAggregateType(aggregateType: DataType): DataType? =
-        AGGREGATE_TYPE_TO_RAW_TYPE.map[aggregateType]
-
-    /** Get the max [DataType] from a raw [DataType], or null if it doesn't exist. */
-    @JvmStatic
-    public fun getMaxTypeFromRawType(rawType: DataType): DataType? =
-        MAX_TYPE_TO_RAW_TYPE.inverse[rawType]
-
-    /** Get the raw [DataType] from a max [DataType], or null if it doesn't exist. */
-    @JvmStatic
-    public fun getRawTypeFromMaxType(maxType: DataType): DataType? =
-        MAX_TYPE_TO_RAW_TYPE.map[maxType]
-
-    /** Get the average [DataType] from a raw [DataType], or null if it doesn't exist. */
-    @JvmStatic
-    public fun getAverageTypeFromRawType(rawType: DataType): DataType? =
-        AVERAGE_TYPE_TO_RAW_TYPE.inverse[rawType]
-
-    /** Get the raw [DataType] from an average [DataType], or null if it doesn't exist. */
-    @JvmStatic
-    public fun getRawTypeFromAverageType(averageType: DataType): DataType? =
-        AVERAGE_TYPE_TO_RAW_TYPE.map[averageType]
-
-    /** Get the aggregate, average, and max [DataType] from a raw [DataType] if they exist. */
-    @JvmStatic
-    public fun getAggregatedDataTypesFromRawType(rawType: DataType): Set<DataType> {
-        val allDataTypes = HashSet<DataType>()
-
-        getAggregateTypeFromRawType(rawType)?.let { allDataTypes.add(it) }
-        getMaxTypeFromRawType(rawType)?.let { allDataTypes.add(it) }
-        getAverageTypeFromRawType(rawType)?.let { allDataTypes.add(it) }
-
-        return allDataTypes
-    }
-
-    private class DataTypeBiMap(vararg pairs: Pair<DataType, DataType>) {
-        val map = mapOf(*pairs)
-        val inverse = pairs.map { it.second to it.first }.toMap()
-    }
+    public fun isCumulativeDataType(dataType: DataType): Boolean =
+        dataType.timeType == DataType.TimeType.INTERVAL &&
+            dataType.format != Value.FORMAT_DOUBLE_ARRAY &&
+            dataType != DataType.SWIMMING_LAP_COUNT
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseCapabilities.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseCapabilities.kt
index 9314eee..d19b806 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseCapabilities.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseCapabilities.kt
@@ -16,27 +16,47 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
-import androidx.health.services.client.data.ExerciseType.Companion.fromId
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.ExerciseCapabilities.TypeToCapabilitiesEntry
 
 /**
  * A place holder class that represents the capabilities of the
  * [androidx.health.services.client.ExerciseClient] on the device.
  */
-public data class ExerciseCapabilities(
+@Suppress("ParcelCreator")
+public class ExerciseCapabilities(
     /**
      * Mapping for each supported [ExerciseType] to its [ExerciseTypeCapabilities] on this device.
      */
-    val typeToCapabilities: Map<ExerciseType, ExerciseTypeCapabilities>,
-) : Parcelable {
+    public val typeToCapabilities: Map<ExerciseType, ExerciseTypeCapabilities>,
+) : ProtoParcelable<DataProto.ExerciseCapabilities>() {
 
-    override fun describeContents(): Int {
-        return 0
-    }
+    internal constructor(
+        proto: DataProto.ExerciseCapabilities
+    ) : this(
+        proto
+            .typeToCapabilitiesList
+            .map { entry ->
+                ExerciseType.fromProto(entry.type) to ExerciseTypeCapabilities(entry.capabilities)
+            }
+            .toMap()
+    )
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        writeTypeToCapabilities(dest, flags)
+    /** @hide */
+    override val proto: DataProto.ExerciseCapabilities by lazy {
+        DataProto.ExerciseCapabilities.newBuilder()
+            .addAllTypeToCapabilities(
+                typeToCapabilities
+                    .map {
+                        TypeToCapabilitiesEntry.newBuilder()
+                            .setType(it.key.toProto())
+                            .setCapabilities(it.value.proto)
+                            .build()
+                    }
+                    .sortedBy { it.type.name } // Ensures equals() works correctly
+            )
+            .build()
     }
 
     /** Set of supported [ExerciseType] s on this device. */
@@ -65,53 +85,14 @@
                 .toSet()
         }
 
-    private fun writeTypeToCapabilities(dest: Parcel, flags: Int) {
-        dest.writeInt(typeToCapabilities.size)
-        for ((key1, value) in typeToCapabilities) {
-            val key = key1.id
-            dest.writeInt(key)
-            dest.writeParcelable(value, flags)
-        }
-    }
+    override fun toString(): String = "ExerciseCapabilities(typeToCapabilities=$typeToCapabilities)"
 
     public companion object {
 
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseCapabilities> =
-            object : Parcelable.Creator<ExerciseCapabilities> {
-                override fun createFromParcel(parcel: Parcel): ExerciseCapabilities {
-                    val typeToCapabilitiesFromParcel = getTypeToCapabilityMap(parcel)
-                    return ExerciseCapabilities(
-                        typeToCapabilitiesFromParcel,
-                    )
-                }
-
-                override fun newArray(size: Int): Array<ExerciseCapabilities?> = arrayOfNulls(size)
-            }
-
-        private fun readDataTypeSet(parcel: Parcel): Set<DataType> {
-            return parcel.createTypedArray(DataType.CREATOR)!!.toSet()
-        }
-
-        private fun writeDataTypeSet(out: Parcel, flags: Int, dataTypes: Set<DataType>) {
-            out.writeTypedArray(dataTypes.toTypedArray(), flags)
-        }
-
-        private fun getTypeToCapabilityMap(
-            parcel: Parcel
-        ): Map<ExerciseType, ExerciseTypeCapabilities> {
-            val map = HashMap<ExerciseType, ExerciseTypeCapabilities>()
-            val mapSize = parcel.readInt()
-            for (i in 0 until mapSize) {
-                val key = fromId(parcel.readInt())
-                val value =
-                    parcel.readParcelable<Parcelable>(
-                        ExerciseTypeCapabilities::class.java.classLoader
-                    ) as
-                        ExerciseTypeCapabilities
-                map[key] = value
-            }
-            return map
+        public val CREATOR: Parcelable.Creator<ExerciseCapabilities> = newCreator { bytes ->
+            val proto = DataProto.ExerciseCapabilities.parseFrom(bytes)
+            ExerciseCapabilities(proto)
         }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseConfig.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseConfig.kt
index 5a50086..100bde7 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseConfig.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseConfig.kt
@@ -17,13 +17,12 @@
 package androidx.health.services.client.data
 
 import android.os.Bundle
-import android.os.Parcel
 import android.os.Parcelable
-import java.util.Objects
+import androidx.health.services.client.proto.DataProto
 
 /** Defines configuration for an exercise tracked using HealthServices. */
-@Suppress("DataClassPrivateConstructor")
-public data class ExerciseConfig
+@Suppress("DataClassPrivateConstructor", "ParcelCreator")
+public class ExerciseConfig
 protected constructor(
     /**
      * [ExerciseType] the user is performing for this exercise.
@@ -31,34 +30,43 @@
      * This information can be used to tune sensors, e.g. the calories estimate can take the MET
      * value into account.
      */
-    val exerciseType: ExerciseType,
-    val dataTypes: Set<DataType>,
-    val autoPauseAndResume: Boolean,
-    val exerciseGoals: List<ExerciseGoal>,
-    val exerciseParams: Bundle,
-) : Parcelable {
+    public val exerciseType: ExerciseType,
+    public val dataTypes: Set<DataType>,
+    public val aggregateDataTypes: Set<DataType>,
+    @get:JvmName("shouldEnableAutoPauseAndResume")
+    public val shouldEnableAutoPauseAndResume: Boolean,
+    @get:JvmName("shouldEnableGps") public val shouldEnableGps: Boolean,
+    public val exerciseGoals: List<ExerciseGoal>,
+    public val exerciseParams: Bundle,
+) : ProtoParcelable<DataProto.ExerciseConfig>() {
+
+    /** @hide */
+    public constructor(
+        proto: DataProto.ExerciseConfig
+    ) : this(
+        ExerciseType.fromProto(proto.exerciseType),
+        proto.dataTypesList.map { DataType(it) }.toSet(),
+        proto.aggregateDataTypesList.map { DataType(it) }.toSet(),
+        proto.isAutoPauseAndResumeEnabled,
+        proto.isGpsUsageEnabled,
+        proto.exerciseGoalsList.map { ExerciseGoal(it) },
+        BundlesUtil.fromProto(proto.exerciseParams)
+    )
+
     init {
-        require(dataTypes.isNotEmpty()) { "Must specify the desired data types." }
-        require(exerciseType != ExerciseType.UNKNOWN) { "Must specify a valid exercise type." }
-    }
-
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(exerciseType.id)
-        dest.writeInt(dataTypes.size)
-        dest.writeTypedArray(dataTypes.toTypedArray(), flags)
-        dest.writeInt(if (autoPauseAndResume) 1 else 0)
-        dest.writeInt(exerciseGoals.size)
-        dest.writeTypedArray(exerciseGoals.toTypedArray(), flags)
-        dest.writeBundle(exerciseParams)
+        require(!dataTypes.contains(DataType.LOCATION) || shouldEnableGps) {
+            "If LOCATION data is being requested, setShouldEnableGps(true) must be configured in " +
+                "the ExerciseConfig. "
+        }
     }
 
     /** Builder for [ExerciseConfig] instances. */
     public class Builder {
         private var exerciseType: ExerciseType? = null
-        private var dataTypes: Set<DataType>? = null
-        private var autoPauseAndResume: Boolean = false
+        private var dataTypes: Set<DataType> = emptySet()
+        private var aggregateDataTypes: Set<DataType> = emptySet()
+        private var shouldEnableAutoPauseAndResume: Boolean = false
+        private var shouldEnableGps: Boolean = false
         private var exerciseGoals: List<ExerciseGoal> = emptyList()
         private var exerciseParams: Bundle = Bundle.EMPTY
 
@@ -70,13 +78,15 @@
          * value into account.
          */
         public fun setExerciseType(exerciseType: ExerciseType): Builder {
+            require(exerciseType != ExerciseType.UNKNOWN) { "Must specify a valid exercise type." }
             this.exerciseType = exerciseType
             return this
         }
 
         /**
          * Sets the requested [DataType] s that should be tracked during this exercise. If not
-         * explicitly called, a default set of [DataType] will be chosen based on the [ ].
+         * explicitly called, a default set of [DataType] will be chosen based on the [ExerciseType]
+         * .
          */
         public fun setDataTypes(dataTypes: Set<DataType>): Builder {
             this.dataTypes = dataTypes.toSet()
@@ -84,11 +94,42 @@
         }
 
         /**
-         * Sets whether auto pause and auto resume are enabled for this exercise. If not set,
-         * they're disabled by default.
+         * Sets the requested [DataType]s that should be tracked as aggregates (i.e. total steps or
+         * average heart rate) during this exercise. If not explicitly called, a default set of
+         * [DataType] will be chosen based on the [ExerciseType].
          */
-        public fun setAutoPauseAndResume(autoPauseAndResume: Boolean): Builder {
-            this.autoPauseAndResume = autoPauseAndResume
+        public fun setAggregateDataTypes(dataTypes: Set<DataType>): Builder {
+            this.aggregateDataTypes = dataTypes.toSet()
+            return this
+        }
+
+        /**
+         * Sets whether auto pause and auto resume should be enabled for this exercise. If not set,
+         * auto-pause is disabled by default.
+         */
+        @Suppress("MissingGetterMatchingBuilder")
+        public fun setShouldEnableAutoPauseAndResume(
+            shouldEnableAutoPauseAndResume: Boolean
+        ): Builder {
+            this.shouldEnableAutoPauseAndResume = shouldEnableAutoPauseAndResume
+            return this
+        }
+
+        /**
+         * Sets whether GPS will be used for this exercise. If not set, it's disabled by default.
+         *
+         * <p>If {@link DataType#LOCATION} is among the data types requested for the exercise, GPS
+         * usage MUST be enabled. Enabling GPS will improve data generation for types like distance
+         * and speed.
+         *
+         * <p>If no data type is specified in the configuration, WHS provides all data types
+         * supported for the exercise. In this case, if {@link DataType#LOCATION} is among the
+         * supported data types for the exercise but GPS usage is disabled (i.e. {@code
+         * shouldEnableGps} is {@code false}, then [ExerciseClient.startExercise] will fail.
+         */
+        @Suppress("MissingGetterMatchingBuilder")
+        public fun setShouldEnableGps(shouldEnableGps: Boolean): Builder {
+            this.shouldEnableGps = shouldEnableGps
             return this
         }
 
@@ -103,10 +144,9 @@
         }
 
         /**
-         * Sets additional parameters for current exercise. Supported keys can be found in
-         * [ExerciseConfig].
+         * Sets additional OEM specific parameters for the current exercise. Intended to be used by
+         * OEMs or apps working closely with them.
          */
-        // TODO(b/180612514) expose keys on a per-OEM basis.
         public fun setExerciseParams(exerciseParams: Bundle): Builder {
             this.exerciseParams = exerciseParams
             return this
@@ -116,73 +156,45 @@
         public fun build(): ExerciseConfig {
             return ExerciseConfig(
                 checkNotNull(exerciseType) { "No exercise type specified" },
-                checkNotNull(dataTypes) { "No data types specified" },
-                autoPauseAndResume,
+                dataTypes,
+                aggregateDataTypes,
+                shouldEnableAutoPauseAndResume,
+                shouldEnableGps,
                 exerciseGoals,
                 exerciseParams
             )
         }
     }
 
-    // TODO(b/180612514): Bundle doesn't have equals, so we need to override the data class default.
-    override fun equals(other: Any?): Boolean {
-        if (other === this) {
-            return true
-        }
-        if (other is ExerciseConfig) {
-            return exerciseType == other.exerciseType &&
-                dataTypes == other.dataTypes &&
-                autoPauseAndResume == other.autoPauseAndResume &&
-                exerciseGoals == other.exerciseGoals &&
-                BundlesUtil.equals(exerciseParams, other.exerciseParams)
-        }
-        return false
+    /** @hide */
+    override val proto: DataProto.ExerciseConfig by lazy {
+        DataProto.ExerciseConfig.newBuilder()
+            .setExerciseType(exerciseType.toProto())
+            .addAllDataTypes(dataTypes.map { it.proto })
+            .addAllAggregateDataTypes(aggregateDataTypes.map { it.proto })
+            .setIsAutoPauseAndResumeEnabled(shouldEnableAutoPauseAndResume)
+            .setIsGpsUsageEnabled(shouldEnableGps)
+            .addAllExerciseGoals(exerciseGoals.map { it.proto })
+            .setExerciseParams(BundlesUtil.toProto(exerciseParams))
+            .build()
     }
 
-    // TODO(b/180612514): Bundle doesn't have hashCode, so we need to override the data class
-    // default.
-    override fun hashCode(): Int {
-        return Objects.hash(
-            exerciseType,
-            dataTypes,
-            autoPauseAndResume,
-            exerciseGoals,
-            BundlesUtil.hashCode(exerciseParams)
-        )
-    }
+    override fun toString(): String =
+        "ExerciseConfig(" +
+            "exerciseType=$exerciseType, " +
+            "dataTypes=$dataTypes, " +
+            "aggregateDataTypes=$aggregateDataTypes, " +
+            "shouldEnableAutoPauseAndResume=$shouldEnableAutoPauseAndResume, " +
+            "shouldEnableGps=$shouldEnableGps, " +
+            "exerciseGoals=$exerciseGoals)"
 
     public companion object {
         @JvmStatic public fun builder(): Builder = Builder()
 
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseConfig> =
-            object : Parcelable.Creator<ExerciseConfig> {
-                override fun createFromParcel(source: Parcel): ExerciseConfig? {
-                    val exerciseType = ExerciseType.fromId(source.readInt())
-
-                    val dataTypesArray = Array<DataType?>(source.readInt()) { null }
-                    source.readTypedArray(dataTypesArray, DataType.CREATOR)
-
-                    val autoPauseAndResume = source.readInt() == 1
-
-                    val exerciseGoals = Array<ExerciseGoal?>(source.readInt()) { null }
-                    source.readTypedArray(exerciseGoals, ExerciseGoal.CREATOR)
-
-                    val exerciseParams =
-                        source.readBundle(ExerciseConfig::class.java.classLoader) ?: Bundle()
-
-                    return ExerciseConfig(
-                        exerciseType,
-                        dataTypesArray.filterNotNull().toSet(),
-                        autoPauseAndResume,
-                        exerciseGoals.filterNotNull().toList(),
-                        exerciseParams
-                    )
-                }
-
-                override fun newArray(size: Int): Array<ExerciseConfig?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseConfig> = newCreator { bytes ->
+            val proto = DataProto.ExerciseConfig.parseFrom(bytes)
+            ExerciseConfig(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoal.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoal.kt
index 39c2ab1..e65bcb8 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoal.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoal.kt
@@ -16,28 +16,41 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
 import java.util.Objects
 
 // TODO(yeabkal): as we support more types of goals, we may want to rename the class.
 /** Defines a goal for an exercise. */
-@Suppress("DataClassPrivateConstructor")
-public data class ExerciseGoal
-protected constructor(
-    val exerciseGoalType: ExerciseGoalType,
-    val dataTypeCondition: DataTypeCondition,
+@Suppress("DataClassPrivateConstructor", "ParcelCreator")
+public class ExerciseGoal
+private constructor(
+    public val exerciseGoalType: ExerciseGoalType,
+    public val dataTypeCondition: DataTypeCondition,
     // TODO(yeabkal): shall we rename to "getMilestonePeriod"? Currently "getPeriod" is used to be
     // flexible in case we support other kinds of goals. Recheck when design is fully locked.
-    val period: Value? = null,
-) : Parcelable {
+    public val period: Value? = null,
+) : ProtoParcelable<DataProto.ExerciseGoal>() {
 
-    override fun describeContents(): Int = 0
+    internal constructor(
+        proto: DataProto.ExerciseGoal
+    ) : this(
+        ExerciseGoalType.fromProto(proto.exerciseGoalType)
+            ?: throw IllegalStateException("${proto.exerciseGoalType} not found"),
+        DataTypeCondition(proto.dataTypeCondition),
+        if (proto.hasPeriod()) Value(proto.period) else null
+    )
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(exerciseGoalType.id)
-        dest.writeParcelable(dataTypeCondition, flags)
-        dest.writeParcelable(period, flags)
+    /** @hide */
+    override val proto: DataProto.ExerciseGoal by lazy {
+        val builder =
+            DataProto.ExerciseGoal.newBuilder()
+                .setExerciseGoalType(exerciseGoalType.toProto())
+                .setDataTypeCondition(dataTypeCondition.proto)
+        if (period != null) {
+            builder.period = period.proto
+        }
+        builder.build()
     }
 
     // TODO(yeabkal): try to unify equality logic across goal types.
@@ -54,15 +67,7 @@
             return false
         }
 
-        return when (exerciseGoalType) {
-            ExerciseGoalType.ONE_TIME_GOAL -> dataTypeCondition == other.dataTypeCondition
-            // The threshold of a milestone is not included in the equality calculation to let apps
-            // easily map back an achieved milestone to the milestone they requested for tracking.
-            ExerciseGoalType.MILESTONE ->
-                dataTypeCondition.dataType == other.dataTypeCondition.dataType &&
-                    dataTypeCondition.comparisonType == other.dataTypeCondition.comparisonType &&
-                    period == other.period
-        }
+        return dataTypeCondition == other.dataTypeCondition && period == other.period
     }
 
     override fun hashCode(): Int {
@@ -78,24 +83,51 @@
         }
     }
 
+    override fun toString(): String =
+        "ExerciseGoal(" +
+            "exerciseGoalType=$exerciseGoalType, " +
+            "dataTypeCondition=$dataTypeCondition, " +
+            "period=$period)"
+
+    /**
+     * Checks if [other] is a possible representation of this goal. For one-time goals, this simply
+     * checks for equality. For milestones, this returns `true` if and only if:
+     * - [other] uses the same [ComparisonType], [DataType], and [period] as this goal, and
+     * - the difference between [other]'s threshold and the threshold of this goal is a multiple of
+     * of their common period.
+     *
+     * @hide
+     */
+    public fun isEquivalentTo(other: ExerciseGoal): Boolean {
+        if (this.exerciseGoalType != other.exerciseGoalType) {
+            return false
+        }
+
+        return when (exerciseGoalType) {
+            ExerciseGoalType.ONE_TIME_GOAL -> equals(other)
+            ExerciseGoalType.MILESTONE ->
+                this.dataTypeCondition.dataType == other.dataTypeCondition.dataType &&
+                    this.dataTypeCondition.comparisonType ==
+                    other.dataTypeCondition.comparisonType &&
+                    this.period == other.period &&
+                    Value.isZero(
+                        Value.modulo(
+                            Value.difference(
+                                dataTypeCondition.threshold,
+                                other.dataTypeCondition.threshold
+                            ),
+                            period!!
+                        )
+                    )
+        }
+    }
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseGoal> =
-            object : Parcelable.Creator<ExerciseGoal> {
-                override fun createFromParcel(source: Parcel): ExerciseGoal? {
-                    val exerciseGoalType = ExerciseGoalType.fromId(source.readInt()) ?: return null
-                    val dataTypeCondition: DataTypeCondition =
-                        source.readParcelable(DataTypeCondition::class.java.classLoader)
-                            ?: return null
-                    val period: Value? = source.readParcelable(Value::class.java.classLoader)
-
-                    return ExerciseGoal(exerciseGoalType, dataTypeCondition, period)
-                }
-
-                override fun newArray(size: Int): Array<ExerciseGoal?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseGoal> = newCreator {
+            val proto = DataProto.ExerciseGoal.parseFrom(it)
+            ExerciseGoal(proto)
+        }
 
         /**
          * Creates an [ExerciseGoal] that is achieved once when the given [DataTypeCondition] is
@@ -129,7 +161,9 @@
                 "The goal to update should be of MILESTONE type."
             }
             require(goal.period != null) { "The milestone goal's period should not be null." }
-            val (dataType, oldThreshold, comparisonType) = goal.dataTypeCondition
+            val dataType = goal.dataTypeCondition.dataType
+            val oldThreshold = goal.dataTypeCondition.threshold
+            val comparisonType = goal.dataTypeCondition.comparisonType
             require(oldThreshold.format == newThreshold.format) {
                 "The old and new thresholds should have the same types of values."
             }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoalType.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoalType.kt
index 0790057..2c4e83c 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoalType.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseGoalType.kt
@@ -16,13 +16,34 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.ExerciseGoalType.EXERCISE_GOAL_TYPE_MILESTONE
+import androidx.health.services.client.proto.DataProto.ExerciseGoalType.EXERCISE_GOAL_TYPE_ONE_TIME
+import androidx.health.services.client.proto.DataProto.ExerciseGoalType.EXERCISE_GOAL_TYPE_UNKNOWN
+
 /** Exercise goal types. */
 public enum class ExerciseGoalType(public val id: Int) {
     ONE_TIME_GOAL(1),
     MILESTONE(2);
 
+    /** @hide */
+    internal fun toProto(): DataProto.ExerciseGoalType =
+        when (this) {
+            ONE_TIME_GOAL -> EXERCISE_GOAL_TYPE_ONE_TIME
+            MILESTONE -> EXERCISE_GOAL_TYPE_MILESTONE
+        }
+
     public companion object {
         @JvmStatic
         public fun fromId(id: Int): ExerciseGoalType? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        @JvmStatic
+        internal fun fromProto(proto: DataProto.ExerciseGoalType): ExerciseGoalType? =
+            when (proto) {
+                EXERCISE_GOAL_TYPE_ONE_TIME -> ONE_TIME_GOAL
+                EXERCISE_GOAL_TYPE_MILESTONE -> MILESTONE
+                EXERCISE_GOAL_TYPE_UNKNOWN -> null
+            }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseInfo.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseInfo.kt
index 7c43643..25d04c8 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseInfo.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseInfo.kt
@@ -16,41 +16,44 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import java.lang.IllegalStateException
 
 /** High-level info about the exercise. */
-public data class ExerciseInfo(
+@Suppress("ParcelCreator")
+public class ExerciseInfo(
     /** Returns the [ExerciseTrackedStatus]. */
-    val exerciseTrackedStatus: ExerciseTrackedStatus,
+    public val exerciseTrackedStatus: ExerciseTrackedStatus,
 
     /**
      * Returns the [ExerciseType] of the active exercise, or [ExerciseType.UNKNOWN] if there is no
      * active exercise.
      */
-    val exerciseType: ExerciseType,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val exerciseType: ExerciseType,
+) : ProtoParcelable<DataProto.ExerciseInfo>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(exerciseTrackedStatus.id)
-        dest.writeInt(exerciseType.id)
+    internal constructor(
+        proto: DataProto.ExerciseInfo
+    ) : this(
+        ExerciseTrackedStatus.fromProto(proto.exerciseTrackedStatus)
+            ?: throw IllegalStateException("Invalid status ${proto.exerciseTrackedStatus}"),
+        ExerciseType.fromProto(proto.exerciseType)
+    )
+
+    /** @hide */
+    override val proto: DataProto.ExerciseInfo by lazy {
+        DataProto.ExerciseInfo.newBuilder()
+            .setExerciseTrackedStatus(exerciseTrackedStatus.toProto())
+            .setExerciseType(exerciseType.toProto())
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseInfo> =
-            object : Parcelable.Creator<ExerciseInfo> {
-                override fun createFromParcel(source: Parcel): ExerciseInfo? {
-                    return ExerciseInfo(
-                        ExerciseTrackedStatus.fromId(source.readInt()) ?: return null,
-                        ExerciseType.fromId(source.readInt())
-                    )
-                }
-
-                override fun newArray(size: Int): Array<ExerciseInfo?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseInfo> = newCreator { bytes ->
+            val proto = DataProto.ExerciseInfo.parseFrom(bytes)
+            ExerciseInfo(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseLapSummary.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseLapSummary.kt
index cd17ab1..ed68049 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseLapSummary.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseLapSummary.kt
@@ -16,81 +16,85 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.ExerciseLapSummary.LapMetricsEntry
 import java.time.Duration
 import java.time.Instant
 
 /** Describes a completed exercise lap. */
-public data class ExerciseLapSummary(
+@Suppress("ParcelCreator")
+public class ExerciseLapSummary(
     /** Returns the lap count of this summary. Lap count starts at 1 for the first lap. */
-    val lapCount: Int,
+    public val lapCount: Int,
 
     /** Returns the time at which the lap has started. */
-    val startTime: Instant,
+    public val startTime: Instant,
 
     /** Returns the time at which the lap has ended. */
-    val endTime: Instant,
+    public val endTime: Instant,
 
     /**
      * Returns the total elapsed time for which the exercise has been active during this lap, i.e.
      * started but not paused.
      */
-    val activeDuration: Duration,
+    public val activeDuration: Duration,
 
     /**
      * Returns the [DataPoint] s for each metric keyed by [DataType] tracked between [startTime] and
      * [endTime] i.e. during the duration of this lap. This will only contain aggregated [DataType]
      * s calculated over the duration of the lap.
      */
-    val lapMetrics: Map<DataType, DataPoint>,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val lapMetrics: Map<DataType, AggregateDataPoint>,
+) : ProtoParcelable<DataProto.ExerciseLapSummary>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(lapCount)
-        dest.writeLong(startTime.toEpochMilli())
-        dest.writeLong(endTime.toEpochMilli())
-        dest.writeLong(activeDuration.toMillis())
+    /** @hide */
+    public constructor(
+        proto: DataProto.ExerciseLapSummary
+    ) : this(
+        proto.lapCount,
+        Instant.ofEpochMilli(proto.startTimeEpochMs),
+        Instant.ofEpochMilli(proto.endTimeEpochMs),
+        Duration.ofMillis(proto.activeDurationMs),
+        proto
+            .lapMetricsList
+            .map { DataType(it.dataType) to AggregateDataPoint.fromProto(it.aggregateDataPoint) }
+            .toMap()
+    )
 
-        dest.writeInt(lapMetrics.size)
-        for ((dataType, dataPoint) in lapMetrics) {
-            dest.writeParcelable(dataType, flags)
-            dest.writeParcelable(dataPoint, flags)
-        }
+    /** @hide */
+    override val proto: DataProto.ExerciseLapSummary by lazy {
+        DataProto.ExerciseLapSummary.newBuilder()
+            .setLapCount(lapCount)
+            .setStartTimeEpochMs(startTime.toEpochMilli())
+            .setEndTimeEpochMs(endTime.toEpochMilli())
+            .setActiveDurationMs(activeDuration.toMillis())
+            .addAllLapMetrics(
+                lapMetrics
+                    .map {
+                        LapMetricsEntry.newBuilder()
+                            .setDataType(it.key.proto)
+                            .setAggregateDataPoint(it.value.proto)
+                            .build()
+                    }
+                    .sortedBy { it.dataType.name } // Required to ensure equals() works
+            )
+            .build()
     }
 
+    override fun toString(): String =
+        "ExerciseLapSummary(" +
+            "lapCount=$lapCount, " +
+            "startTime=$startTime, " +
+            "endTime=$endTime, " +
+            "activeDuration=$activeDuration, " +
+            "lapMetrics=$lapMetrics)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseLapSummary> =
-            object : Parcelable.Creator<ExerciseLapSummary> {
-                override fun createFromParcel(source: Parcel): ExerciseLapSummary? {
-                    val lapCount = source.readInt()
-                    val startTime = Instant.ofEpochMilli(source.readLong())
-                    val endTime = Instant.ofEpochMilli(source.readLong())
-                    val activeDuration = Duration.ofMillis(source.readLong())
-
-                    val lapMetrics = HashMap<DataType, DataPoint>()
-                    val numMetrics = source.readInt()
-                    repeat(numMetrics) {
-                        val dataType: DataType =
-                            source.readParcelable(DataType::class.java.classLoader) ?: return null
-                        lapMetrics[dataType] =
-                            source.readParcelable(DataPoint::class.java.classLoader) ?: return null
-                    }
-
-                    return ExerciseLapSummary(
-                        lapCount,
-                        startTime,
-                        endTime,
-                        activeDuration,
-                        lapMetrics
-                    )
-                }
-
-                override fun newArray(size: Int): Array<ExerciseLapSummary?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseLapSummary> = newCreator { bytes ->
+            val proto = DataProto.ExerciseLapSummary.parseFrom(bytes)
+            ExerciseLapSummary(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt
index 964e271..1d46cc3 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseState.kt
@@ -16,9 +16,16 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto
+
 /** Enumerates the state of an exercise. */
 public enum class ExerciseState(public val id: Int) {
     /**
+     * The exercise is being prepared, GPS and HeartRate sensors will be turned on if requested in
+     * the [WarmUpConfig].
+     */
+    PREPARING(15),
+    /**
      * The exercise is actively being started, but we don't yet have sensor stability or GPS fix.
      *
      * Used only in the manually started exercise.
@@ -109,6 +116,18 @@
     AUTO_ENDED(12),
 
     /**
+     * The exercise is being automatically ended due to lack of client's permissions to receive data
+     * for the exercise.
+     */
+    AUTO_ENDING_PERMISSION_LOST(16),
+
+    /**
+     * The exercise has been automatically ended due to lack of client's permissions to receive data
+     * for the exercise.
+     */
+    AUTO_ENDED_PERMISSION_LOST(17),
+
+    /**
      * The exercise is being ended because it has been superseded by a new exercise being started by
      * another client. Sensors are actively being flushed.
      *
@@ -149,11 +168,30 @@
     public val isEnded: Boolean
         get() = ENDED_STATES.contains(this)
 
+    /**
+     * Returns true if this [ExerciseState] corresponds to one of the ending states and false
+     * otherwise. This method returns false if the exercise has ended, to check whether it has ended
+     * call [isEnded].
+     */
+    public val isEnding: Boolean
+        get() = ENDING_STATES.contains(this)
+
+    /** @hide */
+    internal fun toProto(): DataProto.ExerciseState =
+        DataProto.ExerciseState.forNumber(id) ?: DataProto.ExerciseState.EXERCISE_STATE_UNKNOWN
+
     public companion object {
         private val RESUMING_STATES = setOf(USER_RESUMING, AUTO_RESUMING)
         private val PAUSED_STATES = setOf(USER_PAUSED, AUTO_PAUSED)
-        private val ENDED_STATES = setOf(USER_ENDED, AUTO_ENDED, TERMINATED)
+        private val ENDED_STATES =
+            setOf(USER_ENDED, AUTO_ENDED, AUTO_ENDED_PERMISSION_LOST, TERMINATED)
+        private val ENDING_STATES =
+            setOf(USER_ENDING, AUTO_ENDING, AUTO_ENDING_PERMISSION_LOST, TERMINATING)
 
         @JvmStatic public fun fromId(id: Int): ExerciseState? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        @JvmStatic
+        public fun fromProto(proto: DataProto.ExerciseState): ExerciseState? = fromId(proto.number)
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTrackedStatus.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTrackedStatus.kt
index 2a1279b..a80f5c8 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTrackedStatus.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTrackedStatus.kt
@@ -16,14 +16,28 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.ExerciseTrackedStatus.EXERCISE_TRACKED_STATUS_UNKNOWN
+
 /** Status representing if an exercise is being tracked and which app owns the exercise. */
 public enum class ExerciseTrackedStatus(public val id: Int) {
+    /** An app other than the calling one owns the active exercise in progress. */
     OTHER_APP_IN_PROGRESS(1),
+    /** The current calling app owns the active exercise in progress. */
     OWNED_EXERCISE_IN_PROGRESS(2),
+    /** There is not currently any exercise in progress owned by any app. */
     NO_EXERCISE_IN_PROGRESS(3);
 
+    /** @hide */
+    public fun toProto(): DataProto.ExerciseTrackedStatus =
+        DataProto.ExerciseTrackedStatus.forNumber(id) ?: EXERCISE_TRACKED_STATUS_UNKNOWN
+
     public companion object {
         @JvmStatic
         public fun fromId(id: Int): ExerciseTrackedStatus? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        public fun fromProto(proto: DataProto.ExerciseTrackedStatus): ExerciseTrackedStatus? =
+            fromId(proto.number)
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt
index d385c67..d1420fd 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseType.kt
@@ -16,6 +16,8 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto
+
 // TODO(b/185276729): Keep track of values separately to maintain alphabetical order
 // once values are locked in
 /** Exercise type used to configure sensors and algorithms. */
@@ -57,58 +59,63 @@
     FRISBEE_DISC(28),
     FOOTBALL_AMERICAN(29),
     FOOTBALL_AUSTRALIAN(30),
-    GOLF(31),
-    GUIDED_BREATHING(32),
-    GYNMASTICS(33),
-    HANDBALL(34),
-    HIGH_INTENSITY_INTERVAL_TRAINING(35),
-    HIKING(36),
-    ICE_HOCKEY(37),
-    ICE_SKATING(38),
-    JUMP_ROPE(39),
-    JUMPING_JACK(40),
-    LAT_PULL_DOWN(41),
-    LUNGE(42),
-    MARTIAL_ARTS(43),
-    MEDITATION(44),
-    PADDLING(45),
-    PARA_GLIDING(46),
-    PILATES(47),
-    PLANK(48),
-    RACQUETBALL(49),
-    ROCK_CLIMBING(50),
-    ROLLER_HOCKEY(51),
-    ROWING(52),
-    ROWING_MACHINE(53),
-    RUNNING(54),
-    RUNNING_TREADMILL(55),
-    RUGBY(56),
-    SAILING(57),
-    SCUBA_DIVING(58),
-    SKATING(59),
-    SKIING(60),
-    SNOWBOARDING(61),
-    SNOWSHOEING(62),
-    SOCCER(63),
-    SOFTBALL(64),
-    SQUASH(65),
-    SQUAT(66),
-    STAIR_CLIMBING(67),
-    STAIR_CLIMBING_MACHINE(68),
-    STRENGTH_TRAINING(69),
-    STRETCHING(70),
-    SURFING(71),
-    SWIMMING_OPEN_WATER(72),
-    SWIMMING_POOL(73),
-    TABLE_TENNIS(74),
-    TENNIS(75),
-    VOLLEYBALL(76),
-    WALKING(77),
-    WATER_POLO(78),
-    WEIGHTLIFTING(79),
-    WORKOUT_INDOOR(80),
-    WORKOUT_OUTDOOR(81),
-    YOGA(82);
+    FORWARD_TWIST(31),
+    GOLF(32),
+    GUIDED_BREATHING(33),
+    GYMNASTICS(34),
+    HANDBALL(35),
+    HIGH_INTENSITY_INTERVAL_TRAINING(36),
+    HIKING(37),
+    ICE_HOCKEY(38),
+    ICE_SKATING(39),
+    JUMP_ROPE(40),
+    JUMPING_JACK(41),
+    LAT_PULL_DOWN(42),
+    LUNGE(43),
+    MARTIAL_ARTS(44),
+    MEDITATION(45),
+    PADDLING(46),
+    PARA_GLIDING(47),
+    PILATES(48),
+    PLANK(49),
+    RACQUETBALL(50),
+    ROCK_CLIMBING(51),
+    ROLLER_HOCKEY(52),
+    ROWING(53),
+    ROWING_MACHINE(54),
+    RUNNING(55),
+    RUNNING_TREADMILL(56),
+    RUGBY(57),
+    SAILING(58),
+    SCUBA_DIVING(59),
+    SKATING(60),
+    SKIING(61),
+    SNOWBOARDING(62),
+    SNOWSHOEING(63),
+    SOCCER(64),
+    SOFTBALL(65),
+    SQUASH(66),
+    SQUAT(67),
+    STAIR_CLIMBING(68),
+    STAIR_CLIMBING_MACHINE(69),
+    STRENGTH_TRAINING(70),
+    STRETCHING(71),
+    SURFING(72),
+    SWIMMING_OPEN_WATER(73),
+    SWIMMING_POOL(74),
+    TABLE_TENNIS(75),
+    TENNIS(76),
+    UPPER_TWIST(77),
+    VOLLEYBALL(78),
+    WALKING(79),
+    WATER_POLO(80),
+    WEIGHTLIFTING(81),
+    WORKOUT(82),
+    YOGA(83);
+
+    /** @hide */
+    public fun toProto(): DataProto.ExerciseType =
+        DataProto.ExerciseType.forNumber(id) ?: DataProto.ExerciseType.EXERCISE_TYPE_UNKNOWN
 
     public companion object {
         private val IDS = initialize()
@@ -131,5 +138,8 @@
             val exerciseType = IDS[id]
             return exerciseType ?: UNKNOWN
         }
+
+        /** @hide */
+        public fun fromProto(proto: DataProto.ExerciseType): ExerciseType = fromId(proto.number)
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt
index 1182089..90a14a2 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseTypeCapabilities.kt
@@ -16,87 +16,85 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities.SupportedGoalEntry
+import androidx.health.services.client.proto.DataProto.ExerciseTypeCapabilities.SupportedMilestoneEntry
 
 /** Provides exercise specific capabilities data. */
-public data class ExerciseTypeCapabilities(
-    val supportedDataTypes: Set<DataType>,
-    val supportedGoals: Map<DataType, Set<ComparisonType>>,
-    val supportedMilestones: Map<DataType, Set<ComparisonType>>,
-    val supportsAutoPauseAndResume: Boolean,
-    val supportsLaps: Boolean,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+@Suppress("ParcelCreator")
+public class ExerciseTypeCapabilities(
+    public val supportedDataTypes: Set<DataType>,
+    public val supportedGoals: Map<DataType, Set<ComparisonType>>,
+    public val supportedMilestones: Map<DataType, Set<ComparisonType>>,
+    public val supportsAutoPauseAndResume: Boolean,
+    public val supportsLaps: Boolean,
+) : ProtoParcelable<DataProto.ExerciseTypeCapabilities>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(supportedDataTypes.size)
-        dest.writeTypedArray(supportedDataTypes.toTypedArray(), flags)
+    internal constructor(
+        proto: DataProto.ExerciseTypeCapabilities
+    ) : this(
+        proto.supportedDataTypesList.map { DataType(it) }.toSet(),
+        proto
+            .supportedGoalsList
+            .map { entry ->
+                DataType(entry.dataType) to
+                    entry.comparisonTypesList.mapNotNull { ComparisonType.fromProto(it) }.toSet()
+            }
+            .toMap(),
+        proto
+            .supportedMilestonesList
+            .map { entry ->
+                DataType(entry.dataType) to
+                    entry.comparisonTypesList.mapNotNull { ComparisonType.fromProto(it) }.toSet()
+            }
+            .toMap(),
+        supportsAutoPauseAndResume = proto.isAutoPauseAndResumeSupported,
+        supportsLaps = proto.isLapsSupported
+    )
 
-        writeSupportedDataTypes(supportedGoals, dest, flags)
-        writeSupportedDataTypes(supportedMilestones, dest, flags)
-
-        dest.writeInt(if (supportsAutoPauseAndResume) 1 else 0)
-        dest.writeInt(if (supportsLaps) 1 else 0)
+    /** @hide */
+    override val proto: DataProto.ExerciseTypeCapabilities by lazy {
+        DataProto.ExerciseTypeCapabilities.newBuilder()
+            .addAllSupportedDataTypes(supportedDataTypes.map { it.proto })
+            .addAllSupportedGoals(
+                supportedGoals
+                    .map { entry ->
+                        SupportedGoalEntry.newBuilder()
+                            .setDataType(entry.key.proto)
+                            .addAllComparisonTypes(entry.value.map { it.toProto() })
+                            .build()
+                    }
+                    .sortedBy { it.dataType.name } // Sorting to ensure equals() works
+            )
+            .addAllSupportedMilestones(
+                supportedMilestones
+                    .map { entry ->
+                        SupportedMilestoneEntry.newBuilder()
+                            .setDataType(entry.key.proto)
+                            .addAllComparisonTypes(entry.value.map { it.toProto() })
+                            .build()
+                    }
+                    .sortedBy { it.dataType.name } // Sorting to ensure equals() works
+            )
+            .setIsAutoPauseAndResumeSupported(supportsAutoPauseAndResume)
+            .setIsLapsSupported(supportsLaps)
+            .build()
     }
 
+    override fun toString(): String =
+        "ExerciseTypeCapabilities(" +
+            "supportedDataTypes=$supportedDataTypes, " +
+            "supportedGoals=$supportedGoals, " +
+            "supportedMilestones=$supportedMilestones, " +
+            "supportsAutoPauseAndResume=$supportsAutoPauseAndResume, " +
+            "supportsLaps=$supportsLaps)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseTypeCapabilities> =
-            object : Parcelable.Creator<ExerciseTypeCapabilities> {
-                override fun createFromParcel(source: Parcel): ExerciseTypeCapabilities? {
-                    val supportedDataTypesArray = Array<DataType?>(source.readInt()) { null }
-                    source.readTypedArray(supportedDataTypesArray, DataType.CREATOR)
-
-                    val supportedGoals = readSupportedDataTypes(source) ?: return null
-                    val supportedMilestones = readSupportedDataTypes(source) ?: return null
-                    val supportsAutoPauseAndResume = source.readInt() == 1
-                    val supportsLaps = source.readInt() == 1
-
-                    return ExerciseTypeCapabilities(
-                        supportedDataTypesArray.filterNotNull().toSet(),
-                        supportedGoals,
-                        supportedMilestones,
-                        supportsAutoPauseAndResume,
-                        supportsLaps
-                    )
-                }
-
-                override fun newArray(size: Int): Array<ExerciseTypeCapabilities?> {
-                    return arrayOfNulls(size)
-                }
-            }
-
-        private fun writeSupportedDataTypes(
-            supportedDataTypes: Map<DataType, Set<ComparisonType>>,
-            dest: Parcel,
-            flags: Int
-        ) {
-            dest.writeInt(supportedDataTypes.size)
-            for ((dataType, comparisonTypeSet) in supportedDataTypes) {
-                dest.writeParcelable(dataType, flags)
-                dest.writeInt(comparisonTypeSet.size)
-                dest.writeIntArray(comparisonTypeSet.map { it.id }.toIntArray())
-            }
-        }
-
-        private fun readSupportedDataTypes(source: Parcel): Map<DataType, Set<ComparisonType>>? {
-            val supportedDataTypes = HashMap<DataType, Set<ComparisonType>>()
-
-            val numSupportedDataTypes = source.readInt()
-            repeat(numSupportedDataTypes) {
-                val dataType: DataType =
-                    source.readParcelable(DataType::class.java.classLoader) ?: return null
-
-                val comparisonTypeIntArray = IntArray(source.readInt())
-                source.readIntArray(comparisonTypeIntArray)
-                val comparisonTypeSet =
-                    comparisonTypeIntArray.map { ComparisonType.fromId(it) }.filterNotNull().toSet()
-
-                supportedDataTypes[dataType] = comparisonTypeSet
-            }
-
-            return supportedDataTypes
+        public val CREATOR: Parcelable.Creator<ExerciseTypeCapabilities> = newCreator { bytes ->
+            val proto = DataProto.ExerciseTypeCapabilities.parseFrom(bytes)
+            ExerciseTypeCapabilities(proto)
         }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseUpdate.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseUpdate.kt
index a97ec80..6cabc9e 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseUpdate.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ExerciseUpdate.kt
@@ -16,116 +16,142 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.AggregateCase.AGGREGATE_NOT_SET
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.AggregateCase.CUMULATIVE_DATA_POINT
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.AggregateCase.STATISTICAL_DATA_POINT
+import androidx.health.services.client.proto.DataProto.ExerciseUpdate.LatestMetricsEntry as LatestMetricsEntryProto
+import java.lang.IllegalStateException
 import java.time.Duration
 import java.time.Instant
 
 /** Contains the latest updated state and metrics for the current exercise. */
-public data class ExerciseUpdate(
+@Suppress("ParcelCreator")
+public class ExerciseUpdate(
     /** Returns the current status of the exercise. */
-    val state: ExerciseState,
+    public val state: ExerciseState,
 
-    /** Returns the time at which the exercise was started. */
-    val startTime: Instant,
+    /**
+     * Returns the time at which the exercise was started or `null` if the exercise is in prepare
+     * phase and hasn't started yet.
+     */
+    public val startTime: Instant?,
 
     /**
      * Returns the total elapsed time for which the exercise has been active, i.e. started but not
-     * paused.
+     * paused. The active duration is zero in prepare phase.
      */
-    val activeDuration: Duration,
+    public val activeDuration: Duration,
 
     /**
      * Returns the list of latest [DataPoint] for each metric keyed by data type name. This allows a
-     * client to easily query for the "current" values of each metric since last call. There will
-     * only be one value for an Aggregated DataType.
+     * client to easily query for the "current" values of each metric since last call.
      */
-    val latestMetrics: Map<DataType, List<DataPoint>>,
+    public val latestMetrics: Map<DataType, List<DataPoint>>,
+
+    /** Returns the latest aggregated values for each metric keyed by [DataType#name]. */
+    public val latestAggregateMetrics: Map<DataType, AggregateDataPoint>,
 
     /**
      * Returns the latest `#ONE_TIME_GOAL` [ExerciseGoal] s that have been achieved. `#MILESTONE`
      * [ExerciseGoal] s will be returned via `#getLatestMilestoneMarkerSummaries` below.
      */
-    val latestAchievedGoals: Set<AchievedExerciseGoal>,
+    public val latestAchievedGoals: Set<AchievedExerciseGoal>,
 
     /** Returns the latest [MilestoneMarkerSummary] s. */
-    val latestMilestoneMarkerSummaries: Set<MilestoneMarkerSummary>,
+    public val latestMilestoneMarkerSummaries: Set<MilestoneMarkerSummary>,
 
     /**
-     * Returns the [ExerciseConfig] used by the exercise when the [ExerciseUpdate] was dispatched.
+     * Returns the [ExerciseConfig] used by the exercise when the [ExerciseUpdate] was dispatched
+     * and returns `null` if the exercise is in prepare phase and hasn't been started yet.
      */
-    val exerciseConfig: ExerciseConfig,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val exerciseConfig: ExerciseConfig?,
+) : ProtoParcelable<DataProto.ExerciseUpdate>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(state.id)
-        dest.writeLong(startTime.toEpochMilli())
-        dest.writeLong(activeDuration.toMillis())
+    /** @hide */
+    public constructor(
+        proto: DataProto.ExerciseUpdate
+    ) : this(
+        ExerciseState.fromProto(proto.state)
+            ?: throw IllegalStateException("Invalid ExerciseState: ${proto.state}"),
+        if (proto.hasStartTimeEpochMs()) Instant.ofEpochMilli(proto.startTimeEpochMs) else null,
+        Duration.ofMillis(proto.activeDurationMs),
+        proto
+            .latestMetricsList
+            .map { metric ->
+                DataType(metric.dataType) to metric.dataPointsList.map { DataPoint(it) }
+            }
+            .toMap(),
+        proto
+            .latestAggregateMetricsList
+            .map { metric ->
+                when (metric.aggregateCase) {
+                    CUMULATIVE_DATA_POINT -> DataType(metric.cumulativeDataPoint.dataType)
+                    STATISTICAL_DATA_POINT -> DataType(metric.statisticalDataPoint.dataType)
+                    null, AGGREGATE_NOT_SET ->
+                        throw IllegalStateException("Aggregate not set on $metric")
+                } to AggregateDataPoint.fromProto(metric)
+            }
+            .toMap(),
+        proto.latestAchievedGoalsList.map { AchievedExerciseGoal(it) }.toSet(),
+        proto.mileStoneMarkerSummariesList.map { MilestoneMarkerSummary(it) }.toSet(),
+        if (proto.hasExerciseConfig()) ExerciseConfig(proto.exerciseConfig) else null
+    )
 
-        dest.writeInt(latestMetrics.size)
-        for ((dataType, dataPoints) in latestMetrics) {
-            dest.writeParcelable(dataType, flags)
-            dest.writeInt(dataPoints.size)
-            dest.writeTypedArray(dataPoints.toTypedArray(), flags)
-        }
+    /** @hide */
+    override val proto: DataProto.ExerciseUpdate by lazy {
+        val builder =
+            DataProto.ExerciseUpdate.newBuilder()
+                .setState(state.toProto())
+                .setActiveDurationMs(activeDuration.toMillis())
+                .addAllLatestMetrics(
+                    latestMetrics
+                        .map {
+                            LatestMetricsEntryProto.newBuilder()
+                                .setDataType(it.key.proto)
+                                .addAllDataPoints(it.value.map { dataPoint -> dataPoint.proto })
+                                .build()
+                        }
+                        .sortedBy { entry ->
+                            entry.dataType.name
+                        } // If we don't sort, equals() may not work.
+                )
+                .addAllLatestAggregateMetrics(
+                    latestAggregateMetrics.map { it.value.proto }.sortedBy { entry ->
+                        when (entry.aggregateCase) {
+                            CUMULATIVE_DATA_POINT -> entry.cumulativeDataPoint.dataType.name
+                            STATISTICAL_DATA_POINT -> entry.statisticalDataPoint.dataType.name
+                            null, AGGREGATE_NOT_SET ->
+                                throw IllegalStateException("Aggregate not set on $entry")
+                        }
+                    }
+                ) // If we don't sort, equals() may not work.
+                .addAllLatestAchievedGoals(latestAchievedGoals.map { it.proto })
+                .addAllMileStoneMarkerSummaries(latestMilestoneMarkerSummaries.map { it.proto })
 
-        dest.writeInt(latestAchievedGoals.size)
-        dest.writeTypedArray(latestAchievedGoals.toTypedArray(), flags)
+        startTime?.let { builder.setStartTimeEpochMs(startTime.toEpochMilli()) }
+        exerciseConfig?.let { builder.setExerciseConfig(exerciseConfig.proto) }
 
-        dest.writeInt(latestMilestoneMarkerSummaries.size)
-        dest.writeTypedArray(latestMilestoneMarkerSummaries.toTypedArray(), flags)
-
-        dest.writeParcelable(exerciseConfig, flags)
+        builder.build()
     }
 
+    override fun toString(): String =
+        "ExerciseUpdate(" +
+            "state=$state, " +
+            "startTime=$startTime, " +
+            "activeDuration=$activeDuration, " +
+            "latestMetrics=$latestMetrics, " +
+            "latestAggregateMetrics=$latestAggregateMetrics, " +
+            "latestAchievedGoals=$latestAchievedGoals, " +
+            "latestMilestoneMarkerSummaries=$latestMilestoneMarkerSummaries, " +
+            "exerciseConfig=$exerciseConfig)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseUpdate> =
-            object : Parcelable.Creator<ExerciseUpdate> {
-                override fun createFromParcel(source: Parcel): ExerciseUpdate? {
-                    val exerciseState = ExerciseState.fromId(source.readInt()) ?: return null
-                    val startTime = Instant.ofEpochMilli(source.readLong())
-                    val activeDuration = Duration.ofMillis(source.readLong())
-
-                    val numMetrics = source.readInt()
-                    val latestMetrics = HashMap<DataType, List<DataPoint>>()
-                    repeat(numMetrics) {
-                        val dataType: DataType =
-                            source.readParcelable(DataType::class.java.classLoader) ?: return null
-                        val dataPointsArray = Array<DataPoint?>(source.readInt()) { null }
-                        source.readTypedArray(dataPointsArray, DataPoint.CREATOR)
-                        latestMetrics[dataType] = dataPointsArray.filterNotNull().toList()
-                    }
-
-                    val latestAchievedGoalsArray =
-                        Array<AchievedExerciseGoal?>(source.readInt()) { null }
-                    source.readTypedArray(latestAchievedGoalsArray, AchievedExerciseGoal.CREATOR)
-
-                    val latestMilestoneMarkerSummariesArray =
-                        Array<MilestoneMarkerSummary?>(source.readInt()) { null }
-                    source.readTypedArray(
-                        latestMilestoneMarkerSummariesArray,
-                        MilestoneMarkerSummary.CREATOR
-                    )
-
-                    val exerciseConfig: ExerciseConfig =
-                        source.readParcelable(ExerciseConfig::class.java.classLoader) ?: return null
-
-                    return ExerciseUpdate(
-                        exerciseState,
-                        startTime,
-                        activeDuration,
-                        latestMetrics,
-                        latestAchievedGoalsArray.filterNotNull().toSet(),
-                        latestMilestoneMarkerSummariesArray.filterNotNull().toSet(),
-                        exerciseConfig,
-                    )
-                }
-
-                override fun newArray(size: Int): Array<ExerciseUpdate?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseUpdate> = newCreator { bytes ->
+            val proto = DataProto.ExerciseUpdate.parseFrom(bytes)
+            ExerciseUpdate(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/HrAccuracy.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/HrAccuracy.kt
new file mode 100644
index 0000000..3edb191
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/HrAccuracy.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.DataPointAccuracy.HrAccuracy as HrAccuracyProto
+import androidx.health.services.client.proto.DataProto.DataPointAccuracy.HrAccuracy.SensorStatus as SensorStatusProto
+
+/** Accuracy for a [DataType.HEART_RATE_BPM] data point. */
+@Suppress("ParcelCreator")
+public class HrAccuracy(public val sensorStatus: SensorStatus) : DataPointAccuracy() {
+
+    internal constructor(
+        proto: DataProto.DataPointAccuracy
+    ) : this(SensorStatus.fromProto(proto.hrAccuracy.sensorStatus))
+
+    public enum class SensorStatus(public val id: Int) {
+        UNKNOWN(0),
+        NO_CONTACT(1),
+        UNRELIABLE(2),
+        ACCURACY_LOW(3),
+        ACCURACY_MEDIUM(4),
+        ACCURACY_HIGH(5);
+
+        /** @hide */
+        internal fun toProto(): SensorStatusProto =
+            SensorStatusProto.forNumber(id) ?: SensorStatusProto.HR_ACCURACY_SENSOR_STATUS_UNKNOWN
+
+        /** @hide */
+        public companion object {
+            /** @hide */
+            public fun fromProto(proto: SensorStatusProto): SensorStatus =
+                values().firstOrNull { it.id == proto.number } ?: UNKNOWN
+        }
+    }
+
+    /** @hide */
+    override val proto: DataProto.DataPointAccuracy by lazy {
+        DataProto.DataPointAccuracy.newBuilder()
+            .setHrAccuracy(HrAccuracyProto.newBuilder().setSensorStatus(sensorStatus.toProto()))
+            .build()
+    }
+
+    override fun toString(): String = "HrAccuracy(sensorStatus=$sensorStatus)"
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<HrAccuracy> = newCreator {
+            val proto = DataProto.DataPointAccuracy.parseFrom(it)
+            HrAccuracy(proto)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/LocationAccuracy.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/LocationAccuracy.kt
new file mode 100644
index 0000000..dd9b2be
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/LocationAccuracy.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.DataPointAccuracy.LocationAccuracy as LocationAccuracyProto
+
+/** Accuracy for a [DataType.LOCATION] data point. */
+@Suppress("ParcelCreator")
+public class LocationAccuracy(
+    /** Represents the estimated horizontal accuracy of the location, radial, in meters. */
+    public val horizontalPositionError: Double
+) : DataPointAccuracy() {
+
+    internal constructor(
+        proto: DataProto.DataPointAccuracy
+    ) : this(proto.locationAccuracy.horizontalPositionError)
+
+    /** @hide */
+    override val proto: DataProto.DataPointAccuracy by lazy {
+        DataProto.DataPointAccuracy.newBuilder()
+            .setLocationAccuracy(
+                LocationAccuracyProto.newBuilder()
+                    .setHorizontalPositionError(horizontalPositionError)
+                    .build()
+            )
+            .build()
+    }
+
+    override fun toString(): String =
+        "LocationAccuracy(horizontalPositionError=$horizontalPositionError)"
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<LocationAccuracy> = newCreator {
+            val proto = DataProto.DataPointAccuracy.parseFrom(it)
+            LocationAccuracy(proto)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/LocationAvailability.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/LocationAvailability.kt
new file mode 100644
index 0000000..acdd966
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/LocationAvailability.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.Availability.LocationAvailability as LocationAvailabilityProto
+import androidx.health.services.client.proto.DataProto.Availability.LocationAvailability.LOCATION_AVAILABILITY_UNKNOWN
+
+/** Availability of a [DataType.LOCATION] data type. */
+public enum class LocationAvailability(public override val id: Int) : Availability {
+    UNKNOWN(0),
+
+    /** Location is not available. */
+    UNAVAILABLE(1),
+
+    /** The on-device GPS is disabled, so location cannot be acquired. */
+    NO_GPS(2),
+
+    /** Acquiring location. */
+    ACQUIRING(3),
+
+    /** Acquired location through connected phone. */
+    ACQUIRED_TETHERED(4),
+
+    /** Acquired location through watch. */
+    ACQUIRED_UNTETHERED(5);
+
+    /** @hide */
+    public override fun toProto(): DataProto.Availability =
+        DataProto.Availability.newBuilder()
+            .setLocationAvailability(
+                LocationAvailabilityProto.forNumber(id) ?: LOCATION_AVAILABILITY_UNKNOWN
+            )
+            .build()
+
+    public companion object {
+        @JvmStatic
+        public fun fromId(id: Int): LocationAvailability? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        public fun fromProto(proto: LocationAvailabilityProto): LocationAvailability =
+            fromId(proto.number) ?: UNKNOWN
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/MeasureCapabilities.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/MeasureCapabilities.kt
index 5f7b063..ea57f1c 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/MeasureCapabilities.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/MeasureCapabilities.kt
@@ -16,43 +16,43 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
 
 /**
  * A place holder class that represents the capabilities of the
  * [androidx.health.services.client.MeasureClient] on the device.
  */
-public data class MeasureCapabilities(
+@Suppress("ParcelCreator")
+public class MeasureCapabilities(
     /**
      * Set of supported [DataType] s for measure capture on this device.
      *
      * Some data types are not available for measurement; this is typically used to measure health
      * data (e.g. HR).
      */
-    val supportedDataTypesMeasure: Set<DataType>,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val supportedDataTypesMeasure: Set<DataType>,
+) : ProtoParcelable<DataProto.MeasureCapabilities>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeTypedList(supportedDataTypesMeasure.toList())
+    internal constructor(
+        proto: DataProto.MeasureCapabilities
+    ) : this(proto.supportedDataTypesList.map { DataType(it) }.toSet())
+
+    /** @hide */
+    override val proto: DataProto.MeasureCapabilities by lazy {
+        DataProto.MeasureCapabilities.newBuilder()
+            .addAllSupportedDataTypes(supportedDataTypesMeasure.map { it.proto })
+            .build()
     }
 
+    override fun toString(): String =
+        "MeasureCapabilities(supportedDataTypesMeasure=$supportedDataTypesMeasure)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<MeasureCapabilities> =
-            object : Parcelable.Creator<MeasureCapabilities> {
-                override fun createFromParcel(source: Parcel): MeasureCapabilities? {
-                    val measureDataTypes = ArrayList<DataType>()
-                    source.readTypedList(measureDataTypes, DataType.CREATOR)
-                    return MeasureCapabilities(
-                        measureDataTypes.toSet(),
-                    )
-                }
-
-                override fun newArray(size: Int): Array<MeasureCapabilities?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<MeasureCapabilities> = newCreator { bytes ->
+            val proto = DataProto.MeasureCapabilities.parseFrom(bytes)
+            MeasureCapabilities(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/MilestoneMarkerSummary.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/MilestoneMarkerSummary.kt
index 98a340c..4c61c20 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/MilestoneMarkerSummary.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/MilestoneMarkerSummary.kt
@@ -16,84 +16,86 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.MilestoneMarkerSummary.SummaryMetricsEntry
 import java.time.Duration
 import java.time.Instant
 
 /**
  * The summary of metrics and state from the previously achieved milestone marker [ExerciseGoal].
  */
-public data class MilestoneMarkerSummary(
+@Suppress("ParcelCreator")
+public class MilestoneMarkerSummary(
     /** Returns the time at which this milestone marker started being tracked. */
-    val startTime: Instant,
+    public val startTime: Instant,
 
     /** Returns the time at which this milestone marker was reached. */
-    val endTime: Instant,
+    public val endTime: Instant,
 
     /**
      * Returns the total elapsed time for which the exercise was active during this milestone, i.e.
      * started but not paused.
      */
-    val activeDuration: Duration,
+    public val activeDuration: Duration,
 
     /** The [AchievedExerciseGoal] that triggered this milestone summary. */
-    val achievedGoal: AchievedExerciseGoal,
+    public val achievedGoal: AchievedExerciseGoal,
 
     /**
      * Returns the [DataPoint] for each aggregated metric keyed by [DataType] tracked between
      * [startTime] and [endTime] i.e. during the duration of this milestone.
      */
-    val summaryMetrics: Map<DataType, DataPoint>,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val summaryMetrics: Map<DataType, AggregateDataPoint>,
+) : ProtoParcelable<DataProto.MilestoneMarkerSummary>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeLong(startTime.toEpochMilli())
-        dest.writeLong(endTime.toEpochMilli())
-        dest.writeLong(activeDuration.toMillis())
-        dest.writeParcelable(achievedGoal, flags)
+    internal constructor(
+        proto: DataProto.MilestoneMarkerSummary
+    ) : this(
+        Instant.ofEpochMilli(proto.startTimeEpochMs),
+        Instant.ofEpochMilli(proto.endTimeEpochMs),
+        Duration.ofMillis(proto.activeDurationMs),
+        AchievedExerciseGoal(proto.achievedGoal),
+        proto
+            .summaryMetricsList
+            .map { DataType(it.dataType) to AggregateDataPoint.fromProto(it.aggregateDataPoint) }
+            .toMap()
+    )
 
-        dest.writeInt(summaryMetrics.size)
-        for ((dataType, dataPoint) in summaryMetrics) {
-            dest.writeParcelable(dataType, flags)
-            dest.writeParcelable(dataPoint, flags)
-        }
+    /** @hide */
+    override val proto: DataProto.MilestoneMarkerSummary by lazy {
+        DataProto.MilestoneMarkerSummary.newBuilder()
+            .setStartTimeEpochMs(startTime.toEpochMilli())
+            .setEndTimeEpochMs(endTime.toEpochMilli())
+            .setActiveDurationMs(activeDuration.toMillis())
+            .setAchievedGoal(achievedGoal.proto)
+            .addAllSummaryMetrics(
+                summaryMetrics
+                    .map {
+                        SummaryMetricsEntry.newBuilder()
+                            .setDataType(it.key.proto)
+                            .setAggregateDataPoint(it.value.proto)
+                            .build()
+                    }
+                    .sortedBy { entry ->
+                        entry.dataType.name
+                    } // Sorting to ensure equals() works correctly.
+            )
+            .build()
     }
 
+    override fun toString(): String =
+        "MilestoneMarkerSummary(" +
+            "startTime=$startTime, " +
+            "endTime=$endTime, " +
+            "achievedGoal=$achievedGoal, " +
+            "summaryMetrics=$summaryMetrics)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<MilestoneMarkerSummary> =
-            object : Parcelable.Creator<MilestoneMarkerSummary> {
-                override fun createFromParcel(source: Parcel): MilestoneMarkerSummary? {
-                    val startTime = Instant.ofEpochMilli(source.readLong())
-                    val endTime = Instant.ofEpochMilli(source.readLong())
-                    val activeDuration = Duration.ofMillis(source.readLong())
-                    val achievedGoal: AchievedExerciseGoal =
-                        source.readParcelable(AchievedExerciseGoal::class.java.classLoader)
-                            ?: return null
-
-                    val summaryMetrics = HashMap<DataType, DataPoint>()
-                    repeat(source.readInt()) {
-                        val dataType: DataType =
-                            source.readParcelable(DataType::class.java.classLoader) ?: return null
-                        val dataPoint: DataPoint =
-                            source.readParcelable(DataPoint::class.java.classLoader) ?: return null
-                        summaryMetrics[dataType] = dataPoint
-                    }
-
-                    return MilestoneMarkerSummary(
-                        startTime = startTime,
-                        endTime = endTime,
-                        activeDuration = activeDuration,
-                        achievedGoal = achievedGoal,
-                        summaryMetrics = summaryMetrics
-                    )
-                }
-
-                override fun newArray(size: Int): Array<MilestoneMarkerSummary?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<MilestoneMarkerSummary> = newCreator { bytes ->
+            val proto = DataProto.MilestoneMarkerSummary.parseFrom(bytes)
+            MilestoneMarkerSummary(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveGoal.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveGoal.kt
new file mode 100644
index 0000000..d4912c3
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveGoal.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import android.content.Intent
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto.PassiveGoal as PassiveGoalProto
+
+/** Defines an passive goal that will be triggered when the specified condition is met. */
+@Suppress("ParcelCreator")
+public class PassiveGoal(
+    /** [DataTypeCondition] which must be met for the passive goal to be triggered. */
+    public val dataTypeCondition: DataTypeCondition,
+    public val triggerType: TriggerType,
+) : ProtoParcelable<PassiveGoalProto>() {
+
+    internal constructor(
+        proto: PassiveGoalProto
+    ) : this(
+        DataTypeCondition(proto.condition),
+        TriggerType.fromProto(proto.triggerType)
+            ?: throw IllegalStateException("Invalid TriggerType ${proto.triggerType}")
+    )
+
+    /** @hide */
+    override val proto: PassiveGoalProto by lazy {
+        PassiveGoalProto.newBuilder()
+            .setCondition(dataTypeCondition.proto)
+            .setTriggerType(triggerType.toProto())
+            .build()
+    }
+
+    /**
+     * Puts the goal as an extra into a given [Intent]. The state can then be obtained from the
+     * intent via [PassiveGoal.fromIntent].
+     */
+    public fun putToIntent(intent: Intent) {
+        intent.putExtra(EXTRA_KEY, this)
+    }
+
+    override fun toString(): String =
+        "PassiveGoal(dataTypeCondition=$dataTypeCondition, triggerType=$triggerType)"
+
+    /** Whether or not repeated passive goals should be triggered. */
+    public enum class TriggerType(public val id: Int) {
+        /** The passive goal will trigger the first time the specified conditions are met. */
+        ONCE(1),
+
+        /**
+         * The passive goal will trigger each time the specified conditions *become* met. Repeated
+         * goals on daily metrics will trigger once per day.
+         */
+        REPEATED(2);
+
+        /** @hide */
+        public fun toProto(): PassiveGoalProto.TriggerType =
+            PassiveGoalProto.TriggerType.forNumber(id)
+                ?: PassiveGoalProto.TriggerType.TRIGGER_TYPE_UNKNOWN
+
+        public companion object {
+            @JvmStatic
+            public fun fromId(id: Int): TriggerType? = values().firstOrNull { it.id == id }
+
+            /** @hide */
+            public fun fromProto(proto: PassiveGoalProto.TriggerType): TriggerType? =
+                fromId(proto.number)
+        }
+    }
+
+    /**
+     * Does the provided [DataPoint] satisfy the passive goal condition.
+     *
+     * @throws IllegalArgumentException if the provided data point is not of the same data type as
+     * the condition itself.
+     */
+    public fun isTriggered(dataPoint: DataPoint): Boolean {
+        return dataTypeCondition.isSatisfied(dataPoint)
+    }
+
+    public companion object {
+        private const val EXTRA_KEY = "hs.passive_goal"
+        @Suppress("ActionValue") public const val ACTION_GOAL: String = "hs.passivemonitoring.GOAL"
+
+        @JvmField
+        public val CREATOR: Parcelable.Creator<PassiveGoal> = newCreator { bytes ->
+            val proto = PassiveGoalProto.parseFrom(bytes)
+            PassiveGoal(proto)
+        }
+
+        /**
+         * Creates a [PassiveGoal] from an [Intent]. Returns null if no [PassiveGoal] is stored in
+         * the given intent.
+         */
+        @JvmStatic
+        public fun fromIntent(intent: Intent): PassiveGoal? = intent.getParcelableExtra(EXTRA_KEY)
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringCapabilities.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringCapabilities.kt
index ec3d463..201e181 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringCapabilities.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringCapabilities.kt
@@ -16,50 +16,55 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.PassiveMonitoringCapabilities as PassiveMonitoringCapabilitiesProto
 
 /**
  * A place holder class that represents the capabilities of the
  * [androidx.health.services.client.PassiveMonitoringClient] on the device.
  */
-public data class PassiveMonitoringCapabilities(
+@Suppress("ParcelCreator")
+public class PassiveMonitoringCapabilities(
 
     /**
      * Set of supported [DataType] s for background capture on this device.
      *
      * Some data types are only available during exercise (e.g. location) or for measurements.
      */
-    val supportedDataTypesPassiveMonitoring: Set<DataType>,
+    public val supportedDataTypesPassiveMonitoring: Set<DataType>,
 
     /** Set of supported [DataType] s for event callbacks on this device. */
-    val supportedDataTypesEvents: Set<DataType>,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val supportedDataTypesEvents: Set<DataType>,
+) : ProtoParcelable<PassiveMonitoringCapabilitiesProto>() {
+    internal constructor(
+        proto: DataProto.PassiveMonitoringCapabilities
+    ) : this(
+        proto.supportedDataTypesPassiveMonitoringList.map { DataType(it) }.toSet(),
+        proto.supportedDataTypesEventsList.map { DataType(it) }.toSet()
+    )
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeTypedList(supportedDataTypesPassiveMonitoring.toList())
-        dest.writeTypedList(supportedDataTypesEvents.toList())
+    /** @hide */
+    override val proto: PassiveMonitoringCapabilitiesProto by lazy {
+        PassiveMonitoringCapabilitiesProto.newBuilder()
+            .addAllSupportedDataTypesPassiveMonitoring(
+                supportedDataTypesPassiveMonitoring.map { it.proto }
+            )
+            .addAllSupportedDataTypesEvents(supportedDataTypesEvents.map { it.proto })
+            .build()
     }
 
+    override fun toString(): String =
+        "PassiveMonitoringCapabilities(" +
+            "supportedDataTypesPassiveMonitoring=$supportedDataTypesPassiveMonitoring, " +
+            "supportedDataTypesEvents=$supportedDataTypesEvents)"
+
     public companion object {
         @JvmField
         public val CREATOR: Parcelable.Creator<PassiveMonitoringCapabilities> =
-            object : Parcelable.Creator<PassiveMonitoringCapabilities> {
-                override fun createFromParcel(source: Parcel): PassiveMonitoringCapabilities? {
-                    val passiveMonitoringDataTypes = ArrayList<DataType>()
-                    source.readTypedList(passiveMonitoringDataTypes, DataType.CREATOR)
-                    val eventDataTypes = ArrayList<DataType>()
-                    source.readTypedList(eventDataTypes, DataType.CREATOR)
-                    return PassiveMonitoringCapabilities(
-                        passiveMonitoringDataTypes.toSet(),
-                        eventDataTypes.toSet()
-                    )
-                }
-
-                override fun newArray(size: Int): Array<PassiveMonitoringCapabilities?> {
-                    return arrayOfNulls(size)
-                }
+            newCreator { bytes ->
+                val proto = PassiveMonitoringCapabilitiesProto.parseFrom(bytes)
+                PassiveMonitoringCapabilities(proto)
             }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringConfig.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringConfig.kt
new file mode 100644
index 0000000..78ade89
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringConfig.kt
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import android.content.ComponentName
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+
+/** Configuration that defines a request for passive monitoring using HealthServices. */
+@Suppress("DataClassPrivateConstructor", "ParcelCreator")
+public class PassiveMonitoringConfig
+protected constructor(
+    public val dataTypes: Set<DataType>,
+    public val componentName: ComponentName,
+    @get:JvmName("shouldIncludeUserActivityState")
+    public val shouldIncludeUserActivityState: Boolean,
+) : ProtoParcelable<DataProto.PassiveMonitoringConfig>() {
+
+    internal constructor(
+        proto: DataProto.PassiveMonitoringConfig
+    ) : this(
+        proto.dataTypesList.map { DataType(it) }.toSet(),
+        ComponentName(proto.packageName, proto.receiverClassName),
+        proto.includeUserActivityState
+    )
+
+    init {
+        require(dataTypes.isNotEmpty()) { "Must specify the desired data types." }
+    }
+
+    /** Builder for [PassiveMonitoringConfig] instances. */
+    public class Builder {
+        private var dataTypes: Set<DataType> = emptySet()
+        private var componentName: ComponentName? = null
+        private var shouldIncludeUserActivityState: Boolean = false
+
+        /**
+         * Sets the requested [DataType] s that should be passively tracked. It is required to
+         * specify a set of [DataType]s to create a valid configuration. Failure to do so will
+         * result in an exception thrown when `build` is called.
+         */
+        public fun setDataTypes(dataTypes: Set<DataType>): Builder {
+            this.dataTypes = dataTypes.toSet()
+            return this
+        }
+
+        /**
+         * Sets the [ComponentName] that WHS should send the [PassiveMonitoringUpdate] intents to.
+         */
+        public fun setComponentName(componentName: ComponentName): Builder {
+            this.componentName = componentName
+            return this
+        }
+
+        /**
+         * Sets whether to include the [UserActivityState] with the [PassiveMonitoringUpdate]s. If
+         * not set they will not be included by default. [UserActivityState] requires
+         * [permission.ACTIVITY_RECOGNITION]
+         */
+        @Suppress("MissingGetterMatchingBuilder")
+        public fun setShouldIncludeUserActivityState(
+            shouldIncludeUserActivityState: Boolean
+        ): Builder {
+            this.shouldIncludeUserActivityState = shouldIncludeUserActivityState
+            return this
+        }
+
+        /** Returns the built [PassiveMonitoringConfig]. */
+        public fun build(): PassiveMonitoringConfig {
+            require(dataTypes.isNotEmpty()) { "Must specify the desired data types." }
+            return PassiveMonitoringConfig(
+                dataTypes,
+                checkNotNull(componentName) { "No component name specified." },
+                shouldIncludeUserActivityState,
+            )
+        }
+    }
+
+    /** @hide */
+    override val proto: DataProto.PassiveMonitoringConfig by lazy {
+        DataProto.PassiveMonitoringConfig.newBuilder()
+            .addAllDataTypes(dataTypes.map { it.proto })
+            .setPackageName(componentName.getPackageName())
+            .setReceiverClassName(componentName.getClassName())
+            .setIncludeUserActivityState(shouldIncludeUserActivityState)
+            .build()
+    }
+
+    public companion object {
+        @JvmStatic public fun builder(): Builder = Builder()
+
+        @JvmField
+        public val CREATOR: Parcelable.Creator<PassiveMonitoringConfig> = newCreator { bytes ->
+            val proto = DataProto.PassiveMonitoringConfig.parseFrom(bytes)
+            PassiveMonitoringConfig(proto)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringUpdate.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringUpdate.kt
index a04cb94..c57e698 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringUpdate.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/PassiveMonitoringUpdate.kt
@@ -17,8 +17,9 @@
 package androidx.health.services.client.data
 
 import android.content.Intent
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.PassiveMonitoringUpdate as PassiveMonitoringUpdateProto
 
 /**
  * Represents an update from Passive tracking.
@@ -26,13 +27,21 @@
  * Provides [DataPoint] s associated with the Passive tracking, in addition to data related to the
  * user's [UserActivityState].
  */
-public data class PassiveMonitoringUpdate(
+@Suppress("ParcelCreator")
+public class PassiveMonitoringUpdate(
     /** List of [DataPoint] s from Passive tracking. */
-    val dataPoints: List<DataPoint>,
+    public val dataPoints: List<DataPoint>,
 
     /** The [UserActivityInfo] of the user from Passive tracking. */
-    val userActivityInfoUpdates: List<UserActivityInfo>,
-) : Parcelable {
+    public val userActivityInfoUpdates: List<UserActivityInfo>,
+) : ProtoParcelable<PassiveMonitoringUpdateProto>() {
+
+    internal constructor(
+        proto: DataProto.PassiveMonitoringUpdate
+    ) : this(
+        proto.dataPointsList.map { DataPoint(it) },
+        proto.userActivityInfoUpdatesList.map { UserActivityInfo(it) }
+    )
 
     /**
      * Puts the state as an extra into a given [Intent]. The state can then be obtained from the
@@ -42,40 +51,28 @@
         intent.putExtra(EXTRA_KEY, this)
     }
 
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(dataPoints.size)
-        dest.writeTypedArray(dataPoints.toTypedArray(), flags)
-
-        dest.writeInt(userActivityInfoUpdates.size)
-        dest.writeTypedArray(userActivityInfoUpdates.toTypedArray(), flags)
+    /** @hide */
+    override val proto: PassiveMonitoringUpdateProto by lazy {
+        PassiveMonitoringUpdateProto.newBuilder()
+            .addAllDataPoints(dataPoints.map { it.proto })
+            .addAllUserActivityInfoUpdates(userActivityInfoUpdates.map { it.proto })
+            .build()
     }
 
+    override fun toString(): String =
+        "PassiveMonitoringUpdate(" +
+            "dataPoints=$dataPoints, " +
+            "userActivityInfoUpdates=$userActivityInfoUpdates)"
+
     public companion object {
         private const val EXTRA_KEY = "hs.passive_monitoring_update"
+        @Suppress("ActionValue") public const val ACTION_DATA: String = "hs.passivemonitoring.DATA"
 
         @JvmField
-        public val CREATOR: Parcelable.Creator<PassiveMonitoringUpdate> =
-            object : Parcelable.Creator<PassiveMonitoringUpdate> {
-                override fun createFromParcel(source: Parcel): PassiveMonitoringUpdate? {
-                    val dataPointsArray: Array<DataPoint?> = arrayOfNulls(source.readInt())
-                    source.readTypedArray(dataPointsArray, DataPoint.CREATOR)
-
-                    val userActivityInfoArray: Array<UserActivityInfo?> =
-                        arrayOfNulls(source.readInt())
-                    source.readTypedArray(userActivityInfoArray, UserActivityInfo.CREATOR)
-
-                    return PassiveMonitoringUpdate(
-                        dataPointsArray.filterNotNull().toList(),
-                        userActivityInfoArray.filterNotNull().toList(),
-                    )
-                }
-
-                override fun newArray(size: Int): Array<PassiveMonitoringUpdate?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<PassiveMonitoringUpdate> = newCreator { bytes ->
+            val proto = PassiveMonitoringUpdateProto.parseFrom(bytes)
+            PassiveMonitoringUpdate(proto)
+        }
 
         /**
          * Creates a [PassiveMonitoringUpdate] from an [Intent]. Returns null if no
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/ProtoParcelable.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/ProtoParcelable.kt
new file mode 100644
index 0000000..85b49b0
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/ProtoParcelable.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import android.os.Parcel
+import android.os.Parcelable
+import android.os.Parcelable.Creator
+import com.google.protobuf.MessageLite
+
+/**
+ * Base class for parcelables backed by protos.
+ *
+ * Provided [proto] represents everything important to subclasses, they need not implement [equals]
+ * and [hashCode].
+ */
+@Suppress("ParcelCreator", "ParcelNotFinal")
+public abstract class ProtoParcelable<T : MessageLite> : Parcelable {
+
+    /** Proto representation of this object. */
+    public abstract val proto: T
+
+    /** Serialized representation of this object. */
+    protected val bytes: ByteArray by lazy { proto.toByteArray() }
+
+    public override fun describeContents(): Int = 0
+
+    public override fun writeToParcel(dest: Parcel, flags: Int) {
+        dest.writeByteArray(this.bytes)
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) {
+            return true
+        }
+
+        // It's possible that two objects from different classes have the same serialized form,
+        // however
+        // they shouldn't be considered equal unless they're of the same class.
+        if (other == null || javaClass != other.javaClass) {
+            return false
+        }
+
+        val that = other as ProtoParcelable<*>
+        return bytes.contentEquals(that.bytes)
+    }
+
+    override fun hashCode(): Int = bytes.contentHashCode()
+
+    public companion object {
+        /**
+         * Constructs and returns a [Creator] based on the provided [parser] accepting a [ByteArray]
+         * .
+         * @hide
+         */
+        public inline fun <reified U : ProtoParcelable<*>> newCreator(
+            crossinline parser: (ByteArray) -> U
+        ): Creator<U> {
+            return object : Creator<U> {
+                override fun createFromParcel(source: Parcel): U? {
+                    val payload: ByteArray = source.createByteArray() ?: return null
+                    return parser(payload)
+                }
+
+                override fun newArray(size: Int) = arrayOfNulls<U>(size)
+            }
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/StatisticalDataPoint.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/StatisticalDataPoint.kt
new file mode 100644
index 0000000..177670b
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/StatisticalDataPoint.kt
@@ -0,0 +1,66 @@
+package androidx.health.services.client.data
+
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.AggregateDataPoint.StatisticalDataPoint as StatisticalDataPointProto
+import java.time.Instant
+
+/**
+ * An [AggregateDataPoint] containing the statistical aggregates [min], [max], and [average] for the
+ * type [dataType] between [startTime] and [endTime]. This should generally correspond with
+ * [DataPoint]s of type [DataType.TimeType.SAMPLE].
+ */
+@Suppress("ParcelCreator")
+public class StatisticalDataPoint(
+    public val startTime: Instant,
+    public val endTime: Instant,
+    public val dataType: DataType,
+    public val min: Value,
+    public val max: Value,
+    public val average: Value,
+) : AggregateDataPoint() {
+
+    internal constructor(
+        proto: DataProto.AggregateDataPoint
+    ) : this(
+        Instant.ofEpochMilli(proto.statisticalDataPoint.startTimeEpochMs),
+        Instant.ofEpochMilli(proto.statisticalDataPoint.endTimeEpochMs),
+        DataType(proto.statisticalDataPoint.dataType),
+        Value(proto.statisticalDataPoint.minValue),
+        Value(proto.statisticalDataPoint.maxValue),
+        Value(proto.statisticalDataPoint.avgValue)
+    )
+
+    /** @hide */
+    override val proto: DataProto.AggregateDataPoint by lazy {
+        DataProto.AggregateDataPoint.newBuilder()
+            .setStatisticalDataPoint(
+                StatisticalDataPointProto.newBuilder()
+                    .setStartTimeEpochMs(startTime.toEpochMilli())
+                    .setEndTimeEpochMs(endTime.toEpochMilli())
+                    .setDataType(dataType.proto)
+                    .setMinValue(min.proto)
+                    .setMaxValue(max.proto)
+                    .setAvgValue(average.proto)
+                    .build()
+            )
+            .build()
+    }
+
+    override fun toString(): String =
+        "StatisticalDataPoint(" +
+            "startTime=$startTime, " +
+            "endTime=$endTime, " +
+            "dataType=$dataType, " +
+            "min=$min, " +
+            "max=$max, " +
+            "average=$average)"
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<StatisticalDataPoint> = newCreator {
+            val proto = DataProto.AggregateDataPoint.parseFrom(it)
+            StatisticalDataPoint(proto)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityInfo.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityInfo.kt
index 45b5270..2ebb589 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityInfo.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityInfo.kt
@@ -16,13 +16,13 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.UserActivityState.USER_ACTIVITY_ASLEEP
 import androidx.health.services.client.data.UserActivityState.USER_ACTIVITY_EXERCISE
-import androidx.health.services.client.data.UserActivityState.USER_ACTIVITY_INACTIVE
 import androidx.health.services.client.data.UserActivityState.USER_ACTIVITY_PASSIVE
 import androidx.health.services.client.data.UserActivityState.USER_ACTIVITY_UNKNOWN
+import androidx.health.services.client.proto.DataProto
+import androidx.health.services.client.proto.DataProto.UserActivityInfo as UserActivityInfoProto
 import java.time.Instant
 
 /**
@@ -31,73 +31,74 @@
  * Provides [DataPoint] s associated with the Passive tracking, in addition to data related to the
  * user's [UserActivityState].
  */
-public data class UserActivityInfo(
+@Suppress("ParcelCreator")
+public class UserActivityInfo(
     /** The [UserActivityState] of the user from Passive tracking. */
-    val userActivityState: UserActivityState,
+    public val userActivityState: UserActivityState,
 
     /**
-     * The [ExerciseType] of the user for a [UserActivityState.USER_ACTIVITY_EXERCISE] state, and
+     * The [ExerciseInfo] of the user for a [UserActivityState.USER_ACTIVITY_EXERCISE] state, and
      * `null` for other [UserActivityState] s.
      */
-    val exerciseType: ExerciseType?,
+    public val exerciseInfo: ExerciseInfo?,
 
     /** The time at which the current state took effect. */
-    val stateChangeTime: Instant,
-) : Parcelable {
+    public val stateChangeTime: Instant,
+) : ProtoParcelable<UserActivityInfoProto>() {
 
-    override fun describeContents(): Int = 0
+    internal constructor(
+        proto: DataProto.UserActivityInfo
+    ) : this(
+        UserActivityState.fromProto(proto.state),
+        if (proto.hasExerciseInfo()) ExerciseInfo(proto.exerciseInfo) else null,
+        Instant.ofEpochMilli(proto.stateChangeTimeEpochMs)
+    )
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeInt(userActivityState.id)
-        dest.writeInt(exerciseType?.id ?: -1)
-        dest.writeLong(stateChangeTime.toEpochMilli())
+    /** @hide */
+    override val proto: UserActivityInfoProto by lazy {
+        val builder =
+            UserActivityInfoProto.newBuilder()
+                .setState(userActivityState.toProto())
+                .setStateChangeTimeEpochMs(stateChangeTime.toEpochMilli())
+
+        exerciseInfo?.let { builder.exerciseInfo = it.proto }
+        builder.build()
     }
 
+    override fun toString(): String =
+        "UserActivityInfo(" +
+            "userActivityState=$userActivityState, " +
+            "stateChangeTime=$stateChangeTime, " +
+            "exerciseInfo=$exerciseInfo)"
+
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<UserActivityInfo> =
-            object : Parcelable.Creator<UserActivityInfo> {
-                override fun createFromParcel(source: Parcel): UserActivityInfo? {
-                    val activityState = UserActivityState.fromId(source.readInt()) ?: return null
-                    val exerciseTypeId = source.readInt()
-                    val exerciseType =
-                        if (exerciseTypeId == -1) null else ExerciseType.fromId(exerciseTypeId)
-                    val time = Instant.ofEpochMilli(source.readLong())
-
-                    return UserActivityInfo(activityState, exerciseType, time)
-                }
-
-                override fun newArray(size: Int): Array<UserActivityInfo?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<UserActivityInfo> = newCreator { bytes ->
+            val proto = UserActivityInfoProto.parseFrom(bytes)
+            UserActivityInfo(proto)
+        }
 
         /** Creates a [UserActivityInfo] for [USER_ACTIVITY_UNKNOWN]. */
         @JvmStatic
         public fun createUnknownTypeState(stateChangeTime: Instant): UserActivityInfo =
-            UserActivityInfo(USER_ACTIVITY_UNKNOWN, exerciseType = null, stateChangeTime)
+            UserActivityInfo(USER_ACTIVITY_UNKNOWN, exerciseInfo = null, stateChangeTime)
 
         /** Creates a [UserActivityInfo] for [USER_ACTIVITY_EXERCISE]. */
         @JvmStatic
         public fun createActiveExerciseState(
-            exerciseType: ExerciseType,
+            exerciseInfo: ExerciseInfo,
             stateChangeTime: Instant
         ): UserActivityInfo =
-            UserActivityInfo(USER_ACTIVITY_EXERCISE, exerciseType, stateChangeTime)
+            UserActivityInfo(USER_ACTIVITY_EXERCISE, exerciseInfo, stateChangeTime)
 
         /** Creates a [UserActivityInfo] for [USER_ACTIVITY_PASSIVE]. */
         @JvmStatic
         public fun createPassiveActivityState(stateChangeTime: Instant): UserActivityInfo =
-            UserActivityInfo(USER_ACTIVITY_PASSIVE, exerciseType = null, stateChangeTime)
-
-        /** Creates a [UserActivityInfo] for [USER_ACTIVITY_INACTIVE]. */
-        @JvmStatic
-        public fun createInactiveState(stateChangeTime: Instant): UserActivityInfo =
-            UserActivityInfo(USER_ACTIVITY_INACTIVE, exerciseType = null, stateChangeTime)
+            UserActivityInfo(USER_ACTIVITY_PASSIVE, exerciseInfo = null, stateChangeTime)
 
         /** Creates a [UserActivityInfo] for [USER_ACTIVITY_ASLEEP]. */
         @JvmStatic
         public fun createAsleepState(stateChangeTime: Instant): UserActivityInfo =
-            UserActivityInfo(USER_ACTIVITY_ASLEEP, exerciseType = null, stateChangeTime)
+            UserActivityInfo(USER_ACTIVITY_ASLEEP, exerciseInfo = null, stateChangeTime)
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityState.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityState.kt
index 82476c4..bf13850 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityState.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/UserActivityState.kt
@@ -16,16 +16,25 @@
 
 package androidx.health.services.client.data
 
+import androidx.health.services.client.proto.DataProto.UserActivityState as UserActivityStateProto
+
 /** Types of user activity states. */
 public enum class UserActivityState(public val id: Int) {
     USER_ACTIVITY_UNKNOWN(0),
     USER_ACTIVITY_EXERCISE(1),
     USER_ACTIVITY_PASSIVE(2),
-    USER_ACTIVITY_INACTIVE(3),
-    USER_ACTIVITY_ASLEEP(4);
+    USER_ACTIVITY_ASLEEP(3);
+
+    /** @hide */
+    public fun toProto(): UserActivityStateProto =
+        UserActivityStateProto.forNumber(id) ?: UserActivityStateProto.USER_ACTIVITY_STATE_UNKNOWN
 
     public companion object {
         @JvmStatic
         public fun fromId(id: Int): UserActivityState? = values().firstOrNull { it.id == id }
+
+        /** @hide */
+        public fun fromProto(proto: UserActivityStateProto): UserActivityState =
+            fromId(proto.number) ?: USER_ACTIVITY_UNKNOWN
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/Value.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/Value.kt
index 5ae780d..0458097 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/Value.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/Value.kt
@@ -16,18 +16,40 @@
 
 package androidx.health.services.client.data
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
 
 /** A [Parcelable] wrapper that can hold a value of a specified type. */
-@Suppress("DataClassPrivateConstructor")
-public data class Value
-private constructor(
-    // TODO(b/175054913): Investigate using a AutoOneOf instead.
-    val format: Int,
-    val doubleList: List<Double>,
-    val longValue: Long,
-) : Parcelable {
+@Suppress("DataClassPrivateConstructor", "ParcelCreator")
+public class Value internal constructor(proto: DataProto.Value) :
+    ProtoParcelable<DataProto.Value>() {
+
+    /** @hide */
+    override val proto: DataProto.Value by lazy { proto }
+
+    public val format: Int =
+        when (proto.valueCase) {
+            DataProto.Value.ValueCase.BOOL_VAL -> FORMAT_BOOLEAN
+            DataProto.Value.ValueCase.DOUBLE_VAL -> FORMAT_DOUBLE
+            DataProto.Value.ValueCase.LONG_VAL -> FORMAT_LONG
+            DataProto.Value.ValueCase.DOUBLE_ARRAY_VAL -> FORMAT_DOUBLE_ARRAY
+            else -> throw IllegalStateException("Unexpected format: ${proto.valueCase}")
+        }
+
+    /**
+     * Returns this [Value] as a `String`.
+     *
+     * @throws IllegalStateException if [format] is unknown
+     */
+    override fun toString(): String =
+        "Value(format=$format, " +
+            when (format) {
+                FORMAT_BOOLEAN -> "boolVal=${proto.boolVal})"
+                FORMAT_LONG -> "longVal=${proto.longVal})"
+                FORMAT_DOUBLE -> "doubleVal=${proto.doubleVal})"
+                FORMAT_DOUBLE_ARRAY -> "doubleArrayVal=${proto.doubleArrayVal.doubleArrayList})"
+                else -> throw IllegalStateException("Unexpected format: ${proto.valueCase}")
+            }
 
     /**
      * Returns this [Value] represented as an `long`.
@@ -36,7 +58,7 @@
      */
     public fun asLong(): Long {
         check(isLong) { "Attempted to read value as long, but value is not of type long" }
-        return longValue
+        return proto.longVal
     }
 
     /**
@@ -46,7 +68,7 @@
      */
     public fun asBoolean(): Boolean {
         check(isBoolean) { "Attempted to read value as boolean, but value is not of type boolean" }
-        return longValue != 0L
+        return proto.boolVal
     }
 
     /**
@@ -56,7 +78,7 @@
      */
     public fun asDouble(): Double {
         check(isDouble) { "Attempted to read value as double, but value is not of type double" }
-        return doubleList[0]
+        return proto.doubleVal
     }
 
     /**
@@ -68,7 +90,7 @@
         check(isDoubleArray) {
             "Attempted to read value as double array, but value is not correct type"
         }
-        return doubleList.toDoubleArray()
+        return proto.doubleArrayVal.doubleArrayList.toDoubleArray()
     }
 
     /** Whether or not this [Value] can be represented as an `long`. */
@@ -87,38 +109,6 @@
     public val isDoubleArray: Boolean
         get() = format == FORMAT_DOUBLE_ARRAY
 
-    override fun describeContents(): Int {
-        return 0
-    }
-
-    /**
-     * Writes the value of this object to [dest].
-     *
-     * @throws IllegalStateException if [format] is invalid
-     */
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        val format = format
-        dest.writeInt(format)
-        when (format) {
-            FORMAT_BOOLEAN, FORMAT_LONG -> {
-                dest.writeLong(longValue)
-                return
-            }
-            FORMAT_DOUBLE -> {
-                dest.writeDouble(asDouble())
-                return
-            }
-            FORMAT_DOUBLE_ARRAY -> {
-                val doubleArray = asDoubleArray()
-                dest.writeInt(doubleArray.size)
-                dest.writeDoubleArray(doubleArray)
-                return
-            }
-            else -> {}
-        }
-        throw IllegalStateException(String.format("Unexpected format: %s", format))
-    }
-
     public companion object {
         /** The format used for a [Value] represented as a `double`. */
         public const val FORMAT_DOUBLE: Int = 1
@@ -133,53 +123,36 @@
         public const val FORMAT_DOUBLE_ARRAY: Int = 3
 
         @JvmField
-        public val CREATOR: Parcelable.Creator<Value> =
-            object : Parcelable.Creator<Value> {
-                override fun createFromParcel(parcel: Parcel): Value {
-                    val format = parcel.readInt()
-                    when (format) {
-                        FORMAT_BOOLEAN, FORMAT_LONG ->
-                            return Value(format, listOf(), parcel.readLong())
-                        FORMAT_DOUBLE ->
-                            return Value(format, listOf(parcel.readDouble()), /* longValue= */ 0)
-                        FORMAT_DOUBLE_ARRAY -> {
-                            val doubleArray = DoubleArray(parcel.readInt())
-                            parcel.readDoubleArray(doubleArray)
-                            return Value(format, doubleArray.toList(), /* longValue= */ 0)
-                        }
-                        else -> {}
-                    }
-                    throw IllegalStateException(String.format("Unexpected format: %s", format))
-                }
-
-                override fun newArray(size: Int): Array<Value?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<Value> = newCreator {
+            Value(DataProto.Value.parseFrom(it))
+        }
 
         /** Creates a [Value] that represents a `long`. */
         @JvmStatic
-        public fun ofLong(value: Long): Value {
-            return Value(FORMAT_LONG, listOf(), value)
-        }
+        public fun ofLong(value: Long): Value =
+            Value(DataProto.Value.newBuilder().setLongVal(value).build())
 
         /** Creates a [Value] that represents an `boolean`. */
         @JvmStatic
-        public fun ofBoolean(value: Boolean): Value {
-            return Value(FORMAT_BOOLEAN, listOf(), if (value) 1 else 0)
-        }
+        public fun ofBoolean(value: Boolean): Value =
+            Value(DataProto.Value.newBuilder().setBoolVal(value).build())
 
         /** Creates a [Value] that represents a `double`. */
         @JvmStatic
-        public fun ofDouble(value: Double): Value {
-            return Value(FORMAT_DOUBLE, listOf(value), longValue = 0)
-        }
+        public fun ofDouble(value: Double): Value =
+            Value(DataProto.Value.newBuilder().setDoubleVal(value).build())
 
         /** Creates a [Value] that represents a `double[]`. */
         @JvmStatic
-        public fun ofDoubleArray(vararg doubleArray: Double): Value {
-            return Value(FORMAT_DOUBLE_ARRAY, doubleArray.toList(), longValue = 0)
-        }
+        public fun ofDoubleArray(vararg doubleArray: Double): Value =
+            Value(
+                DataProto.Value.newBuilder()
+                    .setDoubleArrayVal(
+                        DataProto.Value.DoubleArray.newBuilder()
+                            .addAllDoubleArray(doubleArray.toList())
+                    )
+                    .build()
+            )
 
         /**
          * Compares two [Value] s based on their representation.
@@ -187,14 +160,15 @@
          * @throws IllegalStateException if `first` and `second` do not share the same format or are
          * represented as a `double[]`
          */
-        internal fun compare(first: Value, second: Value): Int {
+        @JvmStatic
+        public fun compare(first: Value, second: Value): Int {
             check(first.format == second.format) {
                 "Attempted to compare Values with different formats"
             }
             when (first.format) {
-                FORMAT_LONG -> return first.longValue.compareTo(second.longValue)
+                FORMAT_LONG -> return first.asLong().compareTo(second.asLong())
                 FORMAT_BOOLEAN -> return first.asBoolean().compareTo(second.asBoolean())
-                FORMAT_DOUBLE -> return first.doubleList[0].compareTo(second.doubleList[0])
+                FORMAT_DOUBLE -> return first.asDouble().compareTo(second.asDouble())
                 FORMAT_DOUBLE_ARRAY ->
                     throw IllegalStateException(
                         "Attempted to compare Values with invalid format (double array)"
@@ -207,28 +181,91 @@
         /**
          * Adds two [Value] s based on their representation.
          *
-         * @throws IllegalStateException if `first` and `second` do not share the same format or are
-         * represented as a `double[]` or `boolean`
+         * @throws IllegalArgumentException if `first` and `second` do not share the same format or
+         * are represented as a `double[]` or `boolean`
          */
         @JvmStatic
         public fun sum(first: Value, second: Value): Value {
             require(first.format == second.format) {
                 "Attempted to add Values with different formats"
             }
-            when (first.format) {
-                FORMAT_LONG -> return ofLong(first.asLong() + second.asLong())
-                FORMAT_DOUBLE -> return ofDouble(first.asDouble() + second.asDouble())
+            return when (first.format) {
+                FORMAT_LONG -> ofLong(first.asLong() + second.asLong())
+                FORMAT_DOUBLE -> ofDouble(first.asDouble() + second.asDouble())
                 FORMAT_BOOLEAN ->
-                    throw IllegalStateException(
+                    throw IllegalArgumentException(
                         "Attempted to add Values with invalid format (boolean)"
                     )
                 FORMAT_DOUBLE_ARRAY ->
-                    throw IllegalStateException(
+                    throw IllegalArgumentException(
                         "Attempted to add Values with invalid format (double array)"
                     )
-                else -> {}
+                else -> throw IllegalArgumentException("Unexpected format: ${first.format}")
             }
-            throw IllegalStateException(String.format("Unexpected format: %s", first.format))
+        }
+
+        /**
+         * Subtracts two [Value] s based on their representation (i.e. returns `first` - `second`).
+         *
+         * @throws IllegalArgumentException if `first` and `second` do not share the same format or
+         * are represented as a `double[]` or `boolean`
+         *
+         * @hide
+         */
+        @JvmStatic
+        public fun difference(first: Value, second: Value): Value {
+            require(first.format == second.format) {
+                "Attempted to subtract Values with different formats"
+            }
+            require(first.format == FORMAT_LONG || first.format == FORMAT_DOUBLE) {
+                "Provided values are not supported for difference"
+            }
+            return when (first.format) {
+                FORMAT_LONG -> ofLong(first.asLong() - second.asLong())
+                FORMAT_DOUBLE -> ofDouble(first.asDouble() - second.asDouble())
+                else -> throw IllegalArgumentException("Unexpected format: ${first.format}")
+            }
+        }
+
+        /**
+         * Gets the modulo of two [Value] s based on their representation. (i.e. returns `first` %
+         * `second`)
+         *
+         * @throws IllegalArgumentException if `first` and `second` do not share the same format or
+         * are represented as a `double[]` or `boolean`
+         *
+         * @hide
+         */
+        @JvmStatic
+        public fun modulo(first: Value, second: Value): Value {
+            require(first.format == second.format) {
+                "Attempted to modulo Values with different formats"
+            }
+            require(first.format == FORMAT_LONG || first.format == FORMAT_DOUBLE) {
+                "Provided values are not supported for modulo"
+            }
+
+            return when (first.format) {
+                FORMAT_LONG -> ofLong(first.asLong() % second.asLong())
+                FORMAT_DOUBLE -> ofDouble(first.asDouble() % second.asDouble())
+                else -> throw IllegalArgumentException("Unexpected format: ${first.format}")
+            }
+        }
+
+        /**
+         * Checks if a given [Value] is zero or not.
+         *
+         * @throws IllegalArgumentException if `value` is a `double[]` or `bolean`
+         *
+         * @hide
+         */
+        @JvmStatic
+        public fun isZero(value: Value): Boolean {
+            return when (value.format) {
+                FORMAT_LONG -> value.asLong() == 0L
+                FORMAT_DOUBLE -> value.asDouble() == 0.0
+                else -> throw IllegalArgumentException("Unexpected format: ${value.format}")
+            }
         }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/WarmUpConfig.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/WarmUpConfig.kt
new file mode 100644
index 0000000..3faf143
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/data/WarmUpConfig.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.data
+
+import android.os.Parcelable
+import androidx.health.services.client.proto.DataProto
+
+/** Defines configuration for an exercise tracked using HealthServices. */
+@Suppress("DataClassPrivateConstructor", "ParcelCreator")
+public class WarmUpConfig
+protected constructor(
+    /**
+     * [ExerciseType] the user is performing for this exercise.
+     *
+     * This information can be used to tune sensors, e.g. the calories estimate can take the MET
+     * value into account.
+     */
+    public val exerciseType: ExerciseType,
+    public val dataTypes: Set<DataType>,
+) : ProtoParcelable<DataProto.WarmUpConfig>() {
+
+    internal constructor(
+        proto: DataProto.WarmUpConfig
+    ) : this(
+        ExerciseType.fromProto(proto.exerciseType),
+        proto.dataTypesList.map { DataType(it) }.toSet(),
+    )
+
+    init {
+        require(dataTypes.isNotEmpty()) { "Must specify the desired data types." }
+    }
+
+    /** Builder for [WarmUpConfig] instances. */
+    public class Builder {
+        private var exerciseType: ExerciseType? = null
+        private var dataTypes: Set<DataType>? = null
+
+        /**
+         * Sets the active [ExerciseType] the user is performing for this exercise.
+         *
+         * Provide this parameter when tracking a workout to provide more accurate data. This
+         * information can be used to tune sensors, e.g. the calories estimate can take the MET
+         * value into account.
+         */
+        public fun setExerciseType(exerciseType: ExerciseType): Builder {
+            require(exerciseType != ExerciseType.UNKNOWN) { "Must specify a valid exercise type." }
+            this.exerciseType = exerciseType
+            return this
+        }
+
+        /**
+         * Sets the requested [DataType]s that should be tracked during this exercise. If not
+         * explicitly called, a default set of [DataType] will be chosen based on the [ExerciseType]
+         * .
+         */
+        public fun setDataTypes(dataTypes: Set<DataType>): Builder {
+            this.dataTypes = dataTypes.toSet()
+            return this
+        }
+
+        /** Returns the built `WarmUpConfig`. */
+        public fun build(): WarmUpConfig {
+            return WarmUpConfig(
+                checkNotNull(exerciseType) { "No exercise type specified" },
+                checkNotNull(dataTypes) { "No data types specified" },
+            )
+        }
+    }
+
+    /** @hide */
+    override val proto: DataProto.WarmUpConfig by lazy {
+        DataProto.WarmUpConfig.newBuilder()
+            .setExerciseType(exerciseType.toProto())
+            .addAllDataTypes(dataTypes.map { it.proto })
+            .build()
+    }
+
+    override fun toString(): String =
+        "WarmUpConfig(exerciseType=$exerciseType, dataTypes=$dataTypes)"
+
+    public companion object {
+        @JvmStatic public fun builder(): Builder = Builder()
+
+        @JvmField
+        public val CREATOR: Parcelable.Creator<WarmUpConfig> = newCreator { bytes ->
+            val proto = DataProto.WarmUpConfig.parseFrom(bytes)
+            WarmUpConfig(proto)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/data/event/Event.kt b/health/health-services-client/src/main/java/androidx/health/services/client/data/event/Event.kt
deleted file mode 100644
index 5e28beb..0000000
--- a/health/health-services-client/src/main/java/androidx/health/services/client/data/event/Event.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.data.event
-
-import android.os.Parcel
-import android.os.Parcelable
-import androidx.health.services.client.data.DataPoint
-import androidx.health.services.client.data.DataTypeCondition
-
-/** Defines an event that will be triggered when the specified condition is met. */
-public data class Event(
-    /** [DataTypeCondition] which must be met for the event to be triggered. */
-    val dataTypeCondition: DataTypeCondition,
-    val triggerType: TriggerType,
-) : Parcelable {
-
-    /** Whether or not repeated events should be triggered. */
-    public enum class TriggerType(public val id: Int) {
-        /** The event will trigger the first time the specified conditions are met. */
-        ONCE(1),
-
-        /** The event will trigger each time the specified conditions *become* met. */
-        REPEATED(2);
-
-        public companion object {
-            @JvmStatic
-            public fun fromId(id: Int): TriggerType? = values().firstOrNull { it.id == id }
-        }
-    }
-
-    /**
-     * Does the provided [DataPoint] satisfy the event condition.
-     *
-     * @throws IllegalArgumentException if the provided data point is not of the same data type as
-     * the condition itself.
-     */
-    public fun isTriggered(dataPoint: DataPoint): Boolean {
-        return dataTypeCondition.isSatisfied(dataPoint)
-    }
-
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(dataTypeCondition, flags)
-        dest.writeInt(triggerType.id)
-    }
-
-    public companion object {
-        @JvmField
-        public val CREATOR: Parcelable.Creator<Event> =
-            object : Parcelable.Creator<Event> {
-                override fun createFromParcel(source: Parcel): Event? {
-                    return Event(
-                        source.readParcelable(DataTypeCondition::class.java.classLoader)
-                            ?: return null,
-                        TriggerType.fromId(source.readInt()) ?: return null
-                    )
-                }
-
-                override fun newArray(size: Int): Array<Event?> {
-                    return arrayOfNulls(size)
-                }
-            }
-    }
-}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseIpcClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseIpcClient.kt
deleted file mode 100644
index 39bb014..0000000
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseIpcClient.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.impl
-
-import android.os.IBinder
-import androidx.health.services.client.impl.ipc.Client
-import androidx.health.services.client.impl.ipc.Client.VersionGetter
-import androidx.health.services.client.impl.ipc.ClientConfiguration
-import androidx.health.services.client.impl.ipc.ServiceOperation
-import androidx.health.services.client.impl.ipc.internal.ConnectionManager
-import androidx.health.services.client.impl.ipc.internal.ListenerKey
-import com.google.common.util.concurrent.ListenableFuture
-
-/**
- * An IPC Client that connects to and communicates with Health Services to make Exercise API calls.
- *
- * @hide
- */
-public class ExerciseIpcClient internal constructor(connectionManager: ConnectionManager) :
-    Client(
-        CLIENT_CONFIGURATION,
-        connectionManager,
-        VersionGetter { binder: IBinder -> getServiceInterface(binder).apiVersion }
-    ) {
-
-    public override fun <T> execute(operation: ServiceOperation<T>): ListenableFuture<T> {
-        return super.execute(operation)
-    }
-
-    public override fun <T> registerListener(
-        listenerKey: ListenerKey,
-        registerListenerOperation: ServiceOperation<T>
-    ): ListenableFuture<T> {
-        return super.registerListener(listenerKey, registerListenerOperation)
-    }
-
-    public override fun <T> unregisterListener(
-        listenerKey: ListenerKey,
-        unregisterListenerOperation: ServiceOperation<T>
-    ): ListenableFuture<T> {
-        return super.unregisterListener(listenerKey, unregisterListenerOperation)
-    }
-
-    public companion object {
-        public const val SERVICE_BIND_ACTION: String =
-            "com.google.android.wearable.healthservices.ExerciseClient"
-        private const val CLIENT = "HealthServicesExerciseClient"
-        private const val SERVICE_PACKAGE_NAME = "com.google.android.wearable.healthservices"
-        private val CLIENT_CONFIGURATION =
-            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, SERVICE_BIND_ACTION)
-
-        @JvmStatic
-        internal fun getServiceInterface(binder: IBinder): IExerciseApiService {
-            return IExerciseApiService.Stub.asInterface(binder)
-        }
-    }
-}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt
index d48bee2..4be8edd 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ExerciseUpdateListenerStub.kt
@@ -16,11 +16,17 @@
 
 package androidx.health.services.client.impl
 
+import android.util.Log
 import androidx.annotation.GuardedBy
 import androidx.health.services.client.ExerciseUpdateListener
+import androidx.health.services.client.data.Availability
+import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.ExerciseLapSummary
+import androidx.health.services.client.data.ExerciseUpdate
+import androidx.health.services.client.impl.event.ExerciseUpdateListenerEvent
 import androidx.health.services.client.impl.ipc.internal.ListenerKey
-import androidx.health.services.client.impl.response.ExerciseLapSummaryResponse
-import androidx.health.services.client.impl.response.ExerciseUpdateResponse
+import androidx.health.services.client.proto.EventsProto
+import androidx.health.services.client.proto.EventsProto.ExerciseUpdateListenerEvent.EventCase
 import java.util.HashMap
 import java.util.concurrent.Executor
 
@@ -35,12 +41,25 @@
 
     public val listenerKey: ListenerKey = ListenerKey(listener)
 
-    override fun onExerciseUpdate(response: ExerciseUpdateResponse) {
-        executor.execute { listener.onExerciseUpdate(response.exerciseUpdate) }
+    override fun onExerciseUpdateListenerEvent(event: ExerciseUpdateListenerEvent) {
+        executor.execute { triggerListener(event.proto) }
     }
 
-    override fun onLapSummary(response: ExerciseLapSummaryResponse) {
-        executor.execute { listener.onLapSummary(response.exerciseLapSummary) }
+    private fun triggerListener(proto: EventsProto.ExerciseUpdateListenerEvent) {
+        when (proto.eventCase) {
+            EventCase.EXERCISE_UPDATE_RESPONSE ->
+                listener.onExerciseUpdate(
+                    ExerciseUpdate(proto.exerciseUpdateResponse.exerciseUpdate)
+                )
+            EventCase.LAP_SUMMARY_RESPONSE ->
+                listener.onLapSummary(ExerciseLapSummary(proto.lapSummaryResponse.lapSummary))
+            EventCase.AVAILABILITY_RESPONSE ->
+                listener.onAvailabilityChanged(
+                    DataType(proto.availabilityResponse.dataType),
+                    Availability.fromProto(proto.availabilityResponse.availability)
+                )
+            null, EventCase.EVENT_NOT_SET -> Log.w(TAG, "Received unknown event ${proto.eventCase}")
+        }
     }
 
     /**
@@ -72,4 +91,8 @@
             public val INSTANCE: ExerciseUpdateListenerCache = ExerciseUpdateListenerCache()
         }
     }
+
+    private companion object {
+        val TAG = "ExerciseUpdateListener"
+    }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/HealthServicesIpcClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/HealthServicesIpcClient.kt
deleted file mode 100644
index 20613eb..0000000
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/HealthServicesIpcClient.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.impl
-
-import android.os.IBinder
-import androidx.health.services.client.impl.ipc.Client
-import androidx.health.services.client.impl.ipc.Client.VersionGetter
-import androidx.health.services.client.impl.ipc.ClientConfiguration
-import androidx.health.services.client.impl.ipc.ServiceOperation
-import androidx.health.services.client.impl.ipc.internal.ConnectionManager
-import androidx.health.services.client.impl.ipc.internal.ListenerKey
-import com.google.common.util.concurrent.ListenableFuture
-
-/**
- * An IPC Client that connects to and communicates with Health Services.
- *
- * @hide
- */
-public class HealthServicesIpcClient internal constructor(connectionManager: ConnectionManager) :
-    Client(
-        CLIENT_CONFIGURATION,
-        connectionManager,
-        VersionGetter { binder -> getServiceInterface(binder).apiVersion }
-    ) {
-
-    public override fun <T> execute(operation: ServiceOperation<T>): ListenableFuture<T> {
-        return super.execute(operation)
-    }
-
-    public override fun <T> registerListener(
-        listenerKey: ListenerKey,
-        registerListenerOperation: ServiceOperation<T>
-    ): ListenableFuture<T> {
-        return super.registerListener(listenerKey, registerListenerOperation)
-    }
-
-    public override fun <T> unregisterListener(
-        listenerKey: ListenerKey,
-        unregisterListenerOperation: ServiceOperation<T>
-    ): ListenableFuture<T> {
-        return super.unregisterListener(listenerKey, unregisterListenerOperation)
-    }
-
-    public companion object {
-        private const val CLIENT = "HealthServicesClient"
-        private const val SERVICE_PACKAGE_NAME = "com.google.android.wearable.healthservices"
-        public const val SERVICE_BIND_ACTION: String =
-            "com.google.android.wearable.healthservices.HealthServicesClient"
-        private val CLIENT_CONFIGURATION =
-            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, SERVICE_BIND_ACTION)
-
-        @JvmStatic
-        internal fun getServiceInterface(binder: IBinder): IHealthServicesApiService {
-            return IHealthServicesApiService.Stub.asInterface(binder)
-        }
-    }
-}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/IpcConstants.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/IpcConstants.kt
new file mode 100644
index 0000000..38d1588
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/IpcConstants.kt
@@ -0,0 +1,15 @@
+package androidx.health.services.client.impl
+
+/**
+ * Collection of constants used for IPC.
+ *
+ * @hide
+ */
+public object IpcConstants {
+    public const val SERVICE_PACKAGE_NAME: String = "com.google.android.wearable.healthservices"
+
+    public const val EXERCISE_API_BIND_ACTION: String = "hs.exerciseclient.BIND"
+    public const val HEALTH_SERVICES_BIND_ACTION: String = "hs.healthservicesclient.BIND"
+    public const val MEASURE_API_BIND_ACTION: String = "hs.measureclient.BIND"
+    public const val PASSIVE_API_BIND_ACTION: String = "hs.passiveclient.BIND"
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt
index 476c6f6..35cdb14 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureCallbackStub.kt
@@ -16,13 +16,17 @@
 
 package androidx.health.services.client.impl
 
+import android.util.Log
 import androidx.annotation.GuardedBy
 import androidx.annotation.VisibleForTesting
 import androidx.health.services.client.MeasureCallback
+import androidx.health.services.client.data.Availability
 import androidx.health.services.client.data.DataType
+import androidx.health.services.client.impl.event.MeasureCallbackEvent
 import androidx.health.services.client.impl.ipc.internal.ListenerKey
-import androidx.health.services.client.impl.response.AvailabilityResponse
 import androidx.health.services.client.impl.response.DataPointsResponse
+import androidx.health.services.client.proto.EventsProto
+import androidx.health.services.client.proto.EventsProto.MeasureCallbackEvent.EventCase
 import com.google.common.util.concurrent.MoreExecutors
 import java.util.HashMap
 import java.util.concurrent.Executor
@@ -42,14 +46,23 @@
     public var executor: Executor = MoreExecutors.directExecutor()
         private set
 
-    override fun onAvailabilityChanged(response: AvailabilityResponse) {
-        executor.execute {
-            callback.onAvailabilityChanged(response.dataType, response.availability)
-        }
+    override fun onMeasureCallbackEvent(event: MeasureCallbackEvent) {
+        executor.execute { triggerListener(event.proto) }
     }
 
-    override fun onData(response: DataPointsResponse) {
-        executor.execute { callback.onData(response.dataPoints) }
+    private fun triggerListener(proto: EventsProto.MeasureCallbackEvent) {
+        when (proto.eventCase) {
+            EventCase.DATA_POINT_RESPONSE -> {
+                val dataPointsResponse = DataPointsResponse(proto.dataPointResponse)
+                callback.onData(dataPointsResponse.dataPoints)
+            }
+            EventCase.AVAILABILITY_RESPONSE ->
+                callback.onAvailabilityChanged(
+                    DataType(proto.availabilityResponse.dataType),
+                    Availability.fromProto(proto.availabilityResponse.availability)
+                )
+            null, EventCase.EVENT_NOT_SET -> Log.w(TAG, "Received unknown event ${proto.eventCase}")
+        }
     }
 
     /**
@@ -101,4 +114,8 @@
         private val dataType: DataType,
         private val measureCallback: MeasureCallback
     )
+
+    private companion object {
+        const val TAG = "MeasureCallbackStub"
+    }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureIpcClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureIpcClient.kt
deleted file mode 100644
index 05014e1..0000000
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/MeasureIpcClient.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.impl
-
-import android.os.IBinder
-import androidx.health.services.client.impl.ipc.Client
-import androidx.health.services.client.impl.ipc.Client.VersionGetter
-import androidx.health.services.client.impl.ipc.ClientConfiguration
-import androidx.health.services.client.impl.ipc.ServiceOperation
-import androidx.health.services.client.impl.ipc.internal.ConnectionManager
-import androidx.health.services.client.impl.ipc.internal.ListenerKey
-import com.google.common.util.concurrent.ListenableFuture
-
-/**
- * An IPC Client that connects to and communicates with Health Services to make Measure API calls.
- *
- * @hide
- */
-public class MeasureIpcClient internal constructor(connectionManager: ConnectionManager) :
-    Client(
-        CLIENT_CONFIGURATION,
-        connectionManager,
-        VersionGetter { binder -> getServiceInterface(binder).apiVersion }
-    ) {
-
-    public override fun <T> execute(operation: ServiceOperation<T>): ListenableFuture<T> {
-        return super.execute(operation)
-    }
-
-    public override fun <T> registerListener(
-        listenerKey: ListenerKey,
-        registerListenerOperation: ServiceOperation<T>
-    ): ListenableFuture<T> {
-        return super.registerListener(listenerKey, registerListenerOperation)
-    }
-
-    public override fun <T> unregisterListener(
-        listenerKey: ListenerKey,
-        unregisterListenerOperation: ServiceOperation<T>
-    ): ListenableFuture<T> {
-        return super.unregisterListener(listenerKey, unregisterListenerOperation)
-    }
-
-    public companion object {
-        public const val SERVICE_BIND_ACTION: String =
-            "com.google.android.wearable.healthservices.MeasureClient"
-        public const val CLIENT: String = "HealthServicesMeasureClient"
-        public const val SERVICE_PACKAGE_NAME: String = "com.google.android.wearable.healthservices"
-        private val CLIENT_CONFIGURATION =
-            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, SERVICE_BIND_ACTION)
-
-        @JvmStatic
-        internal fun getServiceInterface(binder: IBinder): IMeasureApiService {
-            return IMeasureApiService.Stub.asInterface(binder)
-        }
-    }
-}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringCallbackStub.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringCallbackStub.kt
index a30a5d7..b89f985 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringCallbackStub.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringCallbackStub.kt
@@ -16,8 +16,12 @@
 
 package androidx.health.services.client.impl
 
+import android.util.Log
 import androidx.health.services.client.PassiveMonitoringCallback
+import androidx.health.services.client.impl.event.PassiveCallbackEvent
 import androidx.health.services.client.impl.response.PassiveMonitoringUpdateResponse
+import androidx.health.services.client.proto.EventsProto.PassiveCallbackEvent.EventCase.EVENT_NOT_SET
+import androidx.health.services.client.proto.EventsProto.PassiveCallbackEvent.EventCase.PASSIVE_UPDATE_RESPONSE
 
 /**
  * A stub implementation for IPassiveMonitoringCallback.
@@ -28,7 +32,19 @@
 internal constructor(private val callback: PassiveMonitoringCallback) :
     IPassiveMonitoringCallback.Stub() {
 
-    override fun onPassiveMonitoringUpdate(response: PassiveMonitoringUpdateResponse) {
-        callback.onPassiveMonitoringUpdate(response.passiveMonitoringUpdate)
+    override fun onPassiveCallbackEvent(event: PassiveCallbackEvent) {
+        val proto = event.proto
+
+        when (proto.eventCase) {
+            PASSIVE_UPDATE_RESPONSE -> {
+                val response = PassiveMonitoringUpdateResponse(proto.passiveUpdateResponse)
+                callback.onPassiveMonitoringUpdate(response.passiveMonitoringUpdate)
+            }
+            null, EVENT_NOT_SET -> Log.w(TAG, "Received unknown event ${proto.eventCase}")
+        }
+    }
+
+    private companion object {
+        const val TAG = "PassiveCallbackStub"
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringIpcClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringIpcClient.kt
deleted file mode 100644
index 055d27b..0000000
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/PassiveMonitoringIpcClient.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.impl
-
-import android.os.IBinder
-import androidx.health.services.client.impl.ipc.Client
-import androidx.health.services.client.impl.ipc.Client.VersionGetter
-import androidx.health.services.client.impl.ipc.ClientConfiguration
-import androidx.health.services.client.impl.ipc.ServiceOperation
-import androidx.health.services.client.impl.ipc.internal.ConnectionManager
-import com.google.common.util.concurrent.ListenableFuture
-
-/**
- * An IPC Client that connects to and communicates with Health Services to make Passive Monitoring
- * API calls.
- *
- * @hide
- */
-public class PassiveMonitoringIpcClient(connectionManager: ConnectionManager) :
-    Client(
-        CLIENT_CONFIGURATION,
-        connectionManager,
-        VersionGetter { binder -> getServiceInterface(binder).apiVersion }
-    ) {
-
-    public override fun <T> execute(operation: ServiceOperation<T>): ListenableFuture<T> {
-        return super.execute(operation)
-    }
-
-    public companion object {
-        public const val SERVICE_BIND_ACTION: String =
-            "com.google.android.wearable.healthservices.PassiveMonitoringClient"
-        private const val CLIENT = "HealthServicesPassiveMonitoringClient"
-        private const val SERVICE_PACKAGE_NAME = "com.google.android.wearable.healthservices"
-        private val CLIENT_CONFIGURATION =
-            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, SERVICE_BIND_ACTION)
-
-        @JvmStatic
-        internal fun getServiceInterface(binder: IBinder): IPassiveMonitoringApiService {
-            return IPassiveMonitoringApiService.Stub.asInterface(binder)
-        }
-    }
-}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedExerciseClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedExerciseClient.kt
index b748723..9471af4 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedExerciseClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedExerciseClient.kt
@@ -24,17 +24,21 @@
 import androidx.health.services.client.data.ExerciseConfig
 import androidx.health.services.client.data.ExerciseGoal
 import androidx.health.services.client.data.ExerciseInfo
-import androidx.health.services.client.impl.ExerciseIpcClient.Companion.getServiceInterface
+import androidx.health.services.client.data.WarmUpConfig
+import androidx.health.services.client.impl.IpcConstants.EXERCISE_API_BIND_ACTION
+import androidx.health.services.client.impl.IpcConstants.SERVICE_PACKAGE_NAME
 import androidx.health.services.client.impl.internal.ExerciseInfoCallback
 import androidx.health.services.client.impl.internal.HsConnectionManager
 import androidx.health.services.client.impl.internal.StatusCallback
-import androidx.health.services.client.impl.ipc.ServiceOperation
+import androidx.health.services.client.impl.ipc.Client
+import androidx.health.services.client.impl.ipc.ClientConfiguration
 import androidx.health.services.client.impl.ipc.internal.ConnectionManager
 import androidx.health.services.client.impl.request.AutoPauseAndResumeConfigRequest
 import androidx.health.services.client.impl.request.CapabilitiesRequest
 import androidx.health.services.client.impl.request.ExerciseGoalRequest
+import androidx.health.services.client.impl.request.FlushRequest
+import androidx.health.services.client.impl.request.PrepareExerciseRequest
 import androidx.health.services.client.impl.request.StartExerciseRequest
-import androidx.health.services.client.impl.response.ExerciseCapabilitiesResponse
 import com.google.common.util.concurrent.Futures
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.Executor
@@ -46,74 +50,62 @@
  */
 internal class ServiceBackedExerciseClient
 private constructor(private val context: Context, connectionManager: ConnectionManager) :
-    ExerciseClient {
+    ExerciseClient,
+    Client<IExerciseApiService>(
+        CLIENT_CONFIGURATION,
+        connectionManager,
+        { binder -> IExerciseApiService.Stub.asInterface(binder) },
+        { service -> service.apiVersion }
+    ) {
 
-    private val ipcClient: ExerciseIpcClient = ExerciseIpcClient(connectionManager)
+    private val packageName = context.packageName
 
-    override fun startExercise(configuration: ExerciseConfig): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .startExercise(
-                        StartExerciseRequest(context.packageName, configuration),
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun prepareExercise(configuration: WarmUpConfig): ListenableFuture<Void> =
+        execute { service, resultFuture ->
+            service.prepareExercise(
+                PrepareExerciseRequest(packageName, configuration),
+                StatusCallback(resultFuture)
+            )
+        }
+
+    override fun startExercise(configuration: ExerciseConfig): ListenableFuture<Void> =
+        execute { service, resultFuture ->
+            service.startExercise(
+                StartExerciseRequest(packageName, configuration),
+                StatusCallback(resultFuture)
+            )
+        }
+
+    override fun pauseExercise(): ListenableFuture<Void> = execute { service, resultFuture ->
+        service.pauseExercise(packageName, StatusCallback(resultFuture))
     }
 
-    override fun pauseExercise(): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .pauseExercise(context.packageName, StatusCallback(resultFuture))
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun resumeExercise(): ListenableFuture<Void> = execute { service, resultFuture ->
+        service.resumeExercise(packageName, StatusCallback(resultFuture))
     }
 
-    override fun resumeExercise(): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .resumeExercise(context.packageName, StatusCallback(resultFuture))
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun endExercise(): ListenableFuture<Void> = execute { service, resultFuture ->
+        service.endExercise(packageName, StatusCallback(resultFuture))
     }
 
-    override fun endExercise(): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .endExercise(context.packageName, StatusCallback(resultFuture))
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun flushExercise(): ListenableFuture<Void> {
+        val request = FlushRequest(packageName)
+        return execute { service, resultFuture ->
+            service.flushExercise(request, StatusCallback(resultFuture))
+        }
     }
 
-    override fun markLap(): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .markLap(context.packageName, StatusCallback(resultFuture))
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun markLap(): ListenableFuture<Void> = execute { service, resultFuture ->
+        service.markLap(packageName, StatusCallback(resultFuture))
     }
 
     override val currentExerciseInfo: ListenableFuture<ExerciseInfo>
-        get() {
-            val serviceOperation =
-                ServiceOperation<ExerciseInfo> { binder, resultFuture ->
-                    getServiceInterface(binder)
-                        .getCurrentExerciseInfo(
-                            context.packageName,
-                            ExerciseInfoCallback(resultFuture)
-                        )
-                }
-            return ipcClient.execute(serviceOperation)
+        get() = execute { service, resultFuture ->
+            service.getCurrentExerciseInfo(packageName, ExerciseInfoCallback(resultFuture))
         }
 
-    override fun setUpdateListener(listener: ExerciseUpdateListener): ListenableFuture<Void> {
-        return setUpdateListener(listener, ContextCompat.getMainExecutor(context))
-    }
+    override fun setUpdateListener(listener: ExerciseUpdateListener): ListenableFuture<Void> =
+        setUpdateListener(listener, ContextCompat.getMainExecutor(context))
 
     override fun setUpdateListener(
         listener: ExerciseUpdateListener,
@@ -124,16 +116,9 @@
                 listener,
                 executor
             )
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .setUpdateListener(
-                        context.packageName,
-                        listenerStub,
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.registerListener(listenerStub.listenerKey, serviceOperation)
+        return registerListener(listenerStub.listenerKey) { service, resultFuture ->
+            service.setUpdateListener(packageName, listenerStub, StatusCallback(resultFuture))
+        }
     }
 
     override fun clearUpdateListener(listener: ExerciseUpdateListener): ListenableFuture<Void> {
@@ -142,59 +127,49 @@
                 ?: return Futures.immediateFailedFuture(
                     IllegalArgumentException("Given listener was not added.")
                 )
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .clearUpdateListener(
-                        context.packageName,
-                        listenerStub,
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.unregisterListener(listenerStub.listenerKey, serviceOperation)
+        return unregisterListener(listenerStub.listenerKey) { service, resultFuture ->
+            service.clearUpdateListener(packageName, listenerStub, StatusCallback(resultFuture))
+        }
     }
 
-    override fun addGoalToActiveExercise(exerciseGoal: ExerciseGoal): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .addGoalToActiveExercise(
-                        ExerciseGoalRequest(context.packageName, exerciseGoal),
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.execute(serviceOperation)
-    }
-
-    override fun overrideAutoPauseAndResumeForActiveExercise(
-        enabled: Boolean
-    ): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .overrideAutoPauseAndResumeForActiveExercise(
-                        AutoPauseAndResumeConfigRequest(context.packageName, enabled),
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.execute(serviceOperation)
-    }
-
-    override val capabilities: ListenableFuture<ExerciseCapabilities>
-        get() {
-            val request = CapabilitiesRequest(context.packageName)
-            val serviceOperation =
-                ServiceOperation<ExerciseCapabilitiesResponse> { binder, resultFuture ->
-                    resultFuture.set(getServiceInterface(binder).getCapabilities(request))
-                }
-            return Futures.transform(
-                ipcClient.execute(serviceOperation),
-                { response -> response?.exerciseCapabilities },
-                ContextCompat.getMainExecutor(context)
+    override fun addGoalToActiveExercise(exerciseGoal: ExerciseGoal): ListenableFuture<Void> =
+        execute { service, resultFuture ->
+            service.addGoalToActiveExercise(
+                ExerciseGoalRequest(packageName, exerciseGoal),
+                StatusCallback(resultFuture)
             )
         }
 
+    override fun removeGoalFromActiveExercise(exerciseGoal: ExerciseGoal): ListenableFuture<Void> =
+        execute { service, resultFuture ->
+            service.removeGoalFromActiveExercise(
+                ExerciseGoalRequest(packageName, exerciseGoal),
+                StatusCallback(resultFuture)
+            )
+        }
+
+    override fun overrideAutoPauseAndResumeForActiveExercise(
+        enabled: Boolean
+    ): ListenableFuture<Void> = execute { service, resultFuture ->
+        service.overrideAutoPauseAndResumeForActiveExercise(
+            AutoPauseAndResumeConfigRequest(packageName, enabled),
+            StatusCallback(resultFuture)
+        )
+    }
+
+    override val capabilities: ListenableFuture<ExerciseCapabilities>
+        get() =
+            Futures.transform(
+                execute { service -> service.getCapabilities(CapabilitiesRequest(packageName)) },
+                { response -> response?.exerciseCapabilities },
+                ContextCompat.getMainExecutor(context)
+            )
+
     internal companion object {
+        private const val CLIENT = "HealthServicesExerciseClient"
+        private val CLIENT_CONFIGURATION =
+            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, EXERCISE_API_BIND_ACTION)
+
         @JvmStatic
         fun getClient(context: Context): ServiceBackedExerciseClient {
             return ServiceBackedExerciseClient(context, HsConnectionManager.getInstance(context))
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedHealthServicesClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedHealthServicesClient.kt
index 0eee007..2ecb3ee 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedHealthServicesClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedHealthServicesClient.kt
@@ -21,22 +21,27 @@
 import androidx.health.services.client.HealthServicesClient
 import androidx.health.services.client.MeasureClient
 import androidx.health.services.client.PassiveMonitoringClient
+import androidx.health.services.client.impl.IpcConstants.HEALTH_SERVICES_BIND_ACTION
+import androidx.health.services.client.impl.IpcConstants.SERVICE_PACKAGE_NAME
 import androidx.health.services.client.impl.internal.HsConnectionManager
-import androidx.health.services.client.impl.ipc.internal.ConnectionManager
+import androidx.health.services.client.impl.ipc.Client
+import androidx.health.services.client.impl.ipc.ClientConfiguration
 
 /**
  * A [HealthServicesClient] implementation.
  *
  * @hide
  */
-public class ServiceBackedHealthServicesClient
-internal constructor(context: Context, connectionManager: ConnectionManager) :
-    HealthServicesClient {
+public class ServiceBackedHealthServicesClient public constructor(context: Context) :
+    HealthServicesClient,
+    Client<IHealthServicesApiService>(
+        CLIENT_CONFIGURATION,
+        HsConnectionManager.getInstance(context),
+        { binder -> IHealthServicesApiService.Stub.asInterface(binder) },
+        { service -> service.apiVersion }
+    ) {
 
-    private val applicationContext: Context = context.applicationContext
-    private val ipcClient: HealthServicesIpcClient = HealthServicesIpcClient(connectionManager)
-
-    public constructor(context: Context) : this(context, HsConnectionManager.getInstance(context))
+    private val applicationContext = context.applicationContext
 
     override val exerciseClient: ExerciseClient
         get() = ServiceBackedExerciseClient.getClient(applicationContext)
@@ -44,4 +49,10 @@
         get() = ServiceBackedPassiveMonitoringClient(applicationContext)
     override val measureClient: MeasureClient
         get() = ServiceBackedMeasureClient.getClient(applicationContext)
+
+    private companion object {
+        private const val CLIENT = "HealthServicesClient"
+        private val CLIENT_CONFIGURATION =
+            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, HEALTH_SERVICES_BIND_ACTION)
+    }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedMeasureClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedMeasureClient.kt
index ed71250..44a0ea6 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedMeasureClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedMeasureClient.kt
@@ -23,16 +23,17 @@
 import androidx.health.services.client.MeasureClient
 import androidx.health.services.client.data.DataType
 import androidx.health.services.client.data.MeasureCapabilities
+import androidx.health.services.client.impl.IpcConstants.MEASURE_API_BIND_ACTION
+import androidx.health.services.client.impl.IpcConstants.SERVICE_PACKAGE_NAME
 import androidx.health.services.client.impl.MeasureCallbackStub.MeasureCallbackCache
-import androidx.health.services.client.impl.MeasureIpcClient.Companion.getServiceInterface
 import androidx.health.services.client.impl.internal.HsConnectionManager
 import androidx.health.services.client.impl.internal.StatusCallback
-import androidx.health.services.client.impl.ipc.ServiceOperation
+import androidx.health.services.client.impl.ipc.Client
+import androidx.health.services.client.impl.ipc.ClientConfiguration
 import androidx.health.services.client.impl.ipc.internal.ConnectionManager
 import androidx.health.services.client.impl.request.CapabilitiesRequest
 import androidx.health.services.client.impl.request.MeasureRegistrationRequest
 import androidx.health.services.client.impl.request.MeasureUnregistrationRequest
-import androidx.health.services.client.impl.response.MeasureCapabilitiesResponse
 import com.google.common.util.concurrent.Futures
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.Executor
@@ -46,16 +47,20 @@
 public class ServiceBackedMeasureClient(
     private val context: Context,
     connectionManager: ConnectionManager
-) : MeasureClient {
-
-    private val ipcClient: MeasureIpcClient = MeasureIpcClient(connectionManager)
+) :
+    MeasureClient,
+    Client<IMeasureApiService>(
+        CLIENT_CONFIGURATION,
+        connectionManager,
+        { binder -> IMeasureApiService.Stub.asInterface(binder) },
+        { service -> service.apiVersion }
+    ) {
 
     override fun registerCallback(
         dataType: DataType,
         callback: MeasureCallback
-    ): ListenableFuture<Void> {
-        return registerCallback(dataType, callback, ContextCompat.getMainExecutor(context))
-    }
+    ): ListenableFuture<Void> =
+        registerCallback(dataType, callback, ContextCompat.getMainExecutor(context))
 
     override fun registerCallback(
         dataType: DataType,
@@ -64,12 +69,9 @@
     ): ListenableFuture<Void> {
         val request = MeasureRegistrationRequest(context.packageName, dataType)
         val callbackStub = MeasureCallbackCache.INSTANCE.getOrCreate(dataType, callback, executor)
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .registerCallback(request, callbackStub, StatusCallback(resultFuture))
-            }
-        return ipcClient.registerListener(callbackStub.listenerKey, serviceOperation)
+        return registerListener(callbackStub.listenerKey) { service, resultFuture ->
+            service.registerCallback(request, callbackStub, StatusCallback(resultFuture))
+        }
     }
 
     override fun unregisterCallback(
@@ -82,29 +84,26 @@
                     IllegalArgumentException("Given callback was not registered.")
                 )
         val request = MeasureUnregistrationRequest(context.packageName, dataType)
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .unregisterCallback(request, callbackStub, StatusCallback(resultFuture))
-            }
-        return ipcClient.unregisterListener(callbackStub.listenerKey, serviceOperation)
+        return unregisterListener(callbackStub.listenerKey) { service, resultFuture ->
+            service.unregisterCallback(request, callbackStub, StatusCallback(resultFuture))
+        }
     }
 
     override val capabilities: ListenableFuture<MeasureCapabilities>
-        get() {
-            val request = CapabilitiesRequest(context.packageName)
-            val serviceOperation =
-                ServiceOperation<MeasureCapabilitiesResponse> { binder, resultFuture ->
-                    resultFuture.set(getServiceInterface(binder).getCapabilities(request))
-                }
-            return Futures.transform(
-                ipcClient.execute(serviceOperation),
+        get() =
+            Futures.transform(
+                execute { service ->
+                    service.getCapabilities(CapabilitiesRequest(context.packageName))
+                },
                 { response -> response?.measureCapabilities },
                 ContextCompat.getMainExecutor(context)
             )
-        }
 
     internal companion object {
+        const val CLIENT = "HealthServicesMeasureClient"
+        private val CLIENT_CONFIGURATION =
+            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, MEASURE_API_BIND_ACTION)
+
         @JvmStatic
         fun getClient(context: Context): ServiceBackedMeasureClient {
             return ServiceBackedMeasureClient(context, HsConnectionManager.getInstance(context))
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
index f315dce..5f6b63b 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
@@ -16,22 +16,24 @@
 
 package androidx.health.services.client.impl
 
-import android.app.PendingIntent
+import android.content.ComponentName
 import android.content.Context
 import androidx.core.content.ContextCompat
 import androidx.health.services.client.PassiveMonitoringCallback
 import androidx.health.services.client.PassiveMonitoringClient
-import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.PassiveGoal
 import androidx.health.services.client.data.PassiveMonitoringCapabilities
-import androidx.health.services.client.data.event.Event
-import androidx.health.services.client.impl.PassiveMonitoringIpcClient.Companion.getServiceInterface
+import androidx.health.services.client.data.PassiveMonitoringConfig
+import androidx.health.services.client.impl.IpcConstants.PASSIVE_API_BIND_ACTION
+import androidx.health.services.client.impl.IpcConstants.SERVICE_PACKAGE_NAME
 import androidx.health.services.client.impl.internal.HsConnectionManager
 import androidx.health.services.client.impl.internal.StatusCallback
-import androidx.health.services.client.impl.ipc.ServiceOperation
+import androidx.health.services.client.impl.ipc.Client
+import androidx.health.services.client.impl.ipc.ClientConfiguration
 import androidx.health.services.client.impl.request.BackgroundRegistrationRequest
 import androidx.health.services.client.impl.request.CapabilitiesRequest
-import androidx.health.services.client.impl.request.EventRequest
-import androidx.health.services.client.impl.response.PassiveMonitoringCapabilitiesResponse
+import androidx.health.services.client.impl.request.FlushRequest
+import androidx.health.services.client.impl.request.PassiveGoalRequest
 import com.google.common.util.concurrent.Futures
 import com.google.common.util.concurrent.ListenableFuture
 
@@ -41,91 +43,81 @@
  * @hide
  */
 internal class ServiceBackedPassiveMonitoringClient(private val applicationContext: Context) :
-    PassiveMonitoringClient {
+    PassiveMonitoringClient,
+    Client<IPassiveMonitoringApiService>(
+        CLIENT_CONFIGURATION,
+        HsConnectionManager.getInstance(applicationContext),
+        { binder -> IPassiveMonitoringApiService.Stub.asInterface(binder) },
+        { service -> service.apiVersion }
+    ) {
 
-    private val ipcClient: PassiveMonitoringIpcClient =
-        PassiveMonitoringIpcClient(HsConnectionManager.getInstance(applicationContext))
+    private val packageName = applicationContext.packageName
 
     override fun registerDataCallback(
-        dataTypes: Set<DataType>,
-        callbackIntent: PendingIntent
-    ): ListenableFuture<Void> {
-        return registerDataCallbackInternal(dataTypes, callbackIntent, callback = null)
-    }
+        configuration: PassiveMonitoringConfig
+    ): ListenableFuture<Void> = registerDataCallbackInternal(configuration, callback = null)
 
     override fun registerDataCallback(
-        dataTypes: Set<DataType>,
-        callbackIntent: PendingIntent,
+        configuration: PassiveMonitoringConfig,
         callback: PassiveMonitoringCallback
+    ): ListenableFuture<Void> = registerDataCallbackInternal(configuration, callback)
+
+    override fun unregisterDataCallback(): ListenableFuture<Void> =
+        execute { service, resultFuture ->
+            service.unregisterDataCallback(packageName, StatusCallback(resultFuture))
+        }
+
+    // TODO(jlannin): Make this take in the BroadcastReceiver directly.
+    override fun registerPassiveGoalCallback(
+        passiveGoal: PassiveGoal,
+        componentName: ComponentName,
     ): ListenableFuture<Void> {
-        return registerDataCallbackInternal(dataTypes, callbackIntent, callback)
+        val request = PassiveGoalRequest(packageName, componentName.getClassName(), passiveGoal)
+        return execute { service, resultFuture ->
+            service.registerPassiveGoalCallback(request, StatusCallback(resultFuture))
+        }
     }
 
-    override fun unregisterDataCallback(): ListenableFuture<Void> {
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .unregisterDataCallback(
-                        applicationContext.packageName,
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun unregisterPassiveGoalCallback(passiveGoal: PassiveGoal): ListenableFuture<Void> {
+        val request = PassiveGoalRequest(packageName, /*unused*/ "", passiveGoal)
+        return execute { service, resultFuture ->
+            service.unregisterPassiveGoalCallback(request, StatusCallback(resultFuture))
+        }
     }
 
-    override fun registerEventCallback(
-        event: Event,
-        callbackIntent: PendingIntent
-    ): ListenableFuture<Void> {
-        val request = EventRequest(applicationContext.packageName, event)
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .registerEventCallback(request, callbackIntent, StatusCallback(resultFuture))
-            }
-        return ipcClient.execute(serviceOperation)
-    }
-
-    override fun unregisterEventCallback(event: Event): ListenableFuture<Void> {
-        val request = EventRequest(applicationContext.packageName, event)
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .unregisterEventCallback(request, StatusCallback(resultFuture))
-            }
-        return ipcClient.execute(serviceOperation)
+    override fun flush(): ListenableFuture<Void> {
+        val request = FlushRequest(packageName)
+        return execute { service, resultFuture ->
+            service.flush(request, StatusCallback(resultFuture))
+        }
     }
 
     override val capabilities: ListenableFuture<PassiveMonitoringCapabilities>
-        get() {
-            val request = CapabilitiesRequest(applicationContext.packageName)
-            val serviceOperation =
-                ServiceOperation<PassiveMonitoringCapabilitiesResponse> { binder, resultFuture ->
-                    resultFuture.set(getServiceInterface(binder).getCapabilities(request))
-                }
-            return Futures.transform(
-                ipcClient.execute(serviceOperation),
+        get() =
+            Futures.transform(
+                execute { service -> service.getCapabilities(CapabilitiesRequest(packageName)) },
                 { response -> response?.passiveMonitoringCapabilities },
                 ContextCompat.getMainExecutor(applicationContext)
             )
-        }
 
     private fun registerDataCallbackInternal(
-        dataTypes: Set<DataType>,
-        callbackIntent: PendingIntent,
+        configuration: PassiveMonitoringConfig,
         callback: PassiveMonitoringCallback?
-    ): ListenableFuture<Void> {
-        val request = BackgroundRegistrationRequest(applicationContext.packageName, dataTypes)
-        val serviceOperation =
-            ServiceOperation<Void> { binder, resultFuture ->
-                getServiceInterface(binder)
-                    .registerDataCallback(
-                        request,
-                        callbackIntent,
-                        callback?.let { PassiveMonitoringCallbackStub(it) },
-                        StatusCallback(resultFuture)
-                    )
-            }
-        return ipcClient.execute(serviceOperation)
+    ): ListenableFuture<Void> = execute { service, resultFuture ->
+        // TODO(b/191997620): This should check the package against what was requested and return an
+        // error in the event of a mismatch.
+        // TODO(jlannin): Maybe we should put the BroadcastReceiver directly in the
+        // PassiveMonitoringConfig?
+        service.registerDataCallback(
+            BackgroundRegistrationRequest(configuration),
+            callback?.let { PassiveMonitoringCallbackStub(it) },
+            StatusCallback(resultFuture)
+        )
+    }
+
+    private companion object {
+        private const val CLIENT = "HealthServicesPassiveMonitoringClient"
+        private val CLIENT_CONFIGURATION =
+            ClientConfiguration(CLIENT, SERVICE_PACKAGE_NAME, PASSIVE_API_BIND_ACTION)
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/ExerciseUpdateListenerEvent.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/ExerciseUpdateListenerEvent.kt
new file mode 100644
index 0000000..87e9046
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/ExerciseUpdateListenerEvent.kt
@@ -0,0 +1,48 @@
+package androidx.health.services.client.impl.event
+
+import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.impl.response.AvailabilityResponse
+import androidx.health.services.client.impl.response.ExerciseLapSummaryResponse
+import androidx.health.services.client.impl.response.ExerciseUpdateResponse
+import androidx.health.services.client.proto.EventsProto.ExerciseUpdateListenerEvent as ListenerProto
+
+/**
+ * An event representing an `ExerciseUpdateListener` invocation.
+ *
+ * @hide
+ */
+public class ExerciseUpdateListenerEvent(public override val proto: ListenerProto) :
+    ProtoParcelable<ListenerProto>() {
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<ExerciseUpdateListenerEvent> = newCreator {
+            ExerciseUpdateListenerEvent(ListenerProto.parseFrom(it))
+        }
+
+        @JvmStatic
+        public fun createExerciseUpdateEvent(
+            exerciseUpdate: ExerciseUpdateResponse
+        ): ExerciseUpdateListenerEvent =
+            ExerciseUpdateListenerEvent(
+                ListenerProto.newBuilder().setExerciseUpdateResponse(exerciseUpdate.proto).build()
+            )
+
+        @JvmStatic
+        public fun createLapSummaryEvent(
+            lapSummary: ExerciseLapSummaryResponse
+        ): ExerciseUpdateListenerEvent =
+            ExerciseUpdateListenerEvent(
+                ListenerProto.newBuilder().setLapSummaryResponse(lapSummary.proto).build()
+            )
+
+        @JvmStatic
+        public fun createAvailabilityUpdateEvent(
+            availability: AvailabilityResponse
+        ): ExerciseUpdateListenerEvent =
+            ExerciseUpdateListenerEvent(
+                ListenerProto.newBuilder().setAvailabilityResponse(availability.proto).build()
+            )
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/MeasureCallbackEvent.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/MeasureCallbackEvent.kt
new file mode 100644
index 0000000..17dfe12
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/MeasureCallbackEvent.kt
@@ -0,0 +1,39 @@
+package androidx.health.services.client.impl.event
+
+import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.impl.response.AvailabilityResponse
+import androidx.health.services.client.impl.response.DataPointsResponse
+import androidx.health.services.client.proto.EventsProto.MeasureCallbackEvent as ListenerProto
+
+/**
+ * An event representing a `MeasureCallback` invocation.
+ *
+ * @hide
+ */
+public class MeasureCallbackEvent(public override val proto: ListenerProto) :
+    ProtoParcelable<ListenerProto>() {
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<MeasureCallbackEvent> = newCreator {
+            MeasureCallbackEvent(ListenerProto.parseFrom(it))
+        }
+
+        @JvmStatic
+        public fun createDataPointsUpdateEvent(
+            dataPointsResponse: DataPointsResponse
+        ): MeasureCallbackEvent =
+            MeasureCallbackEvent(
+                ListenerProto.newBuilder().setDataPointResponse(dataPointsResponse.proto).build()
+            )
+
+        @JvmStatic
+        public fun createAvailabilityUpdateEvent(
+            availability: AvailabilityResponse
+        ): MeasureCallbackEvent =
+            MeasureCallbackEvent(
+                ListenerProto.newBuilder().setAvailabilityResponse(availability.proto).build()
+            )
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/PassiveCallbackEvent.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/PassiveCallbackEvent.kt
new file mode 100644
index 0000000..5c22157
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/event/PassiveCallbackEvent.kt
@@ -0,0 +1,30 @@
+package androidx.health.services.client.impl.event
+
+import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.impl.response.PassiveMonitoringUpdateResponse
+import androidx.health.services.client.proto.EventsProto.PassiveCallbackEvent as EventProto
+
+/**
+ * An event representing a `PassiveMonitoringCallback` invocation.
+ *
+ * @hide
+ */
+public class PassiveCallbackEvent(public override val proto: EventProto) :
+    ProtoParcelable<EventProto>() {
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<PassiveCallbackEvent> = newCreator {
+            PassiveCallbackEvent(EventProto.parseFrom(it))
+        }
+
+        @JvmStatic
+        public fun createPassiveUpdateResponse(
+            response: PassiveMonitoringUpdateResponse
+        ): PassiveCallbackEvent =
+            PassiveCallbackEvent(
+                EventProto.newBuilder().setPassiveUpdateResponse(response.proto).build()
+            )
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/Client.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/Client.java
index b417620..9292b95 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/Client.java
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/Client.java
@@ -17,12 +17,12 @@
 package androidx.health.services.client.impl.ipc;
 
 import android.os.IBinder;
+import android.os.IInterface;
 import android.os.RemoteException;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
-import androidx.annotation.VisibleForTesting;
 import androidx.health.services.client.impl.ipc.internal.BaseQueueOperation;
 import androidx.health.services.client.impl.ipc.internal.ConnectionConfiguration;
 import androidx.health.services.client.impl.ipc.internal.ConnectionManager;
@@ -37,39 +37,37 @@
 import com.google.common.util.concurrent.SettableFuture;
 
 /**
- * SDK client for establishing connection to a cross process service.
+ * Client for establishing connection to a cross process service.
  *
  * <p>Extend this class to create a new client. Each client should represent one connection to AIDL
  * interface. For user instruction see: go/wear-dd-wcs-sdk
  *
+ * @param <S> type of the service interface
  * @hide
  */
 @RestrictTo(Scope.LIBRARY)
-public abstract class Client {
-
-    /** Interface abstracting extraction of the API version from the binder. */
-    public interface VersionGetter {
-        /** Returns the API version. */
-        Integer readVersion(IBinder binder) throws RemoteException;
-    }
+public abstract class Client<S extends IInterface> {
 
     private static final int UNKNOWN_VERSION = -1;
 
     private final ConnectionConfiguration mConnectionConfiguration;
     private final ConnectionManager mConnectionManager;
-    private final ServiceOperation<Integer> mApiVersionOperation;
+    private final ServiceGetter<S> mServiceGetter;
+    private final RemoteOperation<S, Integer> mRemoteVersionGetter;
 
-    @VisibleForTesting volatile int mCurrentVersion = UNKNOWN_VERSION;
+    private volatile int mCurrentVersion = UNKNOWN_VERSION;
 
     public Client(
             ClientConfiguration clientConfiguration,
             ConnectionManager connectionManager,
-            VersionGetter versionGetter) {
+            ServiceGetter<S> serviceGetter,
+            RemoteOperation<S, Integer> remoteVersionGetter) {
         QueueOperation versionOperation =
                 new QueueOperation() {
                     @Override
                     public void execute(IBinder binder) throws RemoteException {
-                        mCurrentVersion = versionGetter.readVersion(binder);
+                        mCurrentVersion =
+                                remoteVersionGetter.execute(serviceGetter.getService(binder));
                     }
 
                     @Override
@@ -82,7 +80,7 @@
 
                     @Override
                     public ConnectionConfiguration getConnectionConfiguration() {
-                        return Client.this.getConnectionConfiguration();
+                        return mConnectionConfiguration;
                     }
                 };
         this.mConnectionConfiguration =
@@ -92,30 +90,47 @@
                         clientConfiguration.getBindAction(),
                         versionOperation);
         this.mConnectionManager = connectionManager;
-        this.mApiVersionOperation =
-                (binder, resultFuture) -> resultFuture.set(versionGetter.readVersion(binder));
+        this.mServiceGetter = serviceGetter;
+        this.mRemoteVersionGetter = remoteVersionGetter;
     }
 
     /**
-     * Executes given operation against a IPC service defined by {@code clientConfiguration}.
+     * Executes given {@code operation} against the service.
      *
-     * @param operation Operation that will be executed against the service
-     * @param <R> Type of returned variable
-     * @return {@link ListenableFuture<R>} with the result of the operation or an exception if the
+     * @see #execute(RemoteFutureOperation)
+     */
+    protected <R> ListenableFuture<R> execute(RemoteOperation<S, R> operation) {
+        return execute((service, resultFuture) -> resultFuture.set(operation.execute(service)));
+    }
+
+    /**
+     * Executes given {@code operation} against the service and the result future.
+     *
+     * @param operation operation that will be executed against the service and the result future
+     * @param <R> type of the result value returned in the future
+     * @return {@link ListenableFuture} with the result of the operation or an exception if the
      *     execution fails.
      */
-    protected <R> ListenableFuture<R> execute(ServiceOperation<R> operation) {
+    protected <R> ListenableFuture<R> execute(RemoteFutureOperation<S, R> operation) {
         SettableFuture<R> settableFuture = SettableFuture.create();
-        mConnectionManager.scheduleForExecution(
-                createQueueOperation(operation, mConnectionConfiguration, settableFuture));
+        mConnectionManager.scheduleForExecution(createQueueOperation(operation, settableFuture));
         return settableFuture;
     }
 
+    /**
+     * Executes given {@code operation} against the service and the result future with version
+     * check.
+     *
+     * @param operation operation that will be executed against the service and the result future
+     * @param <R> type of the result value returned in the future
+     * @return {@link ListenableFuture} with the result of the operation or an exception if the
+     *     execution fails or if the remote service version is lower than {@code minApiVersion}
+     */
     protected <R> ListenableFuture<R> executeWithVersionCheck(
-            ServiceOperation<R> operation, int minApiVersion) {
+            RemoteFutureOperation<S, R> operation, int minApiVersion) {
         if (mCurrentVersion == UNKNOWN_VERSION) {
             SettableFuture<R> settableFuture = SettableFuture.create();
-            ListenableFuture<Integer> versionFuture = execute(mApiVersionOperation);
+            ListenableFuture<Integer> versionFuture = execute(mRemoteVersionGetter);
             Futures.addCallback(
                     versionFuture,
                     new FutureCallback<Integer>() {
@@ -126,14 +141,10 @@
                             if (mCurrentVersion < minApiVersion) {
                                 settableFuture.setException(
                                         getApiVersionCheckFailureException(
-                                                mCurrentVersion, minApiVersion));
+                                            mCurrentVersion, minApiVersion));
                             } else {
-                                getConnectionManager()
-                                        .scheduleForExecution(
-                                                createQueueOperation(
-                                                        operation,
-                                                        getConnectionConfiguration(),
-                                                        settableFuture));
+                                mConnectionManager.scheduleForExecution(
+                                        createQueueOperation(operation, settableFuture));
                             }
                         }
 
@@ -158,45 +169,80 @@
     }
 
     /**
-     * Registers a listener by executing the provided {@link ServiceOperation}.
+     * Registers a listener by executing the provided {@link RemoteOperation
+     * registerListenerOperation}.
      *
      * <p>The provided {@code registerListenerOperation} will be stored for every unique {@code
      * listenerKey} and re-executed when connection is lost.
      *
-     * @param listenerKey Key based on which listeners will be distinguished.
-     * @param registerListenerOperation Method that registers the listener, can by any {@link
-     *     ServiceOperation}.
-     * @param <R> Type of return value returned in the future.
-     * @return {@link ListenableFuture<R>} with the result of the operation or an exception if the
-     *     execution fails.
+     * @param listenerKey key based on which listeners will be distinguished
+     * @param registerListenerOperation {@link RemoteOperation} to register the listener
+     * @param <R> return type of {@code registerListenerOperation}
+     * @return {@link ListenableFuture} with the result of the operation or an exception if the
+     *     execution fails
      */
     protected <R> ListenableFuture<R> registerListener(
-            ListenerKey listenerKey, ServiceOperation<R> registerListenerOperation) {
+            ListenerKey listenerKey, RemoteOperation<S, R> registerListenerOperation) {
+        return registerListener(
+                listenerKey,
+                (service, resultFuture) ->
+                        resultFuture.set(registerListenerOperation.execute(service)));
+    }
+
+    /**
+     * Registers a listener by executing the provided {@link RemoteFutureOperation
+     * registerListenerOperation}.
+     *
+     * <p>The provided {@code registerListenerOperation} will be stored for every unique {@code
+     * listenerKey} and re-executed when connection is lost.
+     *
+     * @param listenerKey key based on which listeners will be distinguished
+     * @param registerListenerOperation {@link RemoteFutureOperation} to register the listener
+     * @param <R> return type of {@code registerListenerOperation}
+     * @return {@link ListenableFuture} with the result of the operation or an exception if the
+     *     execution fails
+     */
+    protected <R> ListenableFuture<R> registerListener(
+            ListenerKey listenerKey, RemoteFutureOperation<S, R> registerListenerOperation) {
         SettableFuture<R> settableFuture = SettableFuture.create();
         mConnectionManager.registerListener(
-                listenerKey,
-                createQueueOperation(
-                        registerListenerOperation, mConnectionConfiguration, settableFuture));
+                listenerKey, createQueueOperation(registerListenerOperation, settableFuture));
         return settableFuture;
     }
 
     /**
-     * Unregisters a listener by executing the provided {@link ServiceOperation}.
+     * Unregisters a listener by executing the provided {@link RemoteOperation
+     * unregisterListenerOperation}.
      *
-     * @param listenerKey Key based on which listeners will be distinguished.
-     * @param unregisterListenerOperation Method that unregisters the listener, can by any {@link
-     *     ServiceOperation}.
-     * @param <R> Type of return value returned in the future.
-     * @return {@link ListenableFuture<R>} with the result of the operation or an exception if the
-     *     execution fails.
+     * @param listenerKey key based on which listeners will be distinguished
+     * @param unregisterListenerOperation {@link RemoteOperation} to unregister the listener
+     * @param <R> return type of {@code unregisterListenerOperation}
+     * @return {@link ListenableFuture} with the result of the operation or an exception if the
+     *     execution fails
      */
     protected <R> ListenableFuture<R> unregisterListener(
-            ListenerKey listenerKey, ServiceOperation<R> unregisterListenerOperation) {
+            ListenerKey listenerKey, RemoteOperation<S, R> unregisterListenerOperation) {
+        return unregisterListener(
+                listenerKey,
+                (service, resultFuture) ->
+                        resultFuture.set(unregisterListenerOperation.execute(service)));
+    }
+
+    /**
+     * Unregisters a listener by executing the provided {@link RemoteFutureOperation
+     * unregisterListenerOperation}.
+     *
+     * @param listenerKey key based on which listeners will be distinguished
+     * @param unregisterListenerOperation {@link RemoteFutureOperation} to unregister the listener
+     * @param <R> return type of {@code unregisterListenerOperation}
+     * @return {@link ListenableFuture} with the result of the operation or an exception if the
+     *     execution fails
+     */
+    protected <R> ListenableFuture<R> unregisterListener(
+            ListenerKey listenerKey, RemoteFutureOperation<S, R> unregisterListenerOperation) {
         SettableFuture<R> settableFuture = SettableFuture.create();
         mConnectionManager.unregisterListener(
-                listenerKey,
-                createQueueOperation(
-                        unregisterListenerOperation, getConnectionConfiguration(), settableFuture));
+                listenerKey, createQueueOperation(unregisterListenerOperation, settableFuture));
         return settableFuture;
     }
 
@@ -212,14 +258,12 @@
         return mConnectionManager;
     }
 
-    private static <R> QueueOperation createQueueOperation(
-            ServiceOperation<R> operation,
-            ConnectionConfiguration connectionConfiguration,
-            SettableFuture<R> settableFuture) {
-        return new BaseQueueOperation(connectionConfiguration) {
+    private <R> QueueOperation createQueueOperation(
+            RemoteFutureOperation<S, R> operation, SettableFuture<R> settableFuture) {
+        return new BaseQueueOperation(mConnectionConfiguration) {
             @Override
             public void execute(IBinder binder) throws RemoteException {
-                operation.execute(binder, settableFuture);
+                operation.execute(getService(binder), settableFuture);
             }
 
             @Override
@@ -234,4 +278,13 @@
             }
         };
     }
+
+    private S getService(IBinder binder) {
+        return mServiceGetter.getService(binder);
+    }
+
+    /** Interface for obtaining the service instance from the binder. */
+    protected interface ServiceGetter<S> {
+        S getService(IBinder binder);
+    }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/RemoteFutureOperation.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/RemoteFutureOperation.java
new file mode 100644
index 0000000..c3bcb57
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/RemoteFutureOperation.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.impl.ipc;
+
+import android.os.RemoteException;
+
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+
+import com.google.common.util.concurrent.SettableFuture;
+
+/**
+ * General operation that will be executed against given remote service. The implementation is
+ * responsible for setting the {@link SettableFuture result future} with the result value.
+ *
+ * @param <S> type of the remote service
+ * @param <R> type of the result value
+ * @hide
+ */
+@RestrictTo(Scope.LIBRARY)
+public interface RemoteFutureOperation<S, R> {
+
+    /**
+     * Executes a task against the {@code service} and {@code resultFuture}.
+     *
+     * @param service the already connected remote service to execute the task against
+     * @param resultFuture a {@link SettableFuture} that should be set with the execution result
+     * @throws RemoteException on binder error
+     */
+    void execute(S service, SettableFuture<R> resultFuture) throws RemoteException;
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/RemoteOperation.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/RemoteOperation.java
new file mode 100644
index 0000000..4fefd8a
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/RemoteOperation.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.impl.ipc;
+
+import android.os.RemoteException;
+
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+
+/**
+ * General operation that will be executed against given remote service.
+ *
+ * @param <S> type of the remote service
+ * @param <R> type of the returned value
+ * @hide
+ */
+@RestrictTo(Scope.LIBRARY)
+public interface RemoteOperation<S, R> {
+
+    /**
+     * Executes a task against the remote service.
+     *
+     * @param service the already connected remote service to execute the task against
+     * @return the operation result
+     * @throws RemoteException on binder error
+     */
+    R execute(S service) throws RemoteException;
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/AutoPauseAndResumeConfigRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/AutoPauseAndResumeConfigRequest.kt
index 6fc9161..82284cb 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/AutoPauseAndResumeConfigRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/AutoPauseAndResumeConfigRequest.kt
@@ -16,39 +16,32 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for enabling/disabling auto pause/resume.
  *
  * @hide
  */
-public data class AutoPauseAndResumeConfigRequest(
-    val packageName: String,
-    val shouldEnable: Boolean,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+public class AutoPauseAndResumeConfigRequest(
+    public val packageName: String,
+    public val shouldEnable: Boolean,
+) : ProtoParcelable<RequestsProto.AutoPauseAndResumeConfigRequest>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
-        dest.writeInt(if (shouldEnable) 1 else 0)
+    override val proto: RequestsProto.AutoPauseAndResumeConfigRequest by lazy {
+        RequestsProto.AutoPauseAndResumeConfigRequest.newBuilder()
+            .setPackageName(packageName)
+            .setShouldEnable(shouldEnable)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<AutoPauseAndResumeConfigRequest> =
-            object : Parcelable.Creator<AutoPauseAndResumeConfigRequest> {
-                override fun createFromParcel(source: Parcel): AutoPauseAndResumeConfigRequest? {
-                    return AutoPauseAndResumeConfigRequest(
-                        source.readString() ?: return null,
-                        source.readInt() == 1,
-                    )
-                }
-
-                override fun newArray(size: Int): Array<AutoPauseAndResumeConfigRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<AutoPauseAndResumeConfigRequest> = newCreator {
+            val request = RequestsProto.AutoPauseAndResumeConfigRequest.parseFrom(it)
+            AutoPauseAndResumeConfigRequest(request.packageName, request.shouldEnable)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundRegistrationRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundRegistrationRequest.kt
index 2c0296a..1b41fdd 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundRegistrationRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundRegistrationRequest.kt
@@ -16,40 +16,32 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
-import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.PassiveMonitoringConfig
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for background registration.
  *
  * @hide
  */
-public data class BackgroundRegistrationRequest(
-    val packageName: String,
-    val dataTypes: Set<DataType>,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+public class BackgroundRegistrationRequest(
+    public val passiveMonitoringConfig: PassiveMonitoringConfig,
+) : ProtoParcelable<RequestsProto.BackgroundRegistrationRequest>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
-        dest.writeTypedList(dataTypes.toList())
+    override val proto: RequestsProto.BackgroundRegistrationRequest by lazy {
+        RequestsProto.BackgroundRegistrationRequest.newBuilder()
+            .setConfig(passiveMonitoringConfig.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
         public val CREATOR: Parcelable.Creator<BackgroundRegistrationRequest> =
-            object : Parcelable.Creator<BackgroundRegistrationRequest> {
-                override fun createFromParcel(source: Parcel): BackgroundRegistrationRequest? {
-                    val packageName = source.readString() ?: return null
-                    val list = ArrayList<DataType>()
-                    source.readTypedList(list, DataType.CREATOR)
-                    return BackgroundRegistrationRequest(packageName, list.toSet())
-                }
-
-                override fun newArray(size: Int): Array<BackgroundRegistrationRequest?> {
-                    return arrayOfNulls(size)
-                }
+            newCreator { bytes ->
+                val proto = RequestsProto.BackgroundRegistrationRequest.parseFrom(bytes)
+                BackgroundRegistrationRequest(PassiveMonitoringConfig(proto.config))
             }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundUnregistrationRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundUnregistrationRequest.kt
index 67fcaa8..abf5795 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundUnregistrationRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/BackgroundUnregistrationRequest.kt
@@ -16,34 +16,29 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for background unregistration.
  *
  * @hide
  */
-public data class BackgroundUnregistrationRequest(val packageName: String) : Parcelable {
+public class BackgroundUnregistrationRequest(public val packageName: String) :
+    ProtoParcelable<RequestsProto.PassiveMonitoringUnregistrationRequest>() {
 
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
+    override val proto: RequestsProto.PassiveMonitoringUnregistrationRequest by lazy {
+        RequestsProto.PassiveMonitoringUnregistrationRequest.newBuilder()
+            .setPackageName(packageName)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<BackgroundUnregistrationRequest> =
-            object : Parcelable.Creator<BackgroundUnregistrationRequest> {
-                override fun createFromParcel(source: Parcel): BackgroundUnregistrationRequest? {
-                    val packageName = source.readString() ?: return null
-                    return BackgroundUnregistrationRequest(packageName)
-                }
-
-                override fun newArray(size: Int): Array<BackgroundUnregistrationRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<BackgroundUnregistrationRequest> = newCreator {
+            val request = RequestsProto.PassiveMonitoringUnregistrationRequest.parseFrom(it)
+            BackgroundUnregistrationRequest(request.packageName)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/CapabilitiesRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/CapabilitiesRequest.kt
index ba837e4..008a9cc 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/CapabilitiesRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/CapabilitiesRequest.kt
@@ -16,34 +16,27 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for capabilities.
  *
  * @hide
  */
-public data class CapabilitiesRequest(val packageName: String) : Parcelable {
+public class CapabilitiesRequest(public val packageName: String) :
+    ProtoParcelable<RequestsProto.CapabilitiesRequest>() {
 
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
+    override val proto: RequestsProto.CapabilitiesRequest by lazy {
+        RequestsProto.CapabilitiesRequest.newBuilder().setPackageName(packageName).build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<CapabilitiesRequest> =
-            object : Parcelable.Creator<CapabilitiesRequest> {
-                override fun createFromParcel(source: Parcel): CapabilitiesRequest? {
-                    val packageName = source.readString() ?: return null
-                    return CapabilitiesRequest(packageName)
-                }
-
-                override fun newArray(size: Int): Array<CapabilitiesRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<CapabilitiesRequest> = newCreator {
+            val request = RequestsProto.CapabilitiesRequest.parseFrom(it)
+            CapabilitiesRequest(request.packageName)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/EventRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/EventRequest.kt
deleted file mode 100644
index ddfce39..0000000
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/EventRequest.kt
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2021 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.health.services.client.impl.request
-
-import android.os.Parcel
-import android.os.Parcelable
-import androidx.health.services.client.data.event.Event
-
-/**
- * Request for event registration.
- *
- * @hide
- */
-public data class EventRequest(val packageName: String, val event: Event) : Parcelable {
-    override fun describeContents(): Int = 0
-
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
-        dest.writeParcelable(event, flags)
-    }
-
-    public companion object {
-        @JvmField
-        public val CREATOR: Parcelable.Creator<EventRequest> =
-            object : Parcelable.Creator<EventRequest> {
-                override fun createFromParcel(source: Parcel): EventRequest? {
-                    return EventRequest(
-                        source.readString() ?: return null,
-                        source.readParcelable(Event::class.java.classLoader) ?: return null,
-                    )
-                }
-
-                override fun newArray(size: Int): Array<EventRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
-    }
-}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/FlushRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/FlushRequest.kt
new file mode 100644
index 0000000..575b42e
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/FlushRequest.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.impl.request
+
+import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
+
+/**
+ * Request to flush data metrics.
+ *
+ * @hide
+ */
+public class FlushRequest(public val packageName: String) :
+    ProtoParcelable<RequestsProto.FlushRequest>() {
+
+    override val proto: RequestsProto.FlushRequest by lazy {
+        RequestsProto.FlushRequest.newBuilder().setPackageName(packageName).build()
+    }
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<FlushRequest> = newCreator {
+            val request = RequestsProto.FlushRequest.parseFrom(it)
+            FlushRequest(request.packageName)
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureRegistrationRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureRegistrationRequest.kt
index 2d88026..b383c30 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureRegistrationRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureRegistrationRequest.kt
@@ -16,40 +16,33 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for measure registration.
  *
  * @hide
  */
-public data class MeasureRegistrationRequest(
-    val packageName: String,
-    val dataType: DataType,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+public class MeasureRegistrationRequest(
+    public val packageName: String,
+    public val dataType: DataType,
+) : ProtoParcelable<RequestsProto.MeasureRegistrationRequest>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
-        dest.writeParcelable(dataType, flags)
+    override val proto: RequestsProto.MeasureRegistrationRequest by lazy {
+        RequestsProto.MeasureRegistrationRequest.newBuilder()
+            .setPackageName(packageName)
+            .setDataType(dataType.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<MeasureRegistrationRequest> =
-            object : Parcelable.Creator<MeasureRegistrationRequest> {
-                override fun createFromParcel(source: Parcel): MeasureRegistrationRequest? {
-                    return MeasureRegistrationRequest(
-                        source.readString() ?: return null,
-                        source.readParcelable(DataType::class.java.classLoader) ?: return null
-                    )
-                }
-
-                override fun newArray(size: Int): Array<MeasureRegistrationRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<MeasureRegistrationRequest> = newCreator { bytes ->
+            val proto = RequestsProto.MeasureRegistrationRequest.parseFrom(bytes)
+            MeasureRegistrationRequest(proto.packageName, DataType(proto.dataType))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureUnregistrationRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureUnregistrationRequest.kt
index 55e8054..0682202 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureUnregistrationRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/MeasureUnregistrationRequest.kt
@@ -16,41 +16,33 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for measure unregistration.
  *
  * @hide
  */
-public data class MeasureUnregistrationRequest(
-    val packageName: String,
-    val dataType: DataType,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+public class MeasureUnregistrationRequest(
+    public val packageName: String,
+    public val dataType: DataType,
+) : ProtoParcelable<RequestsProto.MeasureUnregistrationRequest>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
-        dest.writeParcelable(dataType, flags)
+    override val proto: RequestsProto.MeasureUnregistrationRequest by lazy {
+        RequestsProto.MeasureUnregistrationRequest.newBuilder()
+            .setPackageName(packageName)
+            .setDataType(dataType.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<MeasureUnregistrationRequest> =
-            object : Parcelable.Creator<MeasureUnregistrationRequest> {
-                override fun createFromParcel(source: Parcel): MeasureUnregistrationRequest? {
-                    val packageName = source.readString() ?: return null
-                    val dataType =
-                        source.readParcelable<DataType>(DataType::class.java.classLoader)
-                            ?: return null
-                    return MeasureUnregistrationRequest(packageName, dataType)
-                }
-
-                override fun newArray(size: Int): Array<MeasureUnregistrationRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<MeasureUnregistrationRequest> = newCreator { bytes ->
+            val proto = RequestsProto.MeasureUnregistrationRequest.parseFrom(bytes)
+            MeasureUnregistrationRequest(proto.packageName, DataType(proto.dataType))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/PassiveGoalRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/PassiveGoalRequest.kt
new file mode 100644
index 0000000..bf921262
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/PassiveGoalRequest.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.impl.request
+
+import android.os.Parcelable
+import androidx.health.services.client.data.PassiveGoal
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
+
+/**
+ * Request for passive goal registration.
+ *
+ * @hide
+ */
+public class PassiveGoalRequest(
+    public val packageName: String,
+    public val receiverClassName: String,
+    public val passiveGoal: PassiveGoal,
+) : ProtoParcelable<RequestsProto.PassiveGoalRequest>() {
+
+    override val proto: RequestsProto.PassiveGoalRequest by lazy {
+        RequestsProto.PassiveGoalRequest.newBuilder()
+            .setPackageName(packageName)
+            .setReceiverClassName(receiverClassName)
+            .setPassiveGoal(passiveGoal.proto)
+            .build()
+    }
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<PassiveGoalRequest> = newCreator { bytes ->
+            val proto = RequestsProto.PassiveGoalRequest.parseFrom(bytes)
+            PassiveGoalRequest(
+                proto.packageName,
+                proto.receiverClassName,
+                PassiveGoal(proto.passiveGoal)
+            )
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/PrepareExerciseRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/PrepareExerciseRequest.kt
new file mode 100644
index 0000000..e3ad5c3
--- /dev/null
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/PrepareExerciseRequest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2021 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.health.services.client.impl.request
+
+import android.os.Parcelable
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.data.WarmUpConfig
+import androidx.health.services.client.proto.RequestsProto
+
+/**
+ * Request for preparing for an exercise.
+ *
+ * @hide
+ */
+public class PrepareExerciseRequest(
+    public val packageName: String,
+    public val warmUpConfig: WarmUpConfig,
+) : ProtoParcelable<RequestsProto.PrepareExerciseRequest>() {
+
+    override val proto: RequestsProto.PrepareExerciseRequest by lazy {
+        RequestsProto.PrepareExerciseRequest.newBuilder()
+            .setPackageName(packageName)
+            .setConfig(warmUpConfig.proto)
+            .build()
+    }
+
+    public companion object {
+        @JvmField
+        public val CREATOR: Parcelable.Creator<PrepareExerciseRequest> = newCreator { bytes ->
+            val proto = RequestsProto.PrepareExerciseRequest.parseFrom(bytes)
+            PrepareExerciseRequest(proto.packageName, WarmUpConfig(proto.config))
+        }
+    }
+}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/StartExerciseRequest.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/StartExerciseRequest.kt
index d67b359..20ecb16 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/StartExerciseRequest.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/request/StartExerciseRequest.kt
@@ -16,43 +16,33 @@
 
 package androidx.health.services.client.impl.request
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.ExerciseConfig
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.RequestsProto
 
 /**
  * Request for starting an exercise.
  *
  * @hide
  */
-public data class StartExerciseRequest(
-    val packageName: String,
-    val exerciseConfig: ExerciseConfig,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+public class StartExerciseRequest(
+    public val packageName: String,
+    public val exerciseConfig: ExerciseConfig,
+) : ProtoParcelable<RequestsProto.StartExerciseRequest>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeString(packageName)
-        dest.writeParcelable(exerciseConfig, flags)
+    override val proto: RequestsProto.StartExerciseRequest by lazy {
+        RequestsProto.StartExerciseRequest.newBuilder()
+            .setPackageName(packageName)
+            .setConfig(exerciseConfig.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<StartExerciseRequest> =
-            object : Parcelable.Creator<StartExerciseRequest> {
-                override fun createFromParcel(source: Parcel): StartExerciseRequest? {
-                    val packageName = source.readString() ?: return null
-                    val parcelable =
-                        source.readParcelable<ExerciseConfig>(
-                            ExerciseConfig::class.java.classLoader
-                        )
-                            ?: return null
-                    return StartExerciseRequest(packageName, parcelable)
-                }
-
-                override fun newArray(size: Int): Array<StartExerciseRequest?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<StartExerciseRequest> = newCreator { bytes ->
+            val proto = RequestsProto.StartExerciseRequest.parseFrom(bytes)
+            StartExerciseRequest(proto.packageName, ExerciseConfig(proto.config))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/AvailabilityResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/AvailabilityResponse.kt
index 3a3ccf6..f4b0f0f 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/AvailabilityResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/AvailabilityResponse.kt
@@ -16,44 +16,50 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.Availability
 import androidx.health.services.client.data.DataType
+import androidx.health.services.client.data.DataTypeAvailability
+import androidx.health.services.client.data.LocationAvailability
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.DataProto.Availability.AvailabilityCase.AVAILABILITY_NOT_SET
+import androidx.health.services.client.proto.DataProto.Availability.AvailabilityCase.DATA_TYPE_AVAILABILITY
+import androidx.health.services.client.proto.DataProto.Availability.AvailabilityCase.LOCATION_AVAILABILITY
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
- * Response sent on MeasureCallback with a [DataType] and its associated [Availability] status.
+ * Response sent on MeasureCallback and ExerciseUpdateListener with a [DataType] and its associated
+ * [Availability] status.
  *
  * @hide
  */
-public data class AvailabilityResponse(
+public class AvailabilityResponse(
     /** [DataType] of the [AvailabilityResponse]. */
-    val dataType: DataType,
+    public val dataType: DataType,
     /** [Availability] of the [AvailabilityResponse]. */
-    val availability: Availability,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val availability: Availability,
+) : ProtoParcelable<ResponsesProto.AvailabilityResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(dataType, flags)
-        dest.writeInt(availability.id)
+    override val proto: ResponsesProto.AvailabilityResponse by lazy {
+        ResponsesProto.AvailabilityResponse.newBuilder()
+            .setDataType(dataType.proto)
+            .setAvailability(availability.toProto())
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<AvailabilityResponse> =
-            object : Parcelable.Creator<AvailabilityResponse> {
-                override fun createFromParcel(source: Parcel): AvailabilityResponse? {
-                    val parcelable =
-                        source.readParcelable<DataType>(DataType::class.java.classLoader)
-                            ?: return null
-                    val availability = Availability.fromId(source.readInt()) ?: return null
-                    return AvailabilityResponse(parcelable, availability)
+        public val CREATOR: Parcelable.Creator<AvailabilityResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.AvailabilityResponse.parseFrom(bytes)
+            val availability: Availability =
+                when (proto.availability.availabilityCase) {
+                    DATA_TYPE_AVAILABILITY ->
+                        DataTypeAvailability.fromProto(proto.availability.dataTypeAvailability)
+                    LOCATION_AVAILABILITY ->
+                        LocationAvailability.fromProto(proto.availability.locationAvailability)
+                    null, AVAILABILITY_NOT_SET -> DataTypeAvailability.UNKNOWN
                 }
-
-                override fun newArray(size: Int): Array<AvailabilityResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+            AvailabilityResponse(DataType(proto.dataType), availability)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/DataPointsResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/DataPointsResponse.kt
index 0b30f6d..46ab61b 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/DataPointsResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/DataPointsResponse.kt
@@ -16,35 +16,35 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.DataPoint
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response sent on MeasureCallback when new [DataPoints] [DataPoint] are available.
  *
  * @hide
  */
-public data class DataPointsResponse(val dataPoints: List<DataPoint>) : Parcelable {
-    override fun describeContents(): Int = 0
+public class DataPointsResponse(public val dataPoints: List<DataPoint>) :
+    ProtoParcelable<ResponsesProto.DataPointsResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeTypedList(dataPoints)
+    /** @hide */
+    public constructor(
+        proto: ResponsesProto.DataPointsResponse
+    ) : this(proto.dataPointsList.map { DataPoint(it) })
+
+    override val proto: ResponsesProto.DataPointsResponse by lazy {
+        ResponsesProto.DataPointsResponse.newBuilder()
+            .addAllDataPoints(dataPoints.map { it.proto })
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<DataPointsResponse> =
-            object : Parcelable.Creator<DataPointsResponse> {
-                override fun createFromParcel(source: Parcel): DataPointsResponse? {
-                    val list = ArrayList<DataPoint>()
-                    source.readTypedList(list, DataPoint.CREATOR)
-                    return DataPointsResponse(list)
-                }
-
-                override fun newArray(size: Int): Array<DataPointsResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<DataPointsResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.DataPointsResponse.parseFrom(bytes)
+            DataPointsResponse(proto)
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseCapabilitiesResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseCapabilitiesResponse.kt
index e55ccebc4..b66747a 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseCapabilitiesResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseCapabilitiesResponse.kt
@@ -16,9 +16,10 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.ExerciseCapabilities
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing the [ExerciseCapabilities] of the Health Services exercise client on the
@@ -26,32 +27,22 @@
  *
  * @hide
  */
-public data class ExerciseCapabilitiesResponse(
+public class ExerciseCapabilitiesResponse(
     /** [ExerciseCapabilities] supported by this device. */
-    val exerciseCapabilities: ExerciseCapabilities,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val exerciseCapabilities: ExerciseCapabilities,
+) : ProtoParcelable<ResponsesProto.ExerciseCapabilitiesResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(exerciseCapabilities, flags)
+    override val proto: ResponsesProto.ExerciseCapabilitiesResponse by lazy {
+        ResponsesProto.ExerciseCapabilitiesResponse.newBuilder()
+            .setCapabilities(exerciseCapabilities.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseCapabilitiesResponse> =
-            object : Parcelable.Creator<ExerciseCapabilitiesResponse> {
-                override fun createFromParcel(source: Parcel): ExerciseCapabilitiesResponse? {
-                    val parcelable =
-                        source.readParcelable<ExerciseCapabilities>(
-                            ExerciseCapabilities::class.java.classLoader
-                        )
-                            ?: return null
-                    return ExerciseCapabilitiesResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<ExerciseCapabilitiesResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseCapabilitiesResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.ExerciseCapabilitiesResponse.parseFrom(bytes)
+            ExerciseCapabilitiesResponse(ExerciseCapabilities(proto.capabilities))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseInfoResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseInfoResponse.kt
index 7a44767..cd53fe3 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseInfoResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseInfoResponse.kt
@@ -16,35 +16,28 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.ExerciseInfo
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing [ExerciseInfo] when changed.
  *
  * @hide
  */
-public data class ExerciseInfoResponse(val exerciseInfo: ExerciseInfo) : Parcelable {
-    override fun describeContents(): Int = 0
+public class ExerciseInfoResponse(public val exerciseInfo: ExerciseInfo) :
+    ProtoParcelable<ResponsesProto.ExerciseInfoResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(exerciseInfo, flags)
+    override val proto: ResponsesProto.ExerciseInfoResponse by lazy {
+        ResponsesProto.ExerciseInfoResponse.newBuilder().setExerciseInfo(exerciseInfo.proto).build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseInfoResponse> =
-            object : Parcelable.Creator<ExerciseInfoResponse> {
-                override fun createFromParcel(source: Parcel): ExerciseInfoResponse? {
-                    val parcelable: ExerciseInfo =
-                        source.readParcelable(ExerciseInfo::class.java.classLoader) ?: return null
-                    return ExerciseInfoResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<ExerciseInfoResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseInfoResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.ExerciseInfoResponse.parseFrom(bytes)
+            ExerciseInfoResponse(ExerciseInfo(proto.exerciseInfo))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseLapSummaryResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseLapSummaryResponse.kt
index 769346d..9729855 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseLapSummaryResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseLapSummaryResponse.kt
@@ -16,39 +16,30 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.ExerciseLapSummary
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing [ExerciseLapSummary] when it's updated.
  *
  * @hide
  */
-public data class ExerciseLapSummaryResponse(val exerciseLapSummary: ExerciseLapSummary) :
-    Parcelable {
-    override fun describeContents(): Int = 0
+public class ExerciseLapSummaryResponse(public val exerciseLapSummary: ExerciseLapSummary) :
+    ProtoParcelable<ResponsesProto.ExerciseLapSummaryResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(exerciseLapSummary, flags)
+    override val proto: ResponsesProto.ExerciseLapSummaryResponse by lazy {
+        ResponsesProto.ExerciseLapSummaryResponse.newBuilder()
+            .setLapSummary(exerciseLapSummary.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseLapSummaryResponse> =
-            object : Parcelable.Creator<ExerciseLapSummaryResponse> {
-                override fun createFromParcel(source: Parcel): ExerciseLapSummaryResponse? {
-                    val parcelable =
-                        source.readParcelable<ExerciseLapSummary>(
-                            ExerciseLapSummary::class.java.classLoader
-                        )
-                            ?: return null
-                    return ExerciseLapSummaryResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<ExerciseLapSummaryResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseLapSummaryResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.ExerciseLapSummaryResponse.parseFrom(bytes)
+            ExerciseLapSummaryResponse(ExerciseLapSummary(proto.lapSummary))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseUpdateResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseUpdateResponse.kt
index 6c800d4..5b7eb19 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseUpdateResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/ExerciseUpdateResponse.kt
@@ -16,38 +16,30 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.ExerciseUpdate
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing [ExerciseUpdate] when it's updated.
  *
  * @hide
  */
-public data class ExerciseUpdateResponse(val exerciseUpdate: ExerciseUpdate) : Parcelable {
-    override fun describeContents(): Int = 0
+public class ExerciseUpdateResponse(public val exerciseUpdate: ExerciseUpdate) :
+    ProtoParcelable<ResponsesProto.ExerciseUpdateResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(exerciseUpdate, flags)
+    override val proto: ResponsesProto.ExerciseUpdateResponse by lazy {
+        ResponsesProto.ExerciseUpdateResponse.newBuilder()
+            .setExerciseUpdate(exerciseUpdate.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<ExerciseUpdateResponse> =
-            object : Parcelable.Creator<ExerciseUpdateResponse> {
-                override fun createFromParcel(source: Parcel): ExerciseUpdateResponse? {
-                    val parcelable =
-                        source.readParcelable<ExerciseUpdate>(
-                            ExerciseUpdate::class.java.classLoader
-                        )
-                            ?: return null
-                    return ExerciseUpdateResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<ExerciseUpdateResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<ExerciseUpdateResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.ExerciseUpdateResponse.parseFrom(bytes)
+            ExerciseUpdateResponse(ExerciseUpdate(proto.exerciseUpdate))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/MeasureCapabilitiesResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/MeasureCapabilitiesResponse.kt
index fbfa9a5..01b8be4 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/MeasureCapabilitiesResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/MeasureCapabilitiesResponse.kt
@@ -16,41 +16,32 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.MeasureCapabilities
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing the [MeasureCapabilities] of the device.
  *
  * @hide
  */
-public data class MeasureCapabilitiesResponse(
+public class MeasureCapabilitiesResponse(
     /** [MeasureCapabilities] supported by this device. */
-    val measureCapabilities: MeasureCapabilities,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val measureCapabilities: MeasureCapabilities,
+) : ProtoParcelable<ResponsesProto.MeasureCapabilitiesResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(measureCapabilities, flags)
+    override val proto: ResponsesProto.MeasureCapabilitiesResponse by lazy {
+        ResponsesProto.MeasureCapabilitiesResponse.newBuilder()
+            .setCapabilities(measureCapabilities.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
-        public val CREATOR: Parcelable.Creator<MeasureCapabilitiesResponse> =
-            object : Parcelable.Creator<MeasureCapabilitiesResponse> {
-                override fun createFromParcel(source: Parcel): MeasureCapabilitiesResponse? {
-                    val parcelable =
-                        source.readParcelable<MeasureCapabilities>(
-                            MeasureCapabilities::class.java.classLoader
-                        )
-                            ?: return null
-                    return MeasureCapabilitiesResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<MeasureCapabilitiesResponse?> {
-                    return arrayOfNulls(size)
-                }
-            }
+        public val CREATOR: Parcelable.Creator<MeasureCapabilitiesResponse> = newCreator { bytes ->
+            val proto = ResponsesProto.MeasureCapabilitiesResponse.parseFrom(bytes)
+            MeasureCapabilitiesResponse(MeasureCapabilities(proto.capabilities))
+        }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringCapabilitiesResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringCapabilitiesResponse.kt
index b641b10..d3491d1 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringCapabilitiesResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringCapabilitiesResponse.kt
@@ -16,43 +16,35 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.PassiveMonitoringCapabilities
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing the [PassiveMonitoringCapabilities] of the device.
  *
  * @hide
  */
-public data class PassiveMonitoringCapabilitiesResponse(
+public class PassiveMonitoringCapabilitiesResponse(
     /** [PassiveMonitoringCapabilities] supported by this device. */
-    val passiveMonitoringCapabilities: PassiveMonitoringCapabilities,
-) : Parcelable {
-    override fun describeContents(): Int = 0
+    public val passiveMonitoringCapabilities: PassiveMonitoringCapabilities,
+) : ProtoParcelable<ResponsesProto.PassiveMonitoringCapabilitiesResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(passiveMonitoringCapabilities, flags)
+    override val proto: ResponsesProto.PassiveMonitoringCapabilitiesResponse by lazy {
+        ResponsesProto.PassiveMonitoringCapabilitiesResponse.newBuilder()
+            .setCapabilities(passiveMonitoringCapabilities.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
         public val CREATOR: Parcelable.Creator<PassiveMonitoringCapabilitiesResponse> =
-            object : Parcelable.Creator<PassiveMonitoringCapabilitiesResponse> {
-                override fun createFromParcel(
-                    source: Parcel
-                ): PassiveMonitoringCapabilitiesResponse? {
-                    val parcelable =
-                        source.readParcelable<PassiveMonitoringCapabilities>(
-                            PassiveMonitoringCapabilities::class.java.classLoader
-                        )
-                            ?: return null
-                    return PassiveMonitoringCapabilitiesResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<PassiveMonitoringCapabilitiesResponse?> {
-                    return arrayOfNulls(size)
-                }
+            newCreator { bytes ->
+                val proto = ResponsesProto.PassiveMonitoringCapabilitiesResponse.parseFrom(bytes)
+                PassiveMonitoringCapabilitiesResponse(
+                    PassiveMonitoringCapabilities(proto.capabilities)
+                )
             }
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringUpdateResponse.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringUpdateResponse.kt
index aa7c9ff..99fc3fc 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringUpdateResponse.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/response/PassiveMonitoringUpdateResponse.kt
@@ -16,40 +16,37 @@
 
 package androidx.health.services.client.impl.response
 
-import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.services.client.data.PassiveMonitoringUpdate
+import androidx.health.services.client.data.ProtoParcelable
+import androidx.health.services.client.proto.ResponsesProto
 
 /**
  * Response containing [PassiveMonitoringUpdate].
  *
  * @hide
  */
-public data class PassiveMonitoringUpdateResponse(
-    val passiveMonitoringUpdate: PassiveMonitoringUpdate
-) : Parcelable {
-    override fun describeContents(): Int = 0
+public class PassiveMonitoringUpdateResponse(
+    public val passiveMonitoringUpdate: PassiveMonitoringUpdate
+) : ProtoParcelable<ResponsesProto.PassiveMonitoringUpdateResponse>() {
 
-    override fun writeToParcel(dest: Parcel, flags: Int) {
-        dest.writeParcelable(passiveMonitoringUpdate, flags)
+    /** @hide */
+    public constructor(
+        proto: ResponsesProto.PassiveMonitoringUpdateResponse
+    ) : this(PassiveMonitoringUpdate(proto.update))
+
+    override val proto: ResponsesProto.PassiveMonitoringUpdateResponse by lazy {
+        ResponsesProto.PassiveMonitoringUpdateResponse.newBuilder()
+            .setUpdate(passiveMonitoringUpdate.proto)
+            .build()
     }
 
     public companion object {
         @JvmField
         public val CREATOR: Parcelable.Creator<PassiveMonitoringUpdateResponse> =
-            object : Parcelable.Creator<PassiveMonitoringUpdateResponse> {
-                override fun createFromParcel(source: Parcel): PassiveMonitoringUpdateResponse? {
-                    val parcelable =
-                        source.readParcelable<PassiveMonitoringUpdate>(
-                            PassiveMonitoringUpdate::class.java.classLoader
-                        )
-                            ?: return null
-                    return PassiveMonitoringUpdateResponse(parcelable)
-                }
-
-                override fun newArray(size: Int): Array<PassiveMonitoringUpdateResponse?> {
-                    return arrayOfNulls(size)
-                }
+            newCreator { bytes ->
+                val proto = ResponsesProto.PassiveMonitoringUpdateResponse.parseFrom(bytes)
+                PassiveMonitoringUpdateResponse(proto)
             }
     }
 }
diff --git a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseCapabilitiesResponse.aidl b/health/health-services-client/src/main/java/androidx/health/services/client/proto/package-info.java
similarity index 82%
rename from health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseCapabilitiesResponse.aidl
rename to health/health-services-client/src/main/java/androidx/health/services/client/proto/package-info.java
index 2641359..a8ec8f6 100644
--- a/health/health-services-client/src/main/aidl/androidx/health/services/client/impl/response/AutoExerciseCapabilitiesResponse.aidl
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/proto/package-info.java
@@ -14,7 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.health.services.client.impl.response;
-
 /** @hide */
-parcelable AutoExerciseCapabilitiesResponse;
\ No newline at end of file
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+package androidx.health.services.client.proto;
+
+import androidx.annotation.RestrictTo;
diff --git a/health/health-services-client/src/main/proto/data.proto b/health/health-services-client/src/main/proto/data.proto
new file mode 100644
index 0000000..1dd66b2
--- /dev/null
+++ b/health/health-services-client/src/main/proto/data.proto
@@ -0,0 +1,537 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+syntax = "proto2";
+
+package androidx.health.services.client.proto;
+
+option java_package = "androidx.health.services.client.proto";
+option java_outer_classname = "DataProto";
+
+message AchievedExerciseGoal {
+  optional ExerciseGoal exercise_goal = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message AggregateDataPoint {
+  message CumulativeDataPoint {
+    optional int64 start_time_epoch_ms = 1;
+    optional int64 end_time_epoch_ms = 2;
+    optional DataType data_type = 3;
+    optional Value total = 4;
+    reserved 5 to max;  // Next ID
+  }
+
+  message StatisticalDataPoint {
+    optional int64 start_time_epoch_ms = 1;
+    optional int64 end_time_epoch_ms = 2;
+    optional DataType data_type = 4;
+    optional Value min_value = 5;
+    optional Value max_value = 6;
+    optional Value avg_value = 7;
+    reserved 8 to max;  // Next ID
+  }
+
+  oneof aggregate {
+    CumulativeDataPoint cumulative_data_point = 1;
+    StatisticalDataPoint statistical_data_point = 2;
+  }
+}
+
+message AutoExerciseCapabilities {
+  message SupportedExercisesEntry {
+    optional ExerciseType exercise_type = 1;
+    repeated DataType data_types = 2;
+    reserved 3 to max;  // Next ID
+  }
+  repeated SupportedExercisesEntry supported_exercises = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message AutoExerciseConfig {
+  repeated ExerciseType exercises_to_detect = 1;
+  optional Bundle exercise_params = 2;
+  reserved 3 to max;  // Next ID
+}
+
+enum AutoExerciseDetectionDisabledReason {
+  AUTO_EXERCISE_DETECTION_DISABLED_REASON_UNKNOWN = 0;
+  AUTO_EXERCISE_DETECTION_DISABLED_REASON_NOT_APPLICABLE = 1;
+  AUTO_EXERCISE_DETECTION_DISABLED_REASON_NOT_REGISTERED = 2;
+  AUTO_EXERCISE_DETECTION_DISABLED_REASON_IN_ACTIVE_EXERCISE = 3;
+  reserved 4 to max;  // Next ID
+}
+
+message AutoExerciseDetectionState {
+  optional AutoExerciseStatus status = 1;
+  optional AutoExerciseDetectionDisabledReason disabled_reason = 2;
+  optional ExerciseUpdate exercise_update = 3;
+  reserved 4 to max;  // Next ID
+}
+
+enum AutoExerciseStatus {
+  AUTO_EXERCISE_STATUS_UNKNOWN = 0;
+  AUTO_EXERCISE_STATUS_DETECTION_DISABLED = 1;
+  AUTO_EXERCISE_STATUS_DETECTION_ENABLED = 2;
+  AUTO_EXERCISE_STATUS_ONGOING_AUTO_EXERCISE = 3;
+  reserved 4 to max;  // Next ID
+}
+
+message Availability {
+  enum DataTypeAvailability {
+    DATA_TYPE_AVAILABILITY_UNKNOWN = 0;
+    DATA_TYPE_AVAILABILITY_AVAILABLE = 1;
+    DATA_TYPE_AVAILABILITY_ACQUIRING = 2;
+    DATA_TYPE_AVAILABILITY_UNAVAILABLE = 3;
+    reserved 4 to max;  // Next ID
+  }
+
+  enum LocationAvailability {
+    LOCATION_AVAILABILITY_UNKNOWN = 0;
+    LOCATION_AVAILABILITY_UNAVAILABLE = 1;
+    LOCATION_AVAILABILITY_NO_GPS = 2;
+    LOCATION_AVAILABILITY_ACQUIRING = 3;
+    LOCATION_AVAILABILITY_ACQUIRED_TETHERED = 4;
+    LOCATION_AVAILABILITY_ACQUIRED_UNTETHERED = 5;
+    reserved 6 to max;  // Next ID
+  }
+
+  oneof availability {
+    DataTypeAvailability data_type_availability = 1;
+    LocationAvailability location_availability = 2;
+  }
+
+  reserved 3 to max;  // Next ID
+}
+
+// Represents an Android Bundle.
+message Bundle {
+  map<string, bool> bools = 1;
+  map<string, string> strings = 2;
+  map<string, int32> ints = 3;
+  map<string, int64> longs = 4;
+  map<string, float> floats = 5;
+  map<string, double> doubles = 6;
+  map<string, int32> bytes = 7;
+  map<string, bytes> byte_arrays = 8;
+  map<string, Bundle> bundles = 9;
+  reserved 10 to max;  // Next ID
+}
+
+enum ComparisonType {
+  COMPARISON_TYPE_UNKNOWN = 0;
+  COMPARISON_TYPE_GREATER_THAN = 1;
+  COMPARISON_TYPE_GREATER_THAN_OR_EQUAL = 2;
+  COMPARISON_TYPE_LESS_THAN = 3;
+  COMPARISON_TYPE_LESS_THAN_OR_EQUAL = 4;
+  reserved 5 to max;  // Next ID
+}
+
+message DataPoint {
+  optional DataType data_type = 1;
+  optional Value value = 2;
+  optional int64 start_duration_from_boot_ms = 3;
+  optional int64 end_duration_from_boot_ms = 4;
+  optional Bundle meta_data = 5;
+  optional DataPointAccuracy accuracy = 6;
+  reserved 7 to max;  // Next ID
+}
+
+message DataPointAccuracy {
+  message HrAccuracy {
+    enum SensorStatus {
+      HR_ACCURACY_SENSOR_STATUS_UNKNOWN = 0;
+      HR_ACCURACY_SENSOR_STATUS_NO_CONTACT = 1;
+      HR_ACCURACY_SENSOR_STATUS_UNRELIABLE = 2;
+      HR_ACCURACY_SENSOR_STATUS_ACCURACY_LOW = 3;
+      HR_ACCURACY_SENSOR_STATUS_ACCURACY_MEDIUM = 4;
+      HR_ACCURACY_SENSOR_STATUS_ACCURACY_HIGH = 5;
+      reserved 6 to max;  // Next ID
+    }
+
+    optional SensorStatus sensor_status = 1;
+    reserved 2 to max;  // Next ID
+  }
+
+  message LocationAccuracy {
+    optional double horizontal_position_error = 1;
+    reserved 2 to max;  // Next ID
+  }
+
+  oneof accuracy {
+    HrAccuracy hr_accuracy = 1;
+    LocationAccuracy location_accuracy = 2;
+  }
+}
+
+message DataType {
+  enum TimeType {
+    TIME_TYPE_UNKNOWN = 0;
+    TIME_TYPE_INTERVAL = 1;
+    TIME_TYPE_SAMPLE = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  optional string name = 1;
+  optional TimeType time_type = 2;
+  optional int32 format = 3;
+  reserved 4 to max;  // Next ID
+}
+
+message DataTypeCondition {
+  optional DataType data_type = 1;
+  optional Value threshold = 2;
+  optional ComparisonType comparison_type = 3;
+  reserved 4 to max;  // Next ID
+}
+
+message ExerciseCapabilities {
+  message TypeToCapabilitiesEntry {
+    optional ExerciseType type = 1;
+    optional ExerciseTypeCapabilities capabilities = 2;
+    reserved 3 to max;  // Next ID
+  }
+  repeated TypeToCapabilitiesEntry type_to_capabilities = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message ExerciseConfig {
+  optional ExerciseType exercise_type = 1;
+  repeated DataType data_types = 2;
+  repeated DataType aggregate_data_types = 3;
+  optional bool is_auto_pause_and_resume_enabled = 4;
+  optional bool is_gps_usage_enabled = 5;
+  repeated ExerciseGoal exercise_goals = 6;
+  optional Bundle exercise_params = 7;
+  reserved 8 to max;  // Next ID
+}
+
+message ExerciseInfo {
+  optional ExerciseTrackedStatus exercise_tracked_status = 1;
+  optional ExerciseType exercise_type = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message ExerciseGoal {
+  optional ExerciseGoalType exercise_goal_type = 1;
+  optional DataTypeCondition data_type_condition = 2;
+  optional Value period = 3;
+  reserved 4 to max;  // Next ID
+}
+
+enum ExerciseGoalType {
+  EXERCISE_GOAL_TYPE_UNKNOWN = 0;
+  EXERCISE_GOAL_TYPE_ONE_TIME = 1;
+  EXERCISE_GOAL_TYPE_MILESTONE = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message ExerciseLapSummary {
+  message LapMetricsEntry {
+    optional DataType data_type = 1;
+    optional AggregateDataPoint aggregate_data_point = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  optional int32 lap_count = 1;
+  optional int64 start_time_epoch_ms = 2;
+  optional int64 end_time_epoch_ms = 3;
+  optional int64 active_duration_ms = 4;
+  repeated LapMetricsEntry lap_metrics = 5;
+  reserved 6 to max;  // Next ID
+}
+
+enum ExerciseState {
+  EXERCISE_STATE_UNKNOWN = 0;
+  EXERCISE_STATE_PREPARING = 15;
+  EXERCISE_STATE_USER_STARTING = 1;
+  EXERCISE_STATE_ACTIVE = 2;
+  EXERCISE_STATE_USER_PAUSING = 3;
+  EXERCISE_STATE_USER_PAUSED = 4;
+  EXERCISE_STATE_AUTO_PAUSING = 5;
+  EXERCISE_STATE_AUTO_PAUSED = 6;
+  EXERCISE_STATE_USER_RESUMING = 7;
+  EXERCISE_STATE_AUTO_RESUMING = 8;
+  EXERCISE_STATE_USER_ENDING = 9;
+  EXERCISE_STATE_USER_ENDED = 10;
+  EXERCISE_STATE_AUTO_ENDING = 11;
+  EXERCISE_STATE_AUTO_ENDED = 12;
+  EXERCISE_STATE_AUTO_ENDING_PERMISSION_LOST = 16;
+  EXERCISE_STATE_AUTO_ENDED_PERMISSION_LOST = 17;
+  EXERCISE_STATE_TERMINATING = 13;
+  EXERCISE_STATE_TERMINATED = 14;
+  reserved 18 to max;  // Next ID
+}
+
+enum ExerciseTrackedStatus {
+  EXERCISE_TRACKED_STATUS_UNKNOWN = 0;
+  EXERCISE_TRACKED_STATUS_OTHER_APP_IN_PROGRESS = 1;
+  EXERCISE_TRACKED_STATUS_OWNED_EXERCISE_IN_PROGRESS = 2;
+  EXERCISE_TRACKED_STATUS_NO_EXERCISE_IN_PROGRESS = 3;
+  reserved 4 to max;  // Next ID
+}
+
+enum ExerciseType {
+  EXERCISE_TYPE_UNKNOWN = 0;
+  EXERCISE_TYPE_BACK_EXTENSION = 1;
+  EXERCISE_TYPE_BADMINTON = 2;
+  EXERCISE_TYPE_BARBELL_SHOULDER_PRESS = 3;
+  EXERCISE_TYPE_BASEBALL = 4;
+  EXERCISE_TYPE_BASKETBALL = 5;
+  EXERCISE_TYPE_BENCH_PRESS = 6;
+  EXERCISE_TYPE_BENCH_SIT_UP = 7;
+  EXERCISE_TYPE_BIKING = 8;
+  EXERCISE_TYPE_BIKING_STATIONARY = 9;
+  EXERCISE_TYPE_BOOT_CAMP = 10;
+  EXERCISE_TYPE_BOXING = 11;
+  EXERCISE_TYPE_BURPEE = 12;
+  EXERCISE_TYPE_CALISTHENICS = 13;
+  EXERCISE_TYPE_CRICKET = 14;
+  EXERCISE_TYPE_CRUNCH = 15;
+  EXERCISE_TYPE_DANCING = 16;
+  EXERCISE_TYPE_DEADLIFT = 17;
+  EXERCISE_TYPE_DUMBBELL_CURL_RIGHT_ARM = 18;
+  EXERCISE_TYPE_DUMBBELL_CURL_LEFT_ARM = 19;
+  EXERCISE_TYPE_DUMBBELL_FRONT_RAISE = 20;
+  EXERCISE_TYPE_DUMBBELL_LATERAL_RAISE = 21;
+  EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_LEFT_ARM = 22;
+  EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_RIGHT_ARM = 23;
+  EXERCISE_TYPE_DUMBBELL_TRICEPS_EXTENSION_TWO_ARM = 24;
+  EXERCISE_TYPE_ELLIPTICAL = 25;
+  EXERCISE_TYPE_EXERCISE_CLASS = 26;
+  EXERCISE_TYPE_FENCING = 27;
+  EXERCISE_TYPE_FRISBEE_DISC = 28;
+  EXERCISE_TYPE_FOOTBALL_AMERICAN = 29;
+  EXERCISE_TYPE_FOOTBALL_AUSTRALIAN = 30;
+  EXERCISE_TYPE_FORWARD_TWIST = 31;
+  EXERCISE_TYPE_GOLF = 32;
+  EXERCISE_TYPE_GUIDED_BREATHING = 33;
+  EXERCISE_TYPE_GYMNASTICS = 34;
+  EXERCISE_TYPE_HANDBALL = 35;
+  EXERCISE_TYPE_HIGH_INTENSITY_INTERVAL_TRAINING = 36;
+  EXERCISE_TYPE_HIKING = 37;
+  EXERCISE_TYPE_ICE_HOCKEY = 38;
+  EXERCISE_TYPE_ICE_SKATING = 39;
+  EXERCISE_TYPE_JUMP_ROPE = 40;
+  EXERCISE_TYPE_JUMPING_JACK = 41;
+  EXERCISE_TYPE_LAT_PULL_DOWN = 42;
+  EXERCISE_TYPE_LUNGE = 43;
+  EXERCISE_TYPE_MARTIAL_ARTS = 44;
+  EXERCISE_TYPE_MEDITATION = 45;
+  EXERCISE_TYPE_PADDLING = 46;
+  EXERCISE_TYPE_PARA_GLIDING = 47;
+  EXERCISE_TYPE_PILATES = 48;
+  EXERCISE_TYPE_PLANK = 49;
+  EXERCISE_TYPE_RACQUETBALL = 50;
+  EXERCISE_TYPE_ROCK_CLIMBING = 51;
+  EXERCISE_TYPE_ROLLER_HOCKEY = 52;
+  EXERCISE_TYPE_ROWING = 53;
+  EXERCISE_TYPE_ROWING_MACHINE = 54;
+  EXERCISE_TYPE_RUNNING = 55;
+  EXERCISE_TYPE_RUNNING_TREADMILL = 56;
+  EXERCISE_TYPE_RUGBY = 57;
+  EXERCISE_TYPE_SAILING = 58;
+  EXERCISE_TYPE_SCUBA_DIVING = 59;
+  EXERCISE_TYPE_SKATING = 60;
+  EXERCISE_TYPE_SKIING = 61;
+  EXERCISE_TYPE_SNOWBOARDING = 62;
+  EXERCISE_TYPE_SNOWSHOEING = 63;
+  EXERCISE_TYPE_SOCCER = 64;
+  EXERCISE_TYPE_SOFTBALL = 65;
+  EXERCISE_TYPE_SQUASH = 66;
+  EXERCISE_TYPE_SQUAT = 67;
+  EXERCISE_TYPE_STAIR_CLIMBING = 68;
+  EXERCISE_TYPE_STAIR_CLIMBING_MACHINE = 69;
+  EXERCISE_TYPE_STRENGTH_TRAINING = 70;
+  EXERCISE_TYPE_STRETCHING = 71;
+  EXERCISE_TYPE_SURFING = 72;
+  EXERCISE_TYPE_SWIMMING_OPEN_WATER = 73;
+  EXERCISE_TYPE_SWIMMING_POOL = 74;
+  EXERCISE_TYPE_TABLE_TENNIS = 75;
+  EXERCISE_TYPE_TENNIS = 76;
+  EXERCISE_TYPE_UPPER_TWIST = 77;
+  EXERCISE_TYPE_VOLLEYBALL = 78;
+  EXERCISE_TYPE_WALKING = 79;
+  EXERCISE_TYPE_WATER_POLO = 80;
+  EXERCISE_TYPE_WEIGHTLIFTING = 81;
+  EXERCISE_TYPE_WORKOUT = 82;
+  EXERCISE_TYPE_YOGA = 83;
+  reserved 84 to max;  // Next ID
+}
+
+message ExerciseTypeCapabilities {
+  message SupportedGoalEntry {
+    optional DataType data_type = 1;
+    repeated ComparisonType comparison_types = 2;
+    reserved 3 to max;  // Next ID
+  }
+  message SupportedMilestoneEntry {
+    optional DataType data_type = 1;
+    repeated ComparisonType comparison_types = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  repeated DataType supported_data_types = 1;
+  repeated SupportedGoalEntry supported_goals = 2;
+  repeated SupportedMilestoneEntry supported_milestones = 3;
+  optional bool is_auto_pause_and_resume_supported = 4;
+  optional bool is_laps_supported = 5;
+  reserved 6 to max;  // Next ID
+}
+
+message ExerciseUpdate {
+  message LatestMetricsEntry {
+    optional DataType data_type = 1;
+    repeated DataPoint data_points = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  optional ExerciseState state = 1;
+  optional int64 start_time_epoch_ms = 2;
+  optional int64 active_duration_ms = 3;
+  repeated LatestMetricsEntry latest_metrics = 4;
+  repeated AggregateDataPoint latest_aggregate_metrics = 8;
+  repeated AchievedExerciseGoal latest_achieved_goals = 5;
+  repeated MilestoneMarkerSummary mile_stone_marker_summaries = 6;
+  optional ExerciseConfig exercise_config = 7;
+
+  reserved 9 to max;  // Next ID
+}
+
+message HealthEvent {
+  enum HealthEventType {
+    HEALTH_EVENT_TYPE_UNKNOWN = 0;
+    HEALTH_EVENT_TYPE_LOW_HR_DETECTED = 1;
+    HEALTH_EVENT_TYPE_ELEVATED_HR_DETECTED = 2;
+    HEALTH_EVENT_TYPE_FALL_DETECTED = 3;
+    reserved 4 to max;  // Next ID
+  }
+
+  message MetricsEntry {
+    optional DataType data_type = 1;
+    repeated DataPoint data_points = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  optional HealthEventType type = 1;
+  optional int64 event_time_epoch_ms = 2;
+  repeated MetricsEntry metrics = 3;
+  reserved 4 to max;  // Next ID
+}
+
+message HeartRateAlertParams {
+  enum HeartRateAlertType {
+    HEART_RATE_ALERT_TYPE_UNKNOWN = 0;
+    HEART_RATE_ALERT_TYPE_LOW = 1;
+    HEART_RATE_ALERT_TYPE_ELEVATED = 2;
+    reserved 3 to max;  // Next ID
+  }
+  optional HeartRateAlertType type = 1;
+  optional int64 duration_ms = 2;
+  optional int32 threshold_bpm = 3;
+  reserved 4 to max;  // Next ID
+}
+
+message MeasureCapabilities {
+  repeated DataType supported_data_types = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message MilestoneMarkerSummary {
+  message SummaryMetricsEntry {
+    optional DataType data_type = 1;
+    optional AggregateDataPoint aggregate_data_point = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  optional int64 start_time_epoch_ms = 1;
+  optional int64 end_time_epoch_ms = 2;
+  optional int64 active_duration_ms = 3;
+  optional AchievedExerciseGoal achieved_goal = 4;
+  repeated SummaryMetricsEntry summary_metrics = 5;
+  reserved 6 to max;  // Next ID
+}
+
+message WarmUpConfig {
+  optional ExerciseType exercise_type = 1;
+  repeated DataType data_types = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message PassiveGoal {
+  enum TriggerType {
+    TRIGGER_TYPE_UNKNOWN = 0;
+    TRIGGER_TYPE_ONCE = 1;
+    TRIGGER_TYPE_REPEATED = 2;
+    reserved 3 to max;  // Next ID
+  }
+
+  optional DataTypeCondition condition = 1;
+  optional TriggerType trigger_type = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message PassiveMonitoringCapabilities {
+  repeated DataType supported_data_types_passive_monitoring = 1;
+  repeated DataType supported_data_types_events = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message PassiveMonitoringConfig {
+  repeated DataType data_types = 1;
+  optional string package_name = 2;
+  optional string receiver_class_name = 3;
+  optional bool include_user_activity_state = 4;
+  reserved 5 to max;  // Next ID
+}
+
+message PassiveMonitoringUpdate {
+  repeated DataPoint data_points = 1;
+  repeated UserActivityInfo user_activity_info_updates = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message UserActivityInfo {
+  optional UserActivityState state = 1;
+  optional ExerciseInfo exercise_info = 2;
+  optional int64 state_change_time_epoch_ms = 3;
+  reserved 4 to max;  // Next ID
+}
+
+enum UserActivityState {
+  USER_ACTIVITY_STATE_UNKNOWN = 0;
+  USER_ACTIVITY_STATE_EXERCISE = 1;
+  USER_ACTIVITY_STATE_PASSIVE = 2;
+  USER_ACTIVITY_STATE_ASLEEP = 3;
+  reserved 4 to max;  // Next ID
+}
+
+// Holds a single value of a particular type.
+message Value {
+  // Contains an array of doubles. This is needed because we cannot have
+  // repeated fields in a oneof.
+  message DoubleArray {
+    repeated double double_array = 1;
+    reserved 2 to max;  // Should never need another field.
+  }
+  oneof value {
+    bool bool_val = 1;
+    int64 long_val = 2;
+    double double_val = 3;
+    DoubleArray double_array_val = 4;
+  }
+  reserved 5 to max;  // Next ID
+}
diff --git a/health/health-services-client/src/main/proto/events.proto b/health/health-services-client/src/main/proto/events.proto
new file mode 100644
index 0000000..4fb54d6
--- /dev/null
+++ b/health/health-services-client/src/main/proto/events.proto
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+syntax = "proto2";
+
+package androidx.health.services.client.proto;
+
+import "responses.proto";
+
+option java_package = "androidx.health.services.client.proto";
+option java_outer_classname = "EventsProto";
+
+message ExerciseUpdateListenerEvent {
+  oneof event {
+    ExerciseUpdateResponse exercise_update_response = 1;
+    ExerciseLapSummaryResponse lap_summary_response = 2;
+    AvailabilityResponse availability_response = 3;
+  }
+  reserved 4 to max;  // Next ID
+}
+
+message MeasureCallbackEvent {
+  oneof event {
+    DataPointsResponse data_point_response = 1;
+    AvailabilityResponse availability_response = 2;
+  }
+  reserved 3 to max;  // Next ID
+}
+
+message PassiveCallbackEvent {
+  oneof event {
+    PassiveMonitoringUpdateResponse passive_update_response = 1;
+  }
+
+  reserved 2 to max;  // Next ID
+}
\ No newline at end of file
diff --git a/health/health-services-client/src/main/proto/requests.proto b/health/health-services-client/src/main/proto/requests.proto
new file mode 100644
index 0000000..ace7978
--- /dev/null
+++ b/health/health-services-client/src/main/proto/requests.proto
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+syntax = "proto2";
+
+package androidx.health.services.client.proto;
+
+import "data.proto";
+
+option java_package = "androidx.health.services.client.proto";
+option java_outer_classname = "RequestsProto";
+
+// Request for enabling/disabling auto pause/resume.
+message AutoPauseAndResumeConfigRequest {
+  optional string package_name = 1;
+  optional bool should_enable = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message BackgroundRegistrationRequest {
+  optional PassiveMonitoringConfig config = 1;
+  reserved 2 to max;  // Next ID
+}
+
+// Request for capabilities.
+message CapabilitiesRequest {
+  optional string package_name = 1;
+  reserved 2 to max;  // Next ID
+}
+
+// Request for enabling/disabling continuous heart rate monitoring.
+message ContinuousHeartRateMonitoringRequest {
+  optional string package_name = 1;
+  optional bool should_enable = 2;
+  reserved 3 to max;  // Next ID
+}
+
+// Request to flush data metrics.
+message FlushRequest {
+  optional string package_name = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message HealthEventsRegistrationRequest {
+  optional string package_name = 1;
+  optional string receiver_class_name = 2;
+  repeated HealthEvent.HealthEventType event_types = 3;
+  reserved 4 to max;  // Next ID
+}
+
+// Request to unregister for health event updates.
+message HealthEventsUnregistrationRequest {
+  optional string package_name = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message HeartRateAlertParamsRequest {
+  optional string package_name = 1;
+  optional HeartRateAlertParams.HeartRateAlertType alert_type = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message MeasureRegistrationRequest {
+  optional string package_name = 1;
+  optional DataType data_type = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message MeasureUnregistrationRequest {
+  optional string package_name = 1;
+  optional DataType data_type = 2;
+  reserved 3 to max;  // Next ID
+}
+
+// Request for passive unregistration.
+message PassiveGoalRequest {
+  optional string package_name = 1;
+  optional string receiver_class_name = 2;
+  optional PassiveGoal passive_goal = 3;
+  reserved 4 to max;  // Next ID
+}
+
+// Request for passive unregistration.
+message PassiveMonitoringUnregistrationRequest {
+  optional string package_name = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message PrepareExerciseRequest {
+  optional string package_name = 1;
+  optional WarmUpConfig config = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message RegisterForAutoExerciseRequest {
+  optional string package_name = 1;
+  optional AutoExerciseConfig config = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message StartExerciseRequest {
+  optional string package_name = 1;
+  optional ExerciseConfig config = 2;
+  reserved 3 to max;  // Next ID
+}
+
+// Request to unregister for automatic exercise detection updates.
+message UnregisterFromAutoExerciseRequest {
+  optional string package_name = 1;
+  reserved 2 to max;  // Next ID
+}
diff --git a/health/health-services-client/src/main/proto/responses.proto b/health/health-services-client/src/main/proto/responses.proto
new file mode 100644
index 0000000..c42d449
--- /dev/null
+++ b/health/health-services-client/src/main/proto/responses.proto
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+syntax = "proto2";
+
+package androidx.health.services.client.proto;
+
+import "data.proto";
+
+option java_package = "androidx.health.services.client.proto";
+option java_outer_classname = "ResponsesProto";
+
+message AutoExerciseCapabilitiesResponse {
+  optional AutoExerciseCapabilities capabilities = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message AutoExerciseDetectionStateResponse {
+  optional AutoExerciseDetectionState state = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message AvailabilityResponse {
+  optional DataType data_type = 1;
+  optional Availability availability = 2;
+  reserved 3 to max;  // Next ID
+}
+
+message DataPointsResponse {
+  repeated DataPoint data_points = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message ExerciseCapabilitiesResponse {
+  optional ExerciseCapabilities capabilities = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message ExerciseInfoResponse {
+  optional ExerciseInfo exercise_info = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message ExerciseLapSummaryResponse {
+  optional ExerciseLapSummary lap_summary = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message ExerciseUpdateResponse {
+  optional ExerciseUpdate exercise_update = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message HeartRateAlertParamsResponse {
+  optional HeartRateAlertParams params = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message MeasureCapabilitiesResponse {
+  optional MeasureCapabilities capabilities = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message PassiveMonitoringCapabilitiesResponse {
+  optional PassiveMonitoringCapabilities capabilities = 1;
+  reserved 2 to max;  // Next ID
+}
+
+message PassiveMonitoringUpdateResponse {
+  optional PassiveMonitoringUpdate update = 1;
+  reserved 2 to max;  // Next ID
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index 758d728..358f9e5 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -737,6 +737,10 @@
       "to": "ignore"
     },
     {
+      "from": "androidx/mediarouter/testing/(.*)",
+      "to": "ignore"
+    },
+    {
       "from": "androidx/loader/app/LoaderManager(.*)",
       "to": "ignore"
     },
diff --git a/leanback/leanback/src/main/res/values-mr/strings.xml b/leanback/leanback/src/main/res/values-mr/strings.xml
index 94c2c5c..17a5a38 100644
--- a/leanback/leanback/src/main/res/values-mr/strings.xml
+++ b/leanback/leanback/src/main/res/values-mr/strings.xml
@@ -19,7 +19,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"नेव्हिगेशन मेनू"</string>
     <string name="orb_search_action" msgid="1301877238242752863">"शोध क्रिया"</string>
-    <string name="lb_search_bar_hint" msgid="5700349211583074131">"Search"</string>
+    <string name="lb_search_bar_hint" msgid="5700349211583074131">"शोधा"</string>
     <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"शोधण्यासाठी बोला"</string>
     <string name="lb_search_bar_hint_with_title" msgid="4826526877249029043">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> शोधा"</string>
     <string name="lb_search_bar_hint_with_title_speech" msgid="6032250334706920550">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> शोधण्यासाठी बोला"</string>
diff --git a/media/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java b/media/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
index 49628eb..5a5ff26 100644
--- a/media/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
+++ b/media/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
@@ -349,15 +349,19 @@
         // ensure the data is not lost - this ensures that
         // fromMediaDescription(getMediaDescription(mediaDescriptionCompat)) returns
         // an equivalent MediaDescriptionCompat on all API levels
-        Bundle extras = mExtras;
         if (Build.VERSION.SDK_INT < 23 && mMediaUri != null) {
-            if (extras == null) {
+            Bundle extras;
+            if (mExtras == null) {
                 extras = new Bundle();
                 extras.putBoolean(DESCRIPTION_KEY_NULL_BUNDLE_FLAG, true);
+            } else {
+                extras = new Bundle(mExtras);
             }
             extras.putParcelable(DESCRIPTION_KEY_MEDIA_URI, mMediaUri);
+            Api21Impl.setExtras(bob, extras);
+        } else {
+            Api21Impl.setExtras(bob, mExtras);
         }
-        Api21Impl.setExtras(bob, extras);
         if (Build.VERSION.SDK_INT >= 23) {
             Api23Impl.setMediaUri(bob, mMediaUri);
         }
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaDescriptionCompatTest.java b/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaDescriptionCompatTest.java
new file mode 100644
index 0000000..90b9ca8
--- /dev/null
+++ b/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaDescriptionCompatTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 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 android.support.mediacompat.client;
+
+import static android.support.mediacompat.testlib.util.TestUtil.assertBundleEquals;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.media.MediaDescriptionCompat;
+
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/** Tests for {@link MediaDescriptionCompat}. */
+@SmallTest
+public class MediaDescriptionCompatTest {
+
+    @SdkSuppress(minSdkVersion = 21)
+    @Test
+    public void roundTripViaFrameworkObject_returnsEqualMediaUriAndExtras() {
+        Uri mediaUri = Uri.parse("androidx://media/uri");
+        MediaDescriptionCompat originalDescription = new MediaDescriptionCompat.Builder()
+                .setMediaUri(mediaUri)
+                .setExtras(createExtras())
+                .build();
+
+        MediaDescriptionCompat restoredDescription = MediaDescriptionCompat.fromMediaDescription(
+                originalDescription.getMediaDescription());
+
+        assertEquals(mediaUri, restoredDescription.getMediaUri());
+        assertBundleEquals(createExtras(), restoredDescription.getExtras());
+    }
+
+    @SdkSuppress(minSdkVersion = 21)
+    @Test
+    public void getMediaDescription_withMediaUri_doesNotTouchExtras() {
+        MediaDescriptionCompat originalDescription = new MediaDescriptionCompat.Builder()
+                .setMediaUri(Uri.EMPTY)
+                .setExtras(createExtras())
+                .build();
+        originalDescription.getMediaDescription();
+        assertBundleEquals(createExtras(), originalDescription.getExtras());
+    }
+
+    private static Bundle createExtras() {
+        Bundle extras = new Bundle();
+        extras.putString("key1", "value1");
+        extras.putString("key2", "value2");
+        return extras;
+    }
+}
diff --git a/mediarouter/mediarouter-testing/api/current.txt b/mediarouter/mediarouter-testing/api/current.txt
new file mode 100644
index 0000000..14e1df6
--- /dev/null
+++ b/mediarouter/mediarouter-testing/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.mediarouter.testing {
+
+  public class MediaRouterTestHelper {
+    method @MainThread public static void resetMediaRouter();
+  }
+
+}
+
diff --git a/mediarouter/mediarouter-testing/api/public_plus_experimental_current.txt b/mediarouter/mediarouter-testing/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..14e1df6
--- /dev/null
+++ b/mediarouter/mediarouter-testing/api/public_plus_experimental_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.mediarouter.testing {
+
+  public class MediaRouterTestHelper {
+    method @MainThread public static void resetMediaRouter();
+  }
+
+}
+
diff --git a/mediarouter/mediarouter-testing/api/res-current.txt b/mediarouter/mediarouter-testing/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/mediarouter/mediarouter-testing/api/res-current.txt
diff --git a/mediarouter/mediarouter-testing/api/restricted_current.txt b/mediarouter/mediarouter-testing/api/restricted_current.txt
new file mode 100644
index 0000000..14e1df6
--- /dev/null
+++ b/mediarouter/mediarouter-testing/api/restricted_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.mediarouter.testing {
+
+  public class MediaRouterTestHelper {
+    method @MainThread public static void resetMediaRouter();
+  }
+
+}
+
diff --git a/mediarouter/mediarouter-testing/build.gradle b/mediarouter/mediarouter-testing/build.gradle
new file mode 100644
index 0000000..394155f
--- /dev/null
+++ b/mediarouter/mediarouter-testing/build.gradle
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 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.
+ */
+
+import androidx.build.LibraryGroups
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+dependencies {
+    implementation("androidx.annotation:annotation:1.2.0")
+    implementation(project(":mediarouter:mediarouter"))
+}
+
+androidx {
+    name = "AndroidX MediaRouter Testing"
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenGroup = LibraryGroups.MEDIAROUTER
+    inceptionYear = "2021"
+    description = "Test utilities for AndroidX MediaRouter"
+}
+
diff --git a/mediarouter/mediarouter-testing/src/main/AndroidManifest.xml b/mediarouter/mediarouter-testing/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..3e7cf56
--- /dev/null
+++ b/mediarouter/mediarouter-testing/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 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.
+  -->
+<manifest package="androidx.mediarouter.testing"/>
diff --git a/mediarouter/mediarouter-testing/src/main/java/androidx/mediarouter/testing/MediaRouterTestHelper.java b/mediarouter/mediarouter-testing/src/main/java/androidx/mediarouter/testing/MediaRouterTestHelper.java
new file mode 100644
index 0000000..7b93a9f
--- /dev/null
+++ b/mediarouter/mediarouter-testing/src/main/java/androidx/mediarouter/testing/MediaRouterTestHelper.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2021 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.mediarouter.testing;
+
+import android.content.Context;
+
+import androidx.annotation.MainThread;
+import androidx.mediarouter.media.MediaRouter;
+
+/**
+ * A helper class for testing usages of {@link MediaRouter}.
+ */
+public class MediaRouterTestHelper {
+
+    /**
+     * Resets all internal state of {@link MediaRouter} for testing. Should be only used for
+     * testing purpose.
+     * <p>
+     * After calling this method, the caller should stop using the existing media router instances.
+     * Instead, the caller should create a new media router instance again by calling
+     * {@link MediaRouter#getInstance(Context)}.
+     * <p>
+     * Note that the following classes' instances need to be recreated after calling this method,
+     * as these classes store the media router instance on their constructor:
+     * <ul>
+     *     <li>{@link androidx.mediarouter.app.MediaRouteActionProvider}
+     *     <li>{@link androidx.mediarouter.app.MediaRouteButton}
+     *     <li>{@link androidx.mediarouter.app.MediaRouteChooserDialog}
+     *     <li>{@link androidx.mediarouter.app.MediaRouteControllerDialog}
+     *     <li>{@link androidx.mediarouter.app.MediaRouteDiscoveryFragment}
+     * </ul>
+     * Please make sure this is called in the main thread.
+     */
+    @MainThread
+    public static void resetMediaRouter() {
+        MediaRouter.resetGlobalRouter();
+    }
+
+    private MediaRouterTestHelper() {}
+}
diff --git a/mediarouter/mediarouter/api/current.txt b/mediarouter/mediarouter/api/current.txt
index 8a418aa4..eac4d53 100644
--- a/mediarouter/mediarouter/api/current.txt
+++ b/mediarouter/mediarouter/api/current.txt
@@ -354,7 +354,6 @@
     method public void removeCallback(androidx.mediarouter.media.MediaRouter.Callback);
     method public void removeProvider(androidx.mediarouter.media.MediaRouteProvider);
     method public void removeRemoteControlClient(Object);
-    method @MainThread @VisibleForTesting public static void reset();
     method public void selectRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
     method public void setMediaSession(Object?);
     method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat?);
diff --git a/mediarouter/mediarouter/api/public_plus_experimental_current.txt b/mediarouter/mediarouter/api/public_plus_experimental_current.txt
index 8a418aa4..eac4d53 100644
--- a/mediarouter/mediarouter/api/public_plus_experimental_current.txt
+++ b/mediarouter/mediarouter/api/public_plus_experimental_current.txt
@@ -354,7 +354,6 @@
     method public void removeCallback(androidx.mediarouter.media.MediaRouter.Callback);
     method public void removeProvider(androidx.mediarouter.media.MediaRouteProvider);
     method public void removeRemoteControlClient(Object);
-    method @MainThread @VisibleForTesting public static void reset();
     method public void selectRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
     method public void setMediaSession(Object?);
     method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat?);
diff --git a/mediarouter/mediarouter/api/restricted_current.txt b/mediarouter/mediarouter/api/restricted_current.txt
index 8a418aa4..eac4d53 100644
--- a/mediarouter/mediarouter/api/restricted_current.txt
+++ b/mediarouter/mediarouter/api/restricted_current.txt
@@ -354,7 +354,6 @@
     method public void removeCallback(androidx.mediarouter.media.MediaRouter.Callback);
     method public void removeProvider(androidx.mediarouter.media.MediaRouteProvider);
     method public void removeRemoteControlClient(Object);
-    method @MainThread @VisibleForTesting public static void reset();
     method public void selectRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
     method public void setMediaSession(Object?);
     method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat?);
diff --git a/mediarouter/mediarouter/build.gradle b/mediarouter/mediarouter/build.gradle
index f1278e0..835a88f 100644
--- a/mediarouter/mediarouter/build.gradle
+++ b/mediarouter/mediarouter/build.gradle
@@ -38,6 +38,7 @@
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.espressoCore, excludes.espresso)
     androidTestImplementation(project(":media:version-compat-tests:lib"))
+    androidTestImplementation(project(":mediarouter:mediarouter-testing"))
 }
 
 android {
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
index dd77f89..522ae5f 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
@@ -33,6 +33,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
+import androidx.mediarouter.testing.MediaRouterTestHelper;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
@@ -122,7 +123,7 @@
                 mRouter.removeCallback(callback);
             }
             mCallbacks.clear();
-            MediaRouter.reset();
+            MediaRouterTestHelper.resetMediaRouter();
         });
         MediaRouter2TestActivity.finishActivity();
     }
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterTest.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterTest.java
index 9ecd575..9149eb9 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterTest.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterTest.java
@@ -33,6 +33,7 @@
 import android.support.v4.media.session.MediaControllerCompat;
 import android.support.v4.media.session.MediaSessionCompat;
 
+import androidx.mediarouter.testing.MediaRouterTestHelper;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
@@ -88,7 +89,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                MediaRouter.reset();
+                MediaRouterTestHelper.resetMediaRouter();
             }
         });
     }
@@ -277,7 +278,7 @@
         assertNotNull(mRouter);
         assertNotNull(MediaRouter.getGlobalRouter());
 
-        MediaRouter.reset();
+        MediaRouterTestHelper.resetMediaRouter();
         assertNull(MediaRouter.getGlobalRouter());
 
         MediaRouter newInstance = MediaRouter.getInstance(mContext);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
index 88038c2..3bff580 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
@@ -17,6 +17,7 @@
 package androidx.mediarouter.media;
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
 import android.annotation.SuppressLint;
 import android.app.ActivityManager;
@@ -294,7 +295,7 @@
     }
 
     /**
-     * Resets all internal state for testing.
+     * Resets all internal state for testing. Should be only used for testing purpose.
      * <p>
      * After calling this method, the caller should stop using the existing media router instances.
      * Instead, the caller should create a new media router instance again by calling
@@ -310,10 +311,11 @@
      *     <li>{@link androidx.mediarouter.app.MediaRouteDiscoveryFragment}
      * </ul>
      * Please make sure this is called in the main thread.
+     * @hide
      */
     @MainThread
-    @VisibleForTesting
-    public static void reset() {
+    @RestrictTo(LIBRARY_GROUP)
+    public static void resetGlobalRouter() {
         if (sGlobal == null) {
             return;
         }
diff --git a/mediarouter/mediarouter/src/main/res/values-pt-rBR/strings.xml b/mediarouter/mediarouter/src/main/res/values-pt-rBR/strings.xml
index f7c51d5..20c5ae5 100644
--- a/mediarouter/mediarouter/src/main/res/values-pt-rBR/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-pt-rBR/strings.xml
@@ -30,7 +30,7 @@
     <string name="mr_controller_play" msgid="1253345086594430054">"Reproduzir"</string>
     <string name="mr_controller_pause" msgid="747801650871398383">"Pausar"</string>
     <string name="mr_controller_stop" msgid="5497722768305745508">"Parar"</string>
-    <string name="mr_controller_expand_group" msgid="4521419834052044261">"Expandir"</string>
+    <string name="mr_controller_expand_group" msgid="4521419834052044261">"Abrir"</string>
     <string name="mr_controller_collapse_group" msgid="2585048604188129749">"Recolher"</string>
     <string name="mr_controller_album_art" msgid="3330502667672708728">"Arte do álbum"</string>
     <string name="mr_controller_volume_slider" msgid="2955862765169128170">"Controle deslizante de volume"</string>
diff --git a/mediarouter/mediarouter/src/main/res/values-pt/strings.xml b/mediarouter/mediarouter/src/main/res/values-pt/strings.xml
index f7c51d5..20c5ae5 100644
--- a/mediarouter/mediarouter/src/main/res/values-pt/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-pt/strings.xml
@@ -30,7 +30,7 @@
     <string name="mr_controller_play" msgid="1253345086594430054">"Reproduzir"</string>
     <string name="mr_controller_pause" msgid="747801650871398383">"Pausar"</string>
     <string name="mr_controller_stop" msgid="5497722768305745508">"Parar"</string>
-    <string name="mr_controller_expand_group" msgid="4521419834052044261">"Expandir"</string>
+    <string name="mr_controller_expand_group" msgid="4521419834052044261">"Abrir"</string>
     <string name="mr_controller_collapse_group" msgid="2585048604188129749">"Recolher"</string>
     <string name="mr_controller_album_art" msgid="3330502667672708728">"Arte do álbum"</string>
     <string name="mr_controller_volume_slider" msgid="2955862765169128170">"Controle deslizante de volume"</string>
diff --git a/navigation/navigation-common/api/current.txt b/navigation/navigation-common/api/current.txt
index 8c34529..9dea391 100644
--- a/navigation/navigation-common/api/current.txt
+++ b/navigation/navigation-common/api/current.txt
@@ -30,6 +30,19 @@
   public interface FloatingWindow {
   }
 
+  public final class NamedNavArgument {
+    method public operator String component1();
+    method public operator androidx.navigation.NavArgument component2();
+    method public androidx.navigation.NavArgument getArgument();
+    method public String getName();
+    property public final androidx.navigation.NavArgument argument;
+    property public final String name;
+  }
+
+  public final class NamedNavArgumentKt {
+    method @androidx.navigation.NavDestinationDsl public static androidx.navigation.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
+  }
+
   public final class NavAction {
     ctor public NavAction(@IdRes int destinationId, optional androidx.navigation.NavOptions? navOptions, optional android.os.Bundle? defaultArguments);
     ctor public NavAction(@IdRes int destinationId, optional androidx.navigation.NavOptions? navOptions);
diff --git a/navigation/navigation-common/api/public_plus_experimental_current.txt b/navigation/navigation-common/api/public_plus_experimental_current.txt
index 8c34529..9dea391 100644
--- a/navigation/navigation-common/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-common/api/public_plus_experimental_current.txt
@@ -30,6 +30,19 @@
   public interface FloatingWindow {
   }
 
+  public final class NamedNavArgument {
+    method public operator String component1();
+    method public operator androidx.navigation.NavArgument component2();
+    method public androidx.navigation.NavArgument getArgument();
+    method public String getName();
+    property public final androidx.navigation.NavArgument argument;
+    property public final String name;
+  }
+
+  public final class NamedNavArgumentKt {
+    method @androidx.navigation.NavDestinationDsl public static androidx.navigation.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
+  }
+
   public final class NavAction {
     ctor public NavAction(@IdRes int destinationId, optional androidx.navigation.NavOptions? navOptions, optional android.os.Bundle? defaultArguments);
     ctor public NavAction(@IdRes int destinationId, optional androidx.navigation.NavOptions? navOptions);
diff --git a/navigation/navigation-common/api/restricted_current.txt b/navigation/navigation-common/api/restricted_current.txt
index 8c34529..9dea391 100644
--- a/navigation/navigation-common/api/restricted_current.txt
+++ b/navigation/navigation-common/api/restricted_current.txt
@@ -30,6 +30,19 @@
   public interface FloatingWindow {
   }
 
+  public final class NamedNavArgument {
+    method public operator String component1();
+    method public operator androidx.navigation.NavArgument component2();
+    method public androidx.navigation.NavArgument getArgument();
+    method public String getName();
+    property public final androidx.navigation.NavArgument argument;
+    property public final String name;
+  }
+
+  public final class NamedNavArgumentKt {
+    method @androidx.navigation.NavDestinationDsl public static androidx.navigation.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
+  }
+
   public final class NavAction {
     ctor public NavAction(@IdRes int destinationId, optional androidx.navigation.NavOptions? navOptions, optional android.os.Bundle? defaultArguments);
     ctor public NavAction(@IdRes int destinationId, optional androidx.navigation.NavOptions? navOptions);
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
index 6cd431e..45e31a8 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
@@ -20,6 +20,7 @@
 import androidx.navigation.test.floatArgument
 import androidx.navigation.test.intArgument
 import androidx.navigation.test.longArgument
+import androidx.navigation.test.nullableStringArgument
 import androidx.navigation.test.referenceArgument
 import androidx.navigation.test.stringArgument
 import androidx.navigation.test.stringArrayArgument
@@ -30,7 +31,7 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-private val stringArgumentWithoutDefault = "stringArg" to stringArgument(true)
+private val stringArgumentWithoutDefault = "stringArg" to nullableStringArgument()
 private val stringArgumentWithDefault = "stringArg" to stringArgument("aaa")
 private val intArgumentWithDefault = "intArg" to intArgument(123)
 private val longArgumentWithDefault = "longArg" to longArgument(123L)
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
index 02bd167..32b2737 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
@@ -1122,6 +1122,23 @@
     }
 
     @Test
+    fun deepLinkNullableArgumentNotRequired() {
+        val deepLinkString = "$DEEP_LINK_EXACT_HTTPS/users?myarg={myarg}"
+        val deepLink = NavDeepLink(deepLinkString)
+
+        val matchArgs = deepLink.getMatchingArguments(
+            Uri.parse(deepLinkString),
+            mapOf("myarg" to nullableStringArgument())
+        )
+        assertWithMessage("Args should not be null")
+            .that(matchArgs)
+            .isNotNull()
+        assertWithMessage("Args bundle should be empty")
+            .that(matchArgs?.isEmpty)
+            .isTrue()
+    }
+
+    @Test
     fun deepLinkMissingRequiredArgument() {
         val deepLinkString = "$DEEP_LINK_EXACT_HTTPS/greeting?title={title}&text={text}"
         val deepLink = NavDeepLink(deepLinkString)
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
index a357518..a0e4450 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
@@ -65,10 +65,8 @@
 // endregion
 
 // region StringType
-fun stringArgument(
-    isNullable: Boolean = false
-) = NavArgument.Builder().setType(StringType)
-    .setIsNullable(isNullable)
+fun stringArgument() = NavArgument.Builder().setType(StringType)
+    .setIsNullable(false)
     .build()
 
 fun stringArgument(
@@ -77,6 +75,10 @@
     .setDefaultValue(defaultValue)
     .build()
 
+fun nullableStringArgument() = NavArgument.Builder().setType(StringType)
+    .setIsNullable(true)
+    .build()
+
 fun nullableStringArgument(
     defaultValue: String?
 ) = NavArgument.Builder().setType(StringType)
diff --git a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NamedNavArgument.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NamedNavArgument.kt
similarity index 89%
rename from wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NamedNavArgument.kt
rename to navigation/navigation-common/src/main/java/androidx/navigation/NamedNavArgument.kt
index 92fb378..0e8e34f 100644
--- a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NamedNavArgument.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NamedNavArgument.kt
@@ -14,11 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.wear.compose.navigation
-
-import androidx.navigation.NavArgument
-import androidx.navigation.NavArgumentBuilder
-import androidx.navigation.NavDestinationDsl
+package androidx.navigation
 
 /**
  * Construct a new [NavArgument]
@@ -53,4 +49,4 @@
      * Provides destructuring access to this [NamedNavArgument]'s [argument]
      */
     public operator fun component2(): NavArgument = argument
-}
+}
\ No newline at end of file
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
index b2ce511..b3d6aa3 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
@@ -199,7 +199,8 @@
 
         // Check that all required arguments are present in bundle
         for ((argName, argument) in arguments.entries) {
-            val argumentIsRequired = argument != null && !argument.isDefaultValuePresent
+            val argumentIsRequired = argument != null && !argument.isNullable &&
+                !argument.isDefaultValuePresent
             if (argumentIsRequired && !bundle.containsKey(argName)) return null
         }
 
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
index e068943..3a2663e 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
@@ -570,7 +570,6 @@
                 result = 31 * result + value.defaultArguments!!.get(it).hashCode()
             }
         }
-        result = 31 * result + actions.hashCode()
         arguments.keys.forEach {
             result = 31 * result + it.hashCode()
             result = 31 * result + arguments[it].hashCode()
diff --git a/navigation/navigation-compose/api/current.txt b/navigation/navigation-compose/api/current.txt
index f98fb9e..808b1ed 100644
--- a/navigation/navigation-compose/api/current.txt
+++ b/navigation/navigation-compose/api/current.txt
@@ -23,27 +23,14 @@
     ctor public DialogNavigator.Destination(androidx.navigation.compose.DialogNavigator navigator, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
   }
 
-  public final class NamedNavArgument {
-    method public operator String component1();
-    method public operator androidx.navigation.NavArgument component2();
-    method public androidx.navigation.NavArgument getArgument();
-    method public String getName();
-    property public final androidx.navigation.NavArgument argument;
-    property public final String name;
-  }
-
-  public final class NamedNavArgumentKt {
-    method @androidx.navigation.NavDestinationDsl public static androidx.navigation.compose.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
-  }
-
   public final class NavBackStackEntryProviderKt {
     method @androidx.compose.runtime.Composable public static void LocalOwnersProvider(androidx.navigation.NavBackStackEntry, androidx.compose.runtime.saveable.SaveableStateHolder saveableStateHolder, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class NavGraphBuilderKt {
-    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void dialog(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void dialog(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostControllerKt {
diff --git a/navigation/navigation-compose/api/public_plus_experimental_current.txt b/navigation/navigation-compose/api/public_plus_experimental_current.txt
index f98fb9e..808b1ed 100644
--- a/navigation/navigation-compose/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-compose/api/public_plus_experimental_current.txt
@@ -23,27 +23,14 @@
     ctor public DialogNavigator.Destination(androidx.navigation.compose.DialogNavigator navigator, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
   }
 
-  public final class NamedNavArgument {
-    method public operator String component1();
-    method public operator androidx.navigation.NavArgument component2();
-    method public androidx.navigation.NavArgument getArgument();
-    method public String getName();
-    property public final androidx.navigation.NavArgument argument;
-    property public final String name;
-  }
-
-  public final class NamedNavArgumentKt {
-    method @androidx.navigation.NavDestinationDsl public static androidx.navigation.compose.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
-  }
-
   public final class NavBackStackEntryProviderKt {
     method @androidx.compose.runtime.Composable public static void LocalOwnersProvider(androidx.navigation.NavBackStackEntry, androidx.compose.runtime.saveable.SaveableStateHolder saveableStateHolder, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class NavGraphBuilderKt {
-    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void dialog(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void dialog(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostControllerKt {
diff --git a/navigation/navigation-compose/api/restricted_current.txt b/navigation/navigation-compose/api/restricted_current.txt
index f98fb9e..808b1ed 100644
--- a/navigation/navigation-compose/api/restricted_current.txt
+++ b/navigation/navigation-compose/api/restricted_current.txt
@@ -23,27 +23,14 @@
     ctor public DialogNavigator.Destination(androidx.navigation.compose.DialogNavigator navigator, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
   }
 
-  public final class NamedNavArgument {
-    method public operator String component1();
-    method public operator androidx.navigation.NavArgument component2();
-    method public androidx.navigation.NavArgument getArgument();
-    method public String getName();
-    property public final androidx.navigation.NavArgument argument;
-    property public final String name;
-  }
-
-  public final class NamedNavArgumentKt {
-    method @androidx.navigation.NavDestinationDsl public static androidx.navigation.compose.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
-  }
-
   public final class NavBackStackEntryProviderKt {
     method @androidx.compose.runtime.Composable public static void LocalOwnersProvider(androidx.navigation.NavBackStackEntry, androidx.compose.runtime.saveable.SaveableStateHolder saveableStateHolder, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class NavGraphBuilderKt {
-    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void dialog(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void dialog(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, optional androidx.compose.ui.window.DialogProperties dialogProperties, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostControllerKt {
diff --git a/navigation/navigation-compose/build.gradle b/navigation/navigation-compose/build.gradle
index cb3ed7f..49d9ec6 100644
--- a/navigation/navigation-compose/build.gradle
+++ b/navigation/navigation-compose/build.gradle
@@ -30,12 +30,12 @@
 
     implementation(libs.kotlinStdlib)
     implementation("androidx.compose.foundation:foundation-layout:1.0.1")
-    api("androidx.activity:activity-compose:1.3.0-rc02")
+    api("androidx.activity:activity-compose:1.3.1")
     api("androidx.compose.animation:animation:1.0.1")
     api("androidx.compose.runtime:runtime:1.0.1")
     api("androidx.compose.runtime:runtime-saveable:1.0.1")
     api("androidx.compose.ui:ui:1.0.1")
-    api("androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07")
+    api(projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose"))
     api(projectOrArtifact(":navigation:navigation-runtime-ktx"))
 
     androidTestImplementation(projectOrArtifact(":compose:material:material"))
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavByDeepLinkDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavByDeepLinkDemo.kt
index c5deef4..702cd0e 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavByDeepLinkDemo.kt
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavByDeepLinkDemo.kt
@@ -37,10 +37,10 @@
 import androidx.navigation.NavController
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
-import androidx.navigation.compose.navArgument
 import androidx.navigation.compose.rememberNavController
 import androidx.navigation.compose.samples.Dashboard
 import androidx.navigation.compose.samples.Screen
+import androidx.navigation.navArgument
 import androidx.navigation.navDeepLink
 
 @Composable
diff --git a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
index cd9f8fd..34d763a 100644
--- a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
+++ b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
@@ -48,8 +48,8 @@
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
 import androidx.navigation.compose.dialog
-import androidx.navigation.compose.navArgument
 import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navArgument
 import androidx.navigation.navigation
 import kotlinx.parcelize.Parcelize
 import kotlinx.serialization.Serializable
@@ -114,7 +114,6 @@
     }
 }
 
-@Sampled
 @Composable
 fun NavWithArgs() {
     val navController = rememberNavController()
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
index 5c9cb5d..3634fee 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
@@ -22,6 +22,7 @@
 import androidx.core.net.toUri
 import androidx.navigation.contains
 import androidx.navigation.NavDeepLinkRequest
+import androidx.navigation.navArgument
 import androidx.navigation.navDeepLink
 import androidx.navigation.navigation
 import androidx.navigation.testing.TestNavHostController
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
index bcca916..1881627 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
@@ -643,6 +643,43 @@
         assertThat(model.wasCleared).isTrue()
     }
 
+    @Test
+    fun testGetGraphViewModelAfterRecompose() {
+        lateinit var navController: NavHostController
+        lateinit var model: TestViewModel
+
+        composeTestRule.setContent {
+            navController = rememberNavController()
+            // this causes a recompose
+            val navBackStackEntry by navController.currentBackStackEntryAsState()
+            // this causes the NavHost to be recomposed with different builder so the graph
+            // instance is different
+            navBackStackEntry?.destination
+            NavHost(navController, first) {
+                composable(first) { }
+                navigation(second, "subGraph") {
+                    composable(second) {
+                        model = viewModel(remember { navController.getBackStackEntry("subGraph") })
+                    }
+                }
+            }
+        }
+
+        composeTestRule.runOnIdle {
+            navController.navigate(second)
+        }
+
+        composeTestRule.runOnIdle {
+            navController.popBackStack()
+        }
+
+        assertThat(model.wasCleared).isFalse()
+
+        composeTestRule.waitForIdle()
+
+        assertThat(model.wasCleared).isTrue()
+    }
+
     private fun createNavController(context: Context): TestNavHostController {
         val navController = TestNavHostController(context)
         val navigator = TestNavigator()
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt
deleted file mode 100644
index f178348..0000000
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2020 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.navigation.compose
-
-import androidx.navigation.NavArgument
-import androidx.navigation.NavArgumentBuilder
-import androidx.navigation.NavDestinationDsl
-
-/**
- * Construct a new [NavArgument]
- *
- * @sample androidx.navigation.compose.samples.NavWithArgs
- */
-@NavDestinationDsl
-public fun navArgument(
-    name: String,
-    builder: NavArgumentBuilder.() -> Unit
-): NamedNavArgument = NamedNavArgument(name, NavArgumentBuilder().apply(builder).build())
-
-/**
- * Construct a named [NavArgument] by using the [navArgument] method.
- */
-public class NamedNavArgument internal constructor(
-
-    /**
-     * The name the argument is associated with
-     */
-    public val name: String,
-
-    /**
-     * The [NavArgument] associated with the name
-     */
-    public val argument: NavArgument
-) {
-    /**
-     * Provides destructuring access to this [NamedNavArgument]'s [name]
-     */
-    public operator fun component1(): String = name
-
-    /**
-     * Provides destructuring access to this [NamedNavArgument]'s [argument]
-     */
-    public operator fun component2(): NavArgument = argument
-}
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
index 2dc2750..df76125 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.window.DialogProperties
+import androidx.navigation.NamedNavArgument
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDeepLink
 import androidx.navigation.NavGraphBuilder
@@ -58,8 +59,6 @@
  * @param arguments list of arguments to associate with destination
  * @param deepLinks list of deep links to associate with the destinations
  * @param builder the builder used to construct the graph
- *
- * @return the newly constructed nested NavGraph
  */
 public fun NavGraphBuilder.navigation(
     startDestination: String,
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 8d49434..6a7e69a 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -26,7 +26,7 @@
 dependencies {
     api(projectOrArtifact(":fragment:fragment-ktx"))
     api(project(":navigation:navigation-runtime"))
-    api(projectOrArtifact(":slidingpanelayout:slidingpanelayout"))
+    api("androidx.slidingpanelayout:slidingpanelayout:1.2.0-beta01")
     api(libs.kotlinStdlib)
     androidTestImplementation(project(":navigation:navigation-testing"))
     androidTestImplementation(projectOrArtifact(":fragment:fragment-testing"))
diff --git a/navigation/navigation-runtime/api/current.txt b/navigation/navigation-runtime/api/current.txt
index ff4fae2..9499aad 100644
--- a/navigation/navigation-runtime/api/current.txt
+++ b/navigation/navigation-runtime/api/current.txt
@@ -91,6 +91,8 @@
   public class NavController {
     ctor public NavController(android.content.Context context);
     method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
+    method @MainThread public final boolean clearBackStack(String route);
+    method @MainThread public final boolean clearBackStack(@IdRes int destinationId);
     method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
     method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int destinationId);
     method public final androidx.navigation.NavBackStackEntry getBackStackEntry(String route);
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
index ff4fae2..9499aad 100644
--- a/navigation/navigation-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
@@ -91,6 +91,8 @@
   public class NavController {
     ctor public NavController(android.content.Context context);
     method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
+    method @MainThread public final boolean clearBackStack(String route);
+    method @MainThread public final boolean clearBackStack(@IdRes int destinationId);
     method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
     method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int destinationId);
     method public final androidx.navigation.NavBackStackEntry getBackStackEntry(String route);
diff --git a/navigation/navigation-runtime/api/restricted_current.txt b/navigation/navigation-runtime/api/restricted_current.txt
index ff4fae2..9499aad 100644
--- a/navigation/navigation-runtime/api/restricted_current.txt
+++ b/navigation/navigation-runtime/api/restricted_current.txt
@@ -91,6 +91,8 @@
   public class NavController {
     ctor public NavController(android.content.Context context);
     method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
+    method @MainThread public final boolean clearBackStack(String route);
+    method @MainThread public final boolean clearBackStack(@IdRes int destinationId);
     method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
     method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int destinationId);
     method public final androidx.navigation.NavBackStackEntry getBackStackEntry(String route);
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
index c1a49a2..5fd376d 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
@@ -137,12 +137,17 @@
     @Test
     fun testSetGraphTwice() {
         val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
         navController.setGraph(R.navigation.nav_start_destination)
+        navController.navigate(R.id.second_test)
         val navigator = navController.navigatorProvider[TestNavigator::class]
         assertThat(navController.currentDestination?.id)
-            .isEqualTo(R.id.start_test)
+            .isEqualTo(R.id.second_test)
         assertThat(navigator.backStack.size)
-            .isEqualTo(1)
+            .isEqualTo(2)
+        val originalBackStackEntry = navigator.backStack.last()
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
 
         // Now set a new graph, overriding the first
         navController.setGraph(R.navigation.nav_nested_start_destination)
@@ -150,6 +155,68 @@
             .isEqualTo(R.id.nested_test)
         assertThat(navigator.backStack.size)
             .isEqualTo(1)
+        assertThat(originalViewModel.isCleared).isTrue()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetGraphTwiceSameGraph() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_start_destination)
+        navController.navigate(R.id.second_test)
+        val navigator = navController.navigatorProvider[TestNavigator::class]
+        assertThat(navController.currentDestination?.id)
+            .isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size)
+            .isEqualTo(2)
+        val originalBackStackEntry = navigator.backStack.last()
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+
+        // Now set the graph a second time, using the same graph
+        navController.setGraph(R.navigation.nav_start_destination)
+        // Setting the same graph shouldn't change the back stack
+        assertThat(navController.currentDestination?.id)
+            .isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size)
+            .isEqualTo(2)
+        val newBackStackEntry = navigator.backStack.last()
+        val newViewModel = ViewModelProvider(newBackStackEntry).get<TestAndroidViewModel>()
+        assertThat(newBackStackEntry.id).isSameInstanceAs(originalBackStackEntry.id)
+        assertThat(newViewModel).isSameInstanceAs(originalViewModel)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetGraphTwiceWithSavedBackStack() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_start_destination)
+        navController.navigate(R.id.second_test)
+        val navigator = navController.navigatorProvider[TestNavigator::class]
+        assertThat(navController.currentDestination?.id)
+            .isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size)
+            .isEqualTo(2)
+        val originalBackStackEntry = navigator.backStack.last()
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+
+        navController.popBackStack(R.id.second_test, inclusive = true, saveState = true)
+        assertThat(navController.currentDestination?.id)
+            .isEqualTo(R.id.start_test)
+        assertThat(navigator.backStack.size)
+            .isEqualTo(1)
+        assertThat(originalViewModel.isCleared).isFalse()
+
+        // Now set a new graph, overriding the first
+        navController.setGraph(R.navigation.nav_nested_start_destination)
+        assertThat(navController.currentDestination?.id)
+            .isEqualTo(R.id.nested_test)
+        assertThat(navigator.backStack.size)
+            .isEqualTo(1)
+        assertThat(originalViewModel.isCleared).isTrue()
     }
 
     @UiThreadTest
@@ -1962,6 +2029,36 @@
 
     @UiThreadTest
     @Test
+    fun testNavigateOptionSaveClearState() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_simple)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val originalBackStackEntry = navigator.backStack[0]
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+        navController.navigate(
+            R.id.second_test,
+            null,
+            navOptions {
+                popUpTo(R.id.start_test) {
+                    inclusive = true
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.clearBackStack(R.id.start_test)
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        assertThat(originalViewModel.isCleared).isTrue()
+    }
+
+    @UiThreadTest
+    @Test
     fun testNavigateOptionSaveStackRestoreState() {
         val navController = createNavController()
         navController.setViewModelStore(ViewModelStore())
diff --git a/navigation/navigation-runtime/src/androidTest/res/navigation/nav_start_destination.xml b/navigation/navigation-runtime/src/androidTest/res/navigation/nav_start_destination.xml
index 935ca93..8c90bf0 100644
--- a/navigation/navigation-runtime/src/androidTest/res/navigation/nav_start_destination.xml
+++ b/navigation/navigation-runtime/src/androidTest/res/navigation/nav_start_destination.xml
@@ -21,4 +21,5 @@
     <test android:id="@+id/start_test" >
         <argument android:name="test" android:defaultValue="@null" app:argType="string"/>
     </test>
+    <test android:id="@+id/second_test" />
 </navigation>
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
index 8fa002e..ceab492 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -644,6 +644,49 @@
     }
 
     /**
+     * Clears any saved state associated with [route] that was previously saved
+     * via [popBackStack] when using a `saveState` value of `true`.
+     *
+     * @param route The route of the destination previously used with [popBackStack] with a
+     * `saveState` value of `true`
+     *
+     * @return true if the saved state of the stack associated with [route] was cleared.
+     */
+    @MainThread
+    public fun clearBackStack(
+        route: String
+    ): Boolean = clearBackStack(createRoute(route).hashCode())
+
+    /**
+     * Clears any saved state associated with [destinationId] that was previously saved
+     * via [popBackStack] when using a `saveState` value of `true`.
+     *
+     * @param destinationId The ID of the destination previously used with [popBackStack] with a
+     * `saveState`value of `true`
+     *
+     * @return true if the saved state of the stack associated with [destinationId] was cleared.
+     */
+    @MainThread
+    public fun clearBackStack(@IdRes destinationId: Int): Boolean {
+        val cleared = clearBackStackInternal(destinationId)
+        // Only return true if the clear succeeded and we've dispatched
+        // the change to a new destination
+        return cleared && dispatchOnDestinationChanged()
+    }
+
+    @MainThread
+    private fun clearBackStackInternal(@IdRes destinationId: Int): Boolean {
+        navigatorState.values.forEach { state ->
+            state.isNavigating = true
+        }
+        val restored = restoreStateInternal(destinationId, null, null, null)
+        navigatorState.values.forEach { state ->
+            state.isNavigating = false
+        }
+        return restored && popBackStackInternal(destinationId, inclusive = true, saveState = false)
+    }
+
+    /**
      * Attempts to navigate up in the navigation hierarchy. Suitable for when the
      * user presses the "Up" button marked with a left (or start)-facing arrow in the upper left
      * (or starting) corner of the app UI.
@@ -968,6 +1011,12 @@
     public open fun setGraph(graph: NavGraph, startDestinationArgs: Bundle?) {
         if (_graph != graph) {
             _graph?.let { previousGraph ->
+                // Clear all saved back stacks by iterating through a copy of the saved keys,
+                // thus avoiding any concurrent modification exceptions
+                val savedBackStackIds = ArrayList(backStackMap.keys)
+                savedBackStackIds.forEach { id ->
+                    clearBackStackInternal(id)
+                }
                 // Pop everything from the old graph off the back stack
                 popBackStackInternal(previousGraph.id, true)
             }
@@ -1559,7 +1608,7 @@
         val finalArgs = node.addInDefaultArgs(args)
         // Now determine what new destinations we need to add to the back stack
         if (navOptions?.shouldRestoreState() == true && backStackMap.containsKey(node.id)) {
-            navigated = restoreStateInternal(node, finalArgs, navOptions, navigatorExtras)
+            navigated = restoreStateInternal(node.id, finalArgs, navOptions, navigatorExtras)
         } else {
             val currentBackStackEntry = currentBackStackEntry
             val navigator = _navigatorProvider.getNavigator<Navigator<NavDestination>>(
@@ -1596,15 +1645,15 @@
     }
 
     private fun restoreStateInternal(
-        node: NavDestination,
+        id: Int,
         args: Bundle?,
         navOptions: NavOptions?,
         navigatorExtras: Navigator.Extras?
     ): Boolean {
-        if (!backStackMap.containsKey(node.id)) {
+        if (!backStackMap.containsKey(id)) {
             return false
         }
-        val backStackId = backStackMap[node.id]
+        val backStackId = backStackMap[id]
         // Clear out the state we're going to restore so that it isn't restored a second time
         backStackMap.values.removeAll { it == backStackId }
         val backStackState = backStackStates.remove(backStackId)
@@ -1633,7 +1682,6 @@
                 entryList.first().destination.navigatorName
             )
             var lastNavigatedIndex = 0
-            var lastDestination = node
             navigator.navigateInternal(entryList, navOptions, navigatorExtras) { entry ->
                 navigated = true
                 // If this destination is part of the restored back stack,
@@ -1643,12 +1691,11 @@
                 val restoredEntries = if (entryIndex != -1) {
                     entries.subList(lastNavigatedIndex, entryIndex + 1).also {
                         lastNavigatedIndex = entryIndex + 1
-                        lastDestination = entry.destination
                     }
                 } else {
                     emptyList()
                 }
-                addEntryToBackStack(lastDestination, args, entry, restoredEntries)
+                addEntryToBackStack(entry.destination, args, entry, restoredEntries)
             }
         }
         return navigated
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PositionalDataSource.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
index 3e36a62..1b84ad3 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
@@ -309,8 +309,7 @@
         ): Int = minOf(totalCount - initialLoadPosition, params.requestedLoadSize)
     }
 
-    @Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
-    internal final override suspend fun load(params: Params<Int>): BaseResult<T> {
+    final override suspend fun load(params: Params<Int>): BaseResult<T> {
         if (params.type == LoadType.REFRESH) {
             var initialPosition = 0
             var initialLoadSize = params.initialLoadSize
diff --git a/paging/paging-compose/build.gradle b/paging/paging-compose/build.gradle
index 2ed806a..0bc5db8 100644
--- a/paging/paging-compose/build.gradle
+++ b/paging/paging-compose/build.gradle
@@ -31,9 +31,9 @@
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
 
     implementation(libs.kotlinStdlib)
-    api("androidx.compose.foundation:foundation:1.0.1")
+    api("androidx.compose.foundation:foundation:1.0.2")
     api(project(":paging:paging-common"))
-    api(projectOrArtifact(":compose:runtime:runtime"))
+    api("androidx.compose.runtime:runtime:1.0.2")
 
     androidTestImplementation(projectOrArtifact(":compose:ui:ui-test-junit4"))
     androidTestImplementation(project(":compose:test-utils"))
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index e1da599..bf01123 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -27,6 +27,6 @@
 # Disable docs
 androidx.enableDocumentation=false
 androidx.playground.snapshotBuildId=7680668
-androidx.playground.metalavaBuildId=7610917
+androidx.playground.metalavaBuildId=7659017
 androidx.playground.dokkaBuildId=7472101
 androidx.studio.type=playground
diff --git a/remotecallback/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java b/remotecallback/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java
index e2e8c4b..f9892af 100644
--- a/remotecallback/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java
+++ b/remotecallback/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java
@@ -120,7 +120,7 @@
         mIntent.setData(generateUri(mIntent));
         mIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
         PendingIntent intent = PendingIntent.getBroadcast(mContext, 0, mIntent,
-                PendingIntent.FLAG_UPDATE_CURRENT);
+                PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
         return intent;
     }
 
diff --git a/resourceinspection/resourceinspection-annotation/api/1.0.0-beta02.txt b/resourceinspection/resourceinspection-annotation/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..2962da1
--- /dev/null
+++ b/resourceinspection/resourceinspection-annotation/api/1.0.0-beta02.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.resourceinspection.annotation {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface Attribute {
+    method public abstract androidx.resourceinspection.annotation.Attribute.IntMap[] intMapping() default {};
+    method public abstract String value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({}) public static @interface Attribute.IntMap {
+    method public abstract int mask() default 0;
+    method public abstract String name();
+    method public abstract int value();
+  }
+
+}
+
diff --git a/resourceinspection/resourceinspection-annotation/api/public_plus_experimental_1.0.0-beta02.txt b/resourceinspection/resourceinspection-annotation/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..2962da1
--- /dev/null
+++ b/resourceinspection/resourceinspection-annotation/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.resourceinspection.annotation {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface Attribute {
+    method public abstract androidx.resourceinspection.annotation.Attribute.IntMap[] intMapping() default {};
+    method public abstract String value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({}) public static @interface Attribute.IntMap {
+    method public abstract int mask() default 0;
+    method public abstract String name();
+    method public abstract int value();
+  }
+
+}
+
diff --git a/resourceinspection/resourceinspection-annotation/api/restricted_1.0.0-beta02.txt b/resourceinspection/resourceinspection-annotation/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..5be0bd5
--- /dev/null
+++ b/resourceinspection/resourceinspection-annotation/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.resourceinspection.annotation {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface AppCompatShadowedAttributes {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface Attribute {
+    method public abstract androidx.resourceinspection.annotation.Attribute.IntMap[] intMapping() default {};
+    method public abstract String value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({}) public static @interface Attribute.IntMap {
+    method public abstract int mask() default 0;
+    method public abstract String name();
+    method public abstract int value();
+  }
+
+}
+
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotation.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotation.kt
index ab7350a..9c25708 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotation.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotation.kt
@@ -38,7 +38,7 @@
         // the value of Repeatable is not present so the best we can do is check that all the nested
         // members are annotated with repeatable.
         // https://github.com/google/ksp/issues/358
-        val isRepeatable = nestedAnnotations.all {
+        val isRepeatable = nestedAnnotations.isNotEmpty() && nestedAnnotations.all {
             // The java and kotlin versions of Repeatable are not interchangeable.
             // https://github.com/google/ksp/issues/459 asks whether the built in type mapper
             // should convert them, but it may not be possible because there are differences
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt
index 6733fc2..f5e76d7 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt
@@ -97,6 +97,11 @@
     /**
      * Returns `true` if this element has one of the [annotations].
      */
+    fun hasAnyOf(vararg annotations: ClassName) = annotations.any(this::hasAnnotation)
+
+    /**
+     * Returns `true` if this element has one of the [annotations].
+     */
     fun hasAnyOf(vararg annotations: KClass<out Annotation>) = annotations.any(this::hasAnnotation)
 
     @Deprecated(
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
index 497b194..cdc8d4a 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
@@ -19,6 +19,9 @@
 import androidx.room.compiler.processing.javac.JavacElement
 import androidx.room.compiler.processing.ksp.KSFileAsOriginatingElement
 import androidx.room.compiler.processing.ksp.KspElement
+import androidx.room.compiler.processing.ksp.KspMemberContainer
+import androidx.room.compiler.processing.ksp.containingFileAsOriginatingElement
+import androidx.room.compiler.processing.ksp.synthetic.KspSyntheticPropertyMethodElement
 import javax.lang.model.element.Element
 import kotlin.contracts.contract
 
@@ -35,6 +38,7 @@
      * Returns the string representation of the Element's kind.
      */
     fun kindName(): String
+
     /**
      * When the location of an element is unknown, this String is appended to the diagnostic
      * message. Without this information, developer gets no clue on where the error is.
@@ -96,7 +100,15 @@
 internal fun XElement.originatingElementForPoet(): Element? {
     return when (this) {
         is JavacElement -> element
-        is KspElement -> containingFileAsOriginatingElement()
+        is KspElement -> {
+            declaration.containingFileAsOriginatingElement()
+        }
+        is KspSyntheticPropertyMethodElement -> {
+            field.declaration.containingFileAsOriginatingElement()
+        }
+        is KspMemberContainer -> {
+            declaration?.containingFileAsOriginatingElement()
+        }
         else -> error("Originating element is not implemented for ${this.javaClass}")
     }
 }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt
index 227d6f6..ffcfa94 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt
@@ -72,11 +72,25 @@
         val returnType = method.returnType
         val defaultValue = method.defaultValue
         val result: Any? = when {
+            returnType == Int::class.java -> value.getAsInt(defaultValue as Int?)
+            returnType == Double::class.java -> value.getAsDouble(defaultValue as Double?)
+            returnType == Float::class.java -> value.getAsFloat(defaultValue as Float?)
+            returnType == Char::class.java -> value.getAsChar(defaultValue as Char?)
+            returnType == Byte::class.java -> value.getAsByte(defaultValue as Byte?)
+            returnType == Short::class.java -> value.getAsShort(defaultValue as Short?)
+            returnType == Long::class.java -> value.getAsLong(defaultValue as Long?)
             returnType == Boolean::class.java -> value.getAsBoolean(defaultValue as Boolean)
             returnType == String::class.java -> value.getAsString(defaultValue as String?)
             returnType == Array<String>::class.java -> value.getAsStringList().toTypedArray()
             returnType == emptyArray<Class<*>>()::class.java -> value.toListOfClassTypes(env)
             returnType == IntArray::class.java -> value.getAsIntList().toIntArray()
+            returnType == DoubleArray::class.java -> value.getAsDoubleList().toDoubleArray()
+            returnType == FloatArray::class.java -> value.getAsFloatList().toFloatArray()
+            returnType == CharArray::class.java -> value.getAsCharList().toCharArray()
+            returnType == ByteArray::class.java -> value.getAsByteList().toByteArray()
+            returnType == ShortArray::class.java -> value.getAsShortList().toShortArray()
+            returnType == LongArray::class.java -> value.getAsLongList().toLongArray()
+            returnType == BooleanArray::class.java -> value.getAsBooleanList().toBooleanArray()
             returnType == Class::class.java -> {
                 try {
                     value.toClassType(env)
@@ -84,7 +98,6 @@
                     null
                 }
             }
-            returnType == Int::class.java -> value.getAsInt(defaultValue as Int?)
             returnType.isAnnotation -> {
                 @Suppress("UNCHECKED_CAST")
                 AnnotationClassVisitor(env, returnType as Class<out Annotation>).visit(value)
@@ -132,6 +145,54 @@
 }
 
 @Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_TO_DOUBLE_VISITOR =
+    object : SimpleAnnotationValueVisitor6<Double?, Void>() {
+        override fun visitDouble(i: Double, p: Void?): Double? {
+            return i
+        }
+    }
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_TO_FLOAT_VISITOR =
+    object : SimpleAnnotationValueVisitor6<Float?, Void>() {
+        override fun visitFloat(i: Float, p: Void?): Float? {
+            return i
+        }
+    }
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_TO_CHAR_VISITOR =
+    object : SimpleAnnotationValueVisitor6<Char?, Void>() {
+        override fun visitChar(i: Char, p: Void?): Char? {
+            return i
+        }
+    }
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_TO_BYTE_VISITOR =
+    object : SimpleAnnotationValueVisitor6<Byte?, Void>() {
+        override fun visitByte(i: Byte, p: Void?): Byte? {
+            return i
+        }
+    }
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_TO_SHORT_VISITOR =
+    object : SimpleAnnotationValueVisitor6<Short?, Void>() {
+        override fun visitShort(i: Short, p: Void?): Short? {
+            return i
+        }
+    }
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_TO_LONG_VISITOR =
+    object : SimpleAnnotationValueVisitor6<Long?, Void>() {
+        override fun visitLong(i: Long, p: Void?): Long? {
+            return i
+        }
+    }
+
+@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_BOOLEAN_VISITOR = object :
     SimpleAnnotationValueVisitor6<Boolean?, Void>() {
     override fun visitBoolean(b: Boolean, p: Void?): Boolean? {
@@ -167,14 +228,136 @@
     }
 }
 
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_DOUBLE_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Double>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Double> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_DOUBLE_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_FLOAT_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Float>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Float> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_FLOAT_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_CHAR_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Char>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Char> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_CHAR_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_BYTE_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Byte>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Byte> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_BYTE_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_SHORT_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Short>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Short> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_SHORT_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_LONG_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Long>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Long> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_LONG_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
+@Suppress("DEPRECATION")
+private val ANNOTATION_VALUE_BOOLEAN_ARR_VISITOR = object :
+    SimpleAnnotationValueVisitor6<List<Boolean>, Void>() {
+    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Boolean> {
+        return vals?.mapNotNull {
+            ANNOTATION_VALUE_TO_BOOLEAN_VISITOR.visit(it)
+        } ?: emptyList()
+    }
+}
+
 private fun AnnotationValue.getAsInt(def: Int? = null): Int? {
     return ANNOTATION_VALUE_TO_INT_VISITOR.visit(this) ?: def
 }
 
+private fun AnnotationValue.getAsDouble(def: Double? = null): Double? {
+    return ANNOTATION_VALUE_TO_DOUBLE_VISITOR.visit(this) ?: def
+}
+
+private fun AnnotationValue.getAsFloat(def: Float? = null): Float? {
+    return ANNOTATION_VALUE_TO_FLOAT_VISITOR.visit(this) ?: def
+}
+
+private fun AnnotationValue.getAsChar(def: Char? = null): Char? {
+    return ANNOTATION_VALUE_TO_CHAR_VISITOR.visit(this) ?: def
+}
+
+private fun AnnotationValue.getAsByte(def: Byte? = null): Byte? {
+    return ANNOTATION_VALUE_TO_BYTE_VISITOR.visit(this) ?: def
+}
+
+private fun AnnotationValue.getAsShort(def: Short? = null): Short? {
+    return ANNOTATION_VALUE_TO_SHORT_VISITOR.visit(this) ?: def
+}
+
+private fun AnnotationValue.getAsLong(def: Long? = null): Long? {
+    return ANNOTATION_VALUE_TO_LONG_VISITOR.visit(this) ?: def
+}
+
 private fun AnnotationValue.getAsIntList(): List<Int> {
     return ANNOTATION_VALUE_INT_ARR_VISITOR.visit(this)
 }
 
+private fun AnnotationValue.getAsDoubleList(): List<Double> {
+    return ANNOTATION_VALUE_DOUBLE_ARR_VISITOR.visit(this)
+}
+
+private fun AnnotationValue.getAsFloatList(): List<Float> {
+    return ANNOTATION_VALUE_FLOAT_ARR_VISITOR.visit(this)
+}
+
+private fun AnnotationValue.getAsCharList(): List<Char> {
+    return ANNOTATION_VALUE_CHAR_ARR_VISITOR.visit(this)
+}
+
+private fun AnnotationValue.getAsByteList(): List<Byte> {
+    return ANNOTATION_VALUE_BYTE_ARR_VISITOR.visit(this)
+}
+
+private fun AnnotationValue.getAsShortList(): List<Short> {
+    return ANNOTATION_VALUE_SHORT_ARR_VISITOR.visit(this)
+}
+
+private fun AnnotationValue.getAsLongList(): List<Long> {
+    return ANNOTATION_VALUE_LONG_ARR_VISITOR.visit(this)
+}
+
+private fun AnnotationValue.getAsBooleanList(): List<Boolean> {
+    return ANNOTATION_VALUE_BOOLEAN_ARR_VISITOR.visit(this)
+}
+
 private fun AnnotationValue.getAsString(def: String? = null): String? {
     return ANNOTATION_VALUE_TO_STRING_VISITOR.visit(this) ?: def
 }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAnnotatedExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAnnotatedExt.kt
index 7f6f986..f10956c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAnnotatedExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAnnotatedExt.kt
@@ -17,6 +17,7 @@
 package androidx.room.compiler.processing.ksp
 
 import com.google.devtools.ksp.symbol.KSAnnotated
+import com.google.devtools.ksp.symbol.KSDeclaration
 
 private fun KSAnnotated.hasAnnotationWithQName(qName: String) = annotations.any {
     it.annotationType.resolve().declaration.qualifiedName?.asString() == qName
@@ -30,3 +31,13 @@
 internal fun KSAnnotated.hasJvmFieldAnnotation() = hasAnnotationWithQName("kotlin.jvm.JvmField")
 
 internal fun KSAnnotated.hasJvmDefaultAnnotation() = hasAnnotationWithQName("kotlin.jvm.JvmDefault")
+
+/**
+ * Return a reference to the containing file that implements the
+ * [javax.lang.model.element.Element] API so that we can report it to JavaPoet.
+ */
+internal fun KSAnnotated.containingFileAsOriginatingElement(): KSFileAsOriginatingElement? {
+    return (this as? KSDeclaration)?.containingFile?.let {
+        KSFileAsOriginatingElement(it)
+    }
+}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt
index 72f786e..db2a069 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotationBox.kt
@@ -141,12 +141,31 @@
             }
             if (returnType.componentType.isPrimitive) {
                 when (returnType) {
-                    IntArray::class.java ->
+                    IntArray::class.java -> {
                         (values as Collection<Int>).toIntArray()
+                    }
+                    DoubleArray::class.java -> {
+                        (values as Collection<Double>).toDoubleArray()
+                    }
+                    FloatArray::class.java -> {
+                        (values as Collection<Float>).toFloatArray()
+                    }
+                    CharArray::class.java -> {
+                        (values as Collection<Char>).toCharArray()
+                    }
+                    ByteArray::class.java -> {
+                        (values as Collection<Byte>).toByteArray()
+                    }
+                    ShortArray::class.java -> {
+                        (values as Collection<Short>).toShortArray()
+                    }
+                    LongArray::class.java -> {
+                        (values as Collection<Long>).toLongArray()
+                    }
+                    BooleanArray::class.java -> {
+                        (values as Collection<Boolean>).toBooleanArray()
+                    }
                     else -> {
-                        // We don't have the use case for these yet but could be implemented in
-                        // the future. Also need to implement them in JavacAnnotationBox
-                        // b/179081610
                         error("Unsupported primitive array type: $returnType")
                     }
                 }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
index be79499..393b554 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
@@ -52,16 +52,6 @@
         return declaration.toString()
     }
 
-    /**
-     * Return a reference to the containing file that implements the
-     * [javax.lang.model.element.Element] API so that we can report it to JavaPoet.
-     */
-    fun containingFileAsOriginatingElement(): KSFileAsOriginatingElement? {
-        return (declaration as? KSDeclaration)?.containingFile?.let {
-            KSFileAsOriginatingElement(it)
-        }
-    }
-
     override val docComment: String? by lazy {
         (declaration as? KSDeclaration)?.docString
     }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/OriginatingElementsTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/OriginatingElementsTest.kt
index fcc43f0..e32fb9a 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/OriginatingElementsTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/OriginatingElementsTest.kt
@@ -18,6 +18,7 @@
 
 import androidx.room.compiler.processing.ksp.KSFileAsOriginatingElement
 import androidx.room.compiler.processing.ksp.KspTypeElement
+import androidx.room.compiler.processing.ksp.synthetic.KspSyntheticPropertyMethodElement
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
@@ -25,6 +26,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.TypeElement
 
 @RunWith(JUnit4::class)
@@ -70,6 +72,50 @@
     }
 
     @Test
+    fun syntheticPropertyElementConvertedToOriginatingElement() {
+        runProcessorTest(
+            sources = listOf(
+                Source.kotlin(
+                    "Foo.kt",
+                    """
+            class Foo {
+                companion object {
+                    @JvmStatic
+                    var bar = 1
+                }
+            }
+                    """.trimIndent()
+                )
+            )
+        ) { invocation ->
+            val element = invocation.processingEnv.requireTypeElement("Foo")
+            val syntheticPropertyElements = element.getDeclaredMethods()
+
+            // Synthetic getter and setter methods are created.
+            assertThat(syntheticPropertyElements).hasSize(2)
+
+            syntheticPropertyElements.forEach { syntheticPropertyElement ->
+                val originatingElement = syntheticPropertyElement.originatingElementForPoet()
+                assertThat(originatingElement).isNotNull()
+
+                if (invocation.isKsp) {
+                    assertThat(originatingElement)
+                        .isInstanceOf(KSFileAsOriginatingElement::class.java)
+
+                    val originatingFile = (originatingElement as KSFileAsOriginatingElement).ksFile
+                    assertThat(originatingFile)
+                        .isEqualTo(
+                            (syntheticPropertyElement as KspSyntheticPropertyMethodElement)
+                                .field.declaration.containingFile
+                        )
+                } else {
+                    assertThat(originatingElement).isInstanceOf(ExecutableElement::class.java)
+                }
+            }
+        }
+    }
+
+    @Test
     fun originatingElementIsAddedToPoet() {
         runProcessorTest(
             sources = listOf(
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
index 7296fe5..ec46fac 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
@@ -119,6 +119,13 @@
                 typeList = {String.class, Integer.class},
                 singleType = Long.class,
                 intMethod = 3,
+                doubleMethodWithDefault = 3.0,
+                floatMethodWithDefault = 3f,
+                charMethodWithDefault = '3',
+                byteMethodWithDefault = 3,
+                shortMethodWithDefault = 3,
+                longMethodWithDefault = 3L,
+                boolMethodWithDefault = false,
                 otherAnnotationArray = {
                     @OtherAnnotation(
                         value = "other list 1"
@@ -150,6 +157,13 @@
                 )
 
                 assertThat(annotation.value.intMethod).isEqualTo(3)
+                assertThat(annotation.value.doubleMethodWithDefault).isEqualTo(3.0)
+                assertThat(annotation.value.floatMethodWithDefault).isEqualTo(3f)
+                assertThat(annotation.value.charMethodWithDefault).isEqualTo('3')
+                assertThat(annotation.value.byteMethodWithDefault).isEqualTo(3)
+                assertThat(annotation.value.shortMethodWithDefault).isEqualTo(3)
+                assertThat(annotation.value.longMethodWithDefault).isEqualTo(3)
+                assertThat(annotation.value.boolMethodWithDefault).isEqualTo(false)
                 annotation.getAsAnnotationBox<OtherAnnotation>("singleOtherAnnotation")
                     .let { other ->
                         assertThat(other.value.value).isEqualTo("other single")
@@ -201,6 +215,13 @@
                 typeList = [String::class, Int::class],
                 singleType = Long::class,
                 intMethod = 3,
+                doubleMethodWithDefault = 3.0,
+                floatMethodWithDefault = 3f,
+                charMethodWithDefault = '3',
+                byteMethodWithDefault = 3,
+                shortMethodWithDefault = 3,
+                longMethodWithDefault = 3L,
+                boolMethodWithDefault = false,
                 otherAnnotationArray = [
                     OtherAnnotation(
                         value = "other list 1"
@@ -235,6 +256,13 @@
                 )
 
                 assertThat(annotation.value.intMethod).isEqualTo(3)
+                assertThat(annotation.value.doubleMethodWithDefault).isEqualTo(3.0)
+                assertThat(annotation.value.floatMethodWithDefault).isEqualTo(3f)
+                assertThat(annotation.value.charMethodWithDefault).isEqualTo('3')
+                assertThat(annotation.value.byteMethodWithDefault).isEqualTo(3)
+                assertThat(annotation.value.shortMethodWithDefault).isEqualTo(3)
+                assertThat(annotation.value.longMethodWithDefault).isEqualTo(3)
+                assertThat(annotation.value.boolMethodWithDefault).isEqualTo(false)
                 annotation.getAsAnnotationBox<OtherAnnotation>("singleOtherAnnotation")
                     .let { other ->
                         assertThat(other.value.value).isEqualTo("other single")
@@ -469,13 +497,21 @@
 
     @Test
     fun javaPrimitiveArray() {
-        // TODO: expand this test for other primitive types: 179081610
         val javaSrc = Source.java(
             "JavaSubject.java",
             """
             import androidx.room.compiler.processing.testcode.*;
             class JavaSubject {
-                @JavaAnnotationWithPrimitiveArray(intArray = {1, 2, 3})
+                @JavaAnnotationWithPrimitiveArray(
+                    intArray = {1, 2, 3},
+                    doubleArray = {1.0,2.0,3.0},
+                    floatArray = {1f,2f,3f},
+                    charArray = {'1','2','3'},
+                    byteArray = {1,2,3},
+                    shortArray = {1,2,3},
+                    longArray = {1,2,3},
+                    booleanArray = {true, false}
+                )
                 Object annotated1;
             }
             """.trimIndent()
@@ -485,7 +521,16 @@
             """
             import androidx.room.compiler.processing.testcode.*;
             class KotlinSubject {
-                @JavaAnnotationWithPrimitiveArray(intArray = [1, 2, 3])
+                @JavaAnnotationWithPrimitiveArray(
+                    intArray = [1, 2, 3],
+                    doubleArray = [1.0,2.0,3.0],
+                    floatArray = [1f,2f,3f],
+                    charArray = ['1','2','3'],
+                    byteArray = [1,2,3],
+                    shortArray = [1,2,3],
+                    longArray = [1,2,3],
+                    booleanArray = [true, false],
+                )
                 val annotated1:Any = TODO()
             }
             """.trimIndent()
@@ -504,6 +549,41 @@
                 ).isEqualTo(
                     intArrayOf(1, 2, 3)
                 )
+                assertThat(
+                    annotation?.value?.doubleArray
+                ).isEqualTo(
+                    doubleArrayOf(1.0, 2.0, 3.0)
+                )
+                assertThat(
+                    annotation?.value?.floatArray
+                ).isEqualTo(
+                    floatArrayOf(1f, 2f, 3f)
+                )
+                assertThat(
+                    annotation?.value?.charArray
+                ).isEqualTo(
+                    charArrayOf('1', '2', '3')
+                )
+                assertThat(
+                    annotation?.value?.byteArray
+                ).isEqualTo(
+                    byteArrayOf(1, 2, 3)
+                )
+                assertThat(
+                    annotation?.value?.shortArray
+                ).isEqualTo(
+                    shortArrayOf(1, 2, 3)
+                )
+                assertThat(
+                    annotation?.value?.longArray
+                ).isEqualTo(
+                    longArrayOf(1, 2, 3)
+                )
+                assertThat(
+                    annotation?.value?.booleanArray
+                ).isEqualTo(
+                    booleanArrayOf(true, false)
+                )
             }
         }
     }
@@ -691,6 +771,9 @@
         assertWithMessage("has suppress annotation $this")
             .that(this.hasAnnotation(TestSuppressWarnings::class))
             .isTrue()
+        assertWithMessage("has suppress annotation $this")
+            .that(this.hasAnyOf(TestSuppressWarnings::class))
+            .isTrue()
         assertWithMessage("$this")
             .that(this.hasAnnotationWithPackage(TestSuppressWarnings::class.java.packageName))
             .isTrue()
@@ -704,6 +787,9 @@
             .that(this.hasAnnotation(TestSuppressWarnings::class))
             .isFalse()
         assertWithMessage("$this")
+            .that(this.hasAnyOf(TestSuppressWarnings::class))
+            .isFalse()
+        assertWithMessage("$this")
             .that(this.hasAnnotationWithPackage(TestSuppressWarnings::class.java.packageName))
             .isFalse()
         assertWithMessage("$this")
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
index 5b2295a..1ed0c7e 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
@@ -696,6 +696,44 @@
     }
 
     @Test
+    fun javaEnumArrayWithDefaultNameAndValue() {
+        val annotationSource = Source.java(
+            "foo.bar.MyAnnotation",
+            """
+            package foo.bar;
+            public @interface MyAnnotation {
+                MyEnum[] value() default {};
+            }
+            """.trimIndent()
+        )
+        val enumSource = Source.java(
+            "foo.bar.MyEnum",
+            """
+            package foo.bar;
+            enum MyEnum {
+                 Bar
+            }
+            """.trimIndent()
+        )
+        val classSource = Source.java(
+            "foo.bar.Subject",
+            """
+            package foo.bar;
+            @MyAnnotation
+            class Subject {}
+            """.trimIndent()
+        )
+        runTest(
+            sources = listOf(annotationSource, enumSource, classSource)
+        ) { invocation ->
+            val subject = invocation.processingEnv.requireTypeElement("foo.bar.Subject")
+
+            val annotations = subject.getAllAnnotations().filter { it.name == "MyAnnotation" }
+            assertThat(annotations).hasSize(1)
+        }
+    }
+
+    @Test
     fun javaRepeatableAnnotation() {
         val javaSrc = Source.java(
             "JavaSubject",
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt
index a246983..95e0d2f 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt
@@ -207,23 +207,7 @@
             sources = emptyList(),
             classpath = classpath
         ) { invocation ->
-            if (invocation.isKsp) {
-                // TODO: https://github.com/google/ksp/issues/159
-                // KSP has a bug in java package private modifier from .class files
-                // for now, revert them to make the test happy
-                assertModifiers(
-                    invocation = invocation,
-                    inputs = inputs.map {
-                        it.copy(
-                            expected = it.expected.mapValues { (_, modifier) ->
-                                modifier ?: PUBLIC
-                            }
-                        )
-                    }.toTypedArray()
-                )
-            } else {
-                assertModifiers(invocation, inputs)
-            }
+            assertModifiers(invocation, inputs)
         }
     }
 
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java
index e594177..9910e45 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/JavaAnnotationWithPrimitiveArray.java
@@ -22,4 +22,18 @@
 @Target(ElementType.FIELD)
 public @interface JavaAnnotationWithPrimitiveArray {
     int[] intArray() default {};
+
+    double[] doubleArray() default {};
+
+    float[] floatArray() default {};
+
+    char[] charArray() default {};
+
+    byte[] byteArray() default {};
+
+    short[] shortArray() default {};
+
+    long[] longArray() default {};
+
+    boolean[] booleanArray() default {};
 }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/MainAnnotation.java b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/MainAnnotation.java
index 9ba12cf..c9f41e6 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/MainAnnotation.java
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/MainAnnotation.java
@@ -34,6 +34,18 @@
 
     int intMethod();
 
+    double doubleMethodWithDefault() default 0;
+
+    float floatMethodWithDefault() default 0;
+
+    char charMethodWithDefault() default 0;
+
+    byte byteMethodWithDefault() default 0;
+
+    short shortMethodWithDefault() default 0;
+
+    long longMethodWithDefault() default 0;
+
     boolean boolMethodWithDefault() default true;
 
     OtherAnnotation[] otherAnnotationArray() default {};
diff --git a/room/scripts/ksp-kapt-comparison.sh b/room/scripts/ksp-kapt-comparison.sh
index 5e70cf0..f3ac843 100755
--- a/room/scripts/ksp-kapt-comparison.sh
+++ b/room/scripts/ksp-kapt-comparison.sh
@@ -52,7 +52,7 @@
         echo "bad arg '$type'"
         exit 1
     fi
-    local cmd="./gradlew --no-daemon --init-script \
+    local cmd="./gradlew --init-script \
         $SCRIPT_DIR/rerun-requested-task-init-script.gradle \
         --profile $task"
     log "Executing $cmd"
@@ -62,14 +62,15 @@
 }
 
 # Runs the compilation with kapt and ksp for the given number of times
-# usage: runTest 3
+# usage: runTest 3 ksp|kapt
 function runTest {
     local limit=$1
+    local type=$2
+
     for (( c=1; c<=$limit; c++ ))
     do
         echo "run #$c of $limit"
-        runBuild "ksp"
-        runBuild "kapt"
+        runBuild "$type"
     done
 }
 
@@ -83,8 +84,13 @@
 }
 
 # build once so all other tasks are cached
-./gradlew $KSP_TASK $KAPT_TASK
+./gradlew --stop
+./gradlew $KSP_TASK
+runTest 10 "ksp"
 
-runTest 10
+./gradlew --stop
+./gradlew $KAPT_TASK
+runTest 10 "kapt"
+
 printData totals
 printData taskTotals
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
index 3c2f4d6..e695d7d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
@@ -171,8 +171,9 @@
         Intent settingsIntent = new Intent(Intent.ACTION_MAIN);
         settingsIntent.setClass(getContext(), SampleMediaRouteSettingsActivity.class)
                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        int pendingIntentFlagMutable = Build.VERSION.SDK_INT >= 31 ? PendingIntent.FLAG_MUTABLE : 0;
         IntentSender is = PendingIntent.getActivity(getContext(), 99, settingsIntent,
-                PendingIntent.FLAG_UPDATE_CURRENT).getIntentSender();
+                PendingIntent.FLAG_UPDATE_CURRENT | pendingIntentFlagMutable).getIntentSender();
 
         mVolumes.put(FIXED_VOLUME_ROUTE_ID, VOLUME_DEFAULT);
         mVolumes.put(VARIABLE_VOLUME_BASIC_ROUTE_ID, VOLUME_DEFAULT);
diff --git a/settings.gradle b/settings.gradle
index 48ca9f9..1531a89 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -277,6 +277,8 @@
 includeProject(":cardview:cardview", "cardview/cardview", [BuildType.MAIN])
 includeProject(":collection:collection", "collection/collection", [BuildType.MAIN])
 includeProject(":collection:collection-benchmark", "collection/collection-benchmark", [BuildType.MAIN])
+includeProject(":collection:collection-benchmark-js", "collection/collection-benchmark-js", [BuildType.MAIN])
+includeProject(":collection:collection-benchmark-native", "collection/collection-benchmark-native", [BuildType.MAIN])
 includeProject(":collection:collection-ktx", "collection/collection-ktx", [BuildType.MAIN])
 includeProject(":collection:integration-tests:testapp", "collection/integration-tests/testapp", [BuildType.MAIN])
 includeProject(":collection2:collection2", "collection2/collection2", [BuildType.MAIN])
@@ -518,6 +520,7 @@
 includeProject(":media2:media2-widget", "media2/media2-widget", [BuildType.MAIN, BuildType.MEDIA])
 includeProject(":media:media", "media/media", [BuildType.MAIN, BuildType.MEDIA])
 includeProject(":mediarouter:mediarouter", "mediarouter/mediarouter", [BuildType.MAIN, BuildType.MEDIA])
+includeProject(":mediarouter:mediarouter-testing", "mediarouter/mediarouter-testing", [BuildType.MAIN, BuildType.MEDIA])
 includeProject(":navigation:navigation-benchmark", "navigation/navigation-benchmark", [BuildType.MAIN, BuildType.FLAN])
 includeProject(":navigation:navigation-common", "navigation/navigation-common", [BuildType.MAIN, BuildType.FLAN, BuildType.COMPOSE])
 includeProject(":navigation:navigation-common-ktx", "navigation/navigation-common-ktx", [BuildType.MAIN, BuildType.FLAN, BuildType.COMPOSE])
diff --git a/slice/slice-core/src/androidTest/java/androidx/slice/SliceTestProvider.java b/slice/slice-core/src/androidTest/java/androidx/slice/SliceTestProvider.java
index 475ae31..3e1949f 100644
--- a/slice/slice-core/src/androidTest/java/androidx/slice/SliceTestProvider.java
+++ b/slice/slice-core/src/androidTest/java/androidx/slice/SliceTestProvider.java
@@ -85,7 +85,8 @@
                 Builder builder = new Builder(sliceUri);
                 Slice subSlice = new Slice.Builder(builder).build();
                 PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 0,
-                        new Intent(getContext().getPackageName() + ".action"), 0);
+                        new Intent(getContext().getPackageName() + ".action"),
+                        PendingIntent.FLAG_IMMUTABLE);
                 return builder.addAction(broadcast, subSlice, "action").build();
             case "/int":
                 return new Slice.Builder(sliceUri).addInt(0xff121212, "int").build();
@@ -110,7 +111,8 @@
             @NonNull String callingPackage) {
         if (getContext().getPackageName().equals(callingPackage)) {
             return PendingIntent.getBroadcast(getContext(), 0,
-                    new Intent(getContext().getPackageName() + ".permission"), 0);
+                    new Intent(getContext().getPackageName() + ".permission"),
+                    PendingIntent.FLAG_IMMUTABLE);
         }
         return super.onCreatePermissionRequest(sliceUri, callingPackage);
     }
diff --git a/slice/slice-core/src/main/java/androidx/slice/SliceProvider.java b/slice/slice-core/src/main/java/androidx/slice/SliceProvider.java
index 9283a94..68a80dc 100644
--- a/slice/slice-core/src/main/java/androidx/slice/SliceProvider.java
+++ b/slice/slice-core/src/main/java/androidx/slice/SliceProvider.java
@@ -377,7 +377,7 @@
         intent.setData(sliceUri.buildUpon().appendQueryParameter("package", callingPackage)
                 .build());
 
-        return PendingIntent.getActivity(context, 0, intent, 0);
+        return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
     }
 
     /**
diff --git a/slice/slice-view/src/androidTest/java/androidx/slice/SliceBuilderTest.java b/slice/slice-view/src/androidTest/java/androidx/slice/SliceBuilderTest.java
index f6a2bb6..dd4f25e 100644
--- a/slice/slice-view/src/androidTest/java/androidx/slice/SliceBuilderTest.java
+++ b/slice/slice-view/src/androidTest/java/androidx/slice/SliceBuilderTest.java
@@ -243,6 +243,6 @@
     private PendingIntent getIntent(String action) {
         Intent intent = new Intent(action);
         intent.setClassName(mContext.getPackageName(), SliceRenderActivity.class.getName());
-        return PendingIntent.getActivity(mContext, 0, intent, 0);
+        return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE);
     }
 }
diff --git a/slice/slice-view/src/androidTest/java/androidx/slice/SliceMetadataTest.java b/slice/slice-view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
index b56e835..90a0c13 100644
--- a/slice/slice-view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
+++ b/slice/slice-view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
@@ -509,7 +509,7 @@
         String intentAction = mContext.getPackageName() + ".actionToggle";
         mContext.registerReceiver(receiver, new IntentFilter(intentAction));
         PendingIntent broadcast = PendingIntent.getBroadcast(mContext, 0,
-                new Intent(intentAction), 0);
+                new Intent(intentAction), PendingIntent.FLAG_MUTABLE);
 
         SliceAction toggle = new SliceAction(broadcast, "toggle", true /* isChecked */);
 
@@ -614,7 +614,7 @@
         String intentAction = mContext.getPackageName() + ".action";
         mContext.registerReceiver(receiver, new IntentFilter(intentAction));
         PendingIntent broadcast = PendingIntent.getBroadcast(mContext, 0,
-                new Intent(intentAction), 0);
+                new Intent(intentAction), PendingIntent.FLAG_MUTABLE);
 
         Uri uri = Uri.parse("content://pkg/slice");
         ListBuilder lb = new ListBuilder(mContext, uri, INFINITY);
@@ -870,7 +870,7 @@
     private PendingIntent getIntent(String action) {
         Intent intent = new Intent(action);
         intent.setClassName(mContext.getPackageName(), SliceRenderActivity.class.getName());
-        return PendingIntent.getActivity(mContext, 0, intent, 0);
+        return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE);
     }
 
     private void assertEquivalent(androidx.slice.core.SliceAction desired,
diff --git a/slice/slice-view/src/androidTest/java/androidx/slice/SliceXmlTest.java b/slice/slice-view/src/androidTest/java/androidx/slice/SliceXmlTest.java
index 803d163..df563ae 100644
--- a/slice/slice-view/src/androidTest/java/androidx/slice/SliceXmlTest.java
+++ b/slice/slice-view/src/androidTest/java/androidx/slice/SliceXmlTest.java
@@ -64,7 +64,8 @@
 
     @Test(expected = IllegalArgumentException.class)
     public void testThrowForAction() throws IOException {
-        PendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+        PendingIntent pi = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         Slice inner = new Slice.Builder(Uri.parse("context://pkg/slice/inner")).build();
         Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
@@ -99,7 +100,8 @@
 
     @Test
     public void testNoThrowForAction() throws IOException {
-        PendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+        PendingIntent pi = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         Slice inner = new Slice.Builder(Uri.parse("context://pkg/slice/inner")).build();
         Slice s = new Slice.Builder(Uri.parse("content://pkg/slice"))
@@ -134,7 +136,8 @@
 
     @Test
     public void testSerialization() throws Exception {
-        PendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+        PendingIntent pi = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
         Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
         new Canvas(b).drawColor(0xffff0000);
         // Create a slice containing all the types in a hierarchy.
@@ -175,7 +178,8 @@
 
     @Test
     public void testBackCompatSerialization() throws Exception {
-        PendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+        PendingIntent pi = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
         Bitmap b = Bitmap.createBitmap(50, 25, Bitmap.Config.ARGB_8888);
         new Canvas(b).drawColor(0xffff0000);
         // Create a slice containing all the types in a hierarchy.
diff --git a/slice/slice-view/src/androidTest/java/androidx/slice/widget/SliceViewTest.java b/slice/slice-view/src/androidTest/java/androidx/slice/widget/SliceViewTest.java
index b4ac114..f56036f 100644
--- a/slice/slice-view/src/androidTest/java/androidx/slice/widget/SliceViewTest.java
+++ b/slice/slice-view/src/androidTest/java/androidx/slice/widget/SliceViewTest.java
@@ -730,7 +730,7 @@
     private PendingIntent getIntent(String action) {
         Intent intent = new Intent(action);
         intent.setClassName(mContext.getPackageName(), SliceRenderActivity.class.getName());
-        return PendingIntent.getActivity(mContext, 0, intent, 0);
+        return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE);
     }
 
     private void assertEquivalent(androidx.slice.core.SliceAction desired,
diff --git a/textclassifier/textclassifier/src/main/res/values-te/strings.xml b/textclassifier/textclassifier/src/main/res/values-te/strings.xml
index 618e468..8a67e8e 100644
--- a/textclassifier/textclassifier/src/main/res/values-te/strings.xml
+++ b/textclassifier/textclassifier/src/main/res/values-te/strings.xml
@@ -25,7 +25,7 @@
     <string name="sms" msgid="2214738262605167054">"మెసేజ్‌ పంపు"</string>
     <string name="sms_desc" msgid="7733202356868441148">"ఎంచుకున్న ఫోన్ నంబర్‌కి మెసేజ్‌ పంపుతుంది"</string>
     <string name="add_contact" msgid="386263007484061034">"జోడించు"</string>
-    <string name="add_contact_desc" msgid="1739272501140197425">"పరిచయాలకు జోడిస్తుంది"</string>
+    <string name="add_contact_desc" msgid="1739272501140197425">"కాంటాక్ట్‌లకు జోడిస్తుంది"</string>
     <string name="floating_toolbar_open_overflow_description" msgid="6778458701858708647">"మరిన్ని ఆప్షన్‌లు"</string>
     <string name="floating_toolbar_close_overflow_description" msgid="3112942430227166657">"అతివ్యాప్తిని మూసివేస్తుంది"</string>
     <string name="abc_share" msgid="37557693057519685">"షేర్ చేయి"</string>
diff --git a/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/BasicCurvedTextTest.kt b/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/BasicCurvedTextTest.kt
new file mode 100644
index 0000000..437a9d4
--- /dev/null
+++ b/wear/compose/compose-foundation/src/androidAndroidTest/kotlin/androidx/wear/compose/foundation/BasicCurvedTextTest.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2021 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.wear.compose.foundation
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.test.junit4.createComposeRule
+import org.junit.Assert.assertEquals
+import androidx.compose.ui.unit.sp
+import org.junit.Rule
+import org.junit.Test
+
+class BasicCurvedTextTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun modifying_curved_text_forces_curved_row_remeasure() {
+        val counters = Counters()
+        val text = mutableStateOf("Initial")
+        rule.setContent {
+            SpyCurvedRow(counters) {
+                BasicCurvedText(
+                    text = text.value,
+                    style = CurvedTextStyle(fontSize = 14.sp)
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            counters.reset()
+            text.value = "New Value"
+        }
+
+        rule.runOnIdle {
+            assertEquals(1, counters.layoutsCount)
+            assertEquals(1, counters.measuresCount)
+        }
+    }
+}
+
+internal data class Counters(
+    var measuresCount: Int = 0,
+    var layoutsCount: Int = 0
+) {
+    fun reset() {
+        measuresCount = 0
+        layoutsCount = 0
+    }
+}
+
+@Composable
+internal fun SpyCurvedRow(
+    counters: Counters,
+    content: @Composable CurvedRowScope.() -> Unit
+) {
+    Layout(
+        content = {
+            CurvedRowScopeInstance.content()
+        }
+    ) { measurables, constraints ->
+        counters.measuresCount++
+        // Ensure we ask BasicCurvedText for it's intrinsic measures, as CurvedRow does,
+        // so we subscribe to get notified of changes
+        measurables.sumOf {
+            it.maxIntrinsicWidth(constraints.maxHeight)
+        }
+
+        val placeables = measurables.map { it.measure(constraints) }
+        layout(constraints.maxWidth, constraints.maxHeight) {
+            counters.layoutsCount++
+            placeables.forEach {
+                it.placeRelative(0, 0)
+            }
+        }
+    }
+}
diff --git a/wear/compose/compose-foundation/src/androidMain/kotlin/androidx/wear/compose/foundation/CurvedTextDelegate.android.kt b/wear/compose/compose-foundation/src/androidMain/kotlin/androidx/wear/compose/foundation/CurvedTextDelegate.android.kt
index ad3ceb7..e16c602 100644
--- a/wear/compose/compose-foundation/src/androidMain/kotlin/androidx/wear/compose/foundation/CurvedTextDelegate.android.kt
+++ b/wear/compose/compose-foundation/src/androidMain/kotlin/androidx/wear/compose/foundation/CurvedTextDelegate.android.kt
@@ -16,6 +16,9 @@
 
 package androidx.wear.compose.foundation
 
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -33,8 +36,8 @@
     private var fontSizePx: Float = 0f
     private var arcPaddingPx: ArcPaddingPx = ArcPaddingPx(0f, 0f, 0f, 0f)
 
-    actual var textWidth = 0f
-    actual var textHeight = 0f
+    actual var textWidth by mutableStateOf(0f)
+    actual var textHeight by mutableStateOf(0f)
     actual var baseLinePosition = 0f
 
     private val paint = android.graphics.Paint().apply { isAntiAlias = true }
diff --git a/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedRow.kt b/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedRow.kt
index cc2ec6d..867ce50 100644
--- a/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedRow.kt
+++ b/wear/compose/compose-foundation/src/commonMain/kotlin/androidx/wear/compose/foundation/CurvedRow.kt
@@ -176,11 +176,12 @@
 
             // Compute to total angle all children take and where we need to start laying them out.
             val totalSweep = measuredChildren.map { it.sweep }.sum()
-            var childAngleStart = -anchorType.ratio * totalSweep
 
             val clockwiseFactor = if (clockwise) 1 else -1
 
             layout(diameter, diameter) {
+                var childAngleStart = -anchorType.ratio * totalSweep
+
                 measuredChildren.forEach { child ->
                     // Angle of the vector from the centre of the CurvedRow to the center of the child.
                     val centerAngle = anchor.toRadians() + clockwiseFactor *
diff --git a/wear/compose/compose-material/api/current.txt b/wear/compose/compose-material/api/current.txt
index 214a5e7..9fd1da2 100644
--- a/wear/compose/compose-material/api/current.txt
+++ b/wear/compose/compose-material/api/current.txt
@@ -162,6 +162,7 @@
   public final class PositionIndicatorKt {
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.compose.foundation.ScrollState scrollState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.wear.compose.material.ScalingLazyListState scalingLazyListState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
+    method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.compose.foundation.lazy.LazyListState lazyListState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(float rsbRatio, optional androidx.compose.ui.Modifier modifier, optional long color, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.wear.compose.material.PositionIndicatorState state, float indicatorHeight, float indicatorWidth, float paddingRight, optional androidx.compose.ui.Modifier modifier, optional long color, optional long background, optional boolean autoHide, optional boolean reverseDirection);
   }
diff --git a/wear/compose/compose-material/api/public_plus_experimental_current.txt b/wear/compose/compose-material/api/public_plus_experimental_current.txt
index 8a82a87..34ebffe 100644
--- a/wear/compose/compose-material/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material/api/public_plus_experimental_current.txt
@@ -177,6 +177,7 @@
   public final class PositionIndicatorKt {
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.compose.foundation.ScrollState scrollState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.wear.compose.material.ScalingLazyListState scalingLazyListState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
+    method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.compose.foundation.lazy.LazyListState lazyListState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(float rsbRatio, optional androidx.compose.ui.Modifier modifier, optional long color, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.wear.compose.material.PositionIndicatorState state, float indicatorHeight, float indicatorWidth, float paddingRight, optional androidx.compose.ui.Modifier modifier, optional long color, optional long background, optional boolean autoHide, optional boolean reverseDirection);
   }
@@ -317,12 +318,16 @@
 
   @androidx.wear.compose.material.ExperimentalWearMaterialApi public final class SwipeToDismissBoxDefaults {
     method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public Object getBackgroundKey();
+    method public Object getContentKey();
     property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final Object BackgroundKey;
+    property public final Object ContentKey;
     field public static final androidx.wear.compose.material.SwipeToDismissBoxDefaults INSTANCE;
   }
 
   public final class SwipeToDismissBoxKt {
-    method @androidx.compose.runtime.Composable @androidx.wear.compose.material.ExperimentalWearMaterialApi public static void SwipeToDismissBox(androidx.wear.compose.material.SwipeToDismissBoxState state, optional androidx.compose.ui.Modifier modifier, optional long scrimColor, optional Object backgroundKey, optional Object contentKey, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.layout.BoxScope,? super java.lang.Boolean,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.wear.compose.material.ExperimentalWearMaterialApi public static void SwipeToDismissBox(androidx.wear.compose.material.SwipeToDismissBoxState state, optional androidx.compose.ui.Modifier modifier, optional long scrimColor, optional Object backgroundKey, optional Object contentKey, optional boolean hasBackground, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.layout.BoxScope,? super java.lang.Boolean,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable @androidx.wear.compose.material.ExperimentalWearMaterialApi public static androidx.wear.compose.material.SwipeToDismissBoxState rememberSwipeToDismissBoxState(optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.wear.compose.material.SwipeDismissTarget,java.lang.Boolean> confirmStateChange);
   }
 
diff --git a/wear/compose/compose-material/api/restricted_current.txt b/wear/compose/compose-material/api/restricted_current.txt
index 214a5e7..9fd1da2 100644
--- a/wear/compose/compose-material/api/restricted_current.txt
+++ b/wear/compose/compose-material/api/restricted_current.txt
@@ -162,6 +162,7 @@
   public final class PositionIndicatorKt {
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.compose.foundation.ScrollState scrollState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.wear.compose.material.ScalingLazyListState scalingLazyListState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
+    method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.compose.foundation.lazy.LazyListState lazyListState, optional androidx.compose.ui.Modifier modifier, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(float rsbRatio, optional androidx.compose.ui.Modifier modifier, optional long color, optional boolean reverseDirection);
     method @androidx.compose.runtime.Composable public static void PositionIndicator(androidx.wear.compose.material.PositionIndicatorState state, float indicatorHeight, float indicatorWidth, float paddingRight, optional androidx.compose.ui.Modifier modifier, optional long color, optional long background, optional boolean autoHide, optional boolean reverseDirection);
   }
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt
index 29f75d5..73fee0d 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt
@@ -26,6 +26,10 @@
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.LazyListLayoutInfo
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.rememberLazyListState
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.mutableStateOf
@@ -360,6 +364,289 @@
     }
 
     @Test
+    fun emptyLazyColumnGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(itemSpacingDp),
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .requiredSize(itemSizeDp * 3.5f + itemSpacingDp * 2.5f)
+            ) {
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            assertThat(
+                positionIndicatorState.positionFraction
+            ).isEqualTo(0)
+            assertThat(
+                positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+            ).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun lazyColumnNotLargeEnoughToScrollGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(itemSpacingDp),
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .requiredSize(itemSizeDp * 3.5f + itemSpacingDp * 2.5f)
+            ) {
+                items(3) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            assertThat(
+                positionIndicatorState.positionFraction
+            ).isEqualTo(0f)
+            assertThat(
+                positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+            ).isEqualTo(1f)
+        }
+    }
+
+    @Test
+    @Ignore("Offsets not being handled correctly due to b/198751807")
+    fun lazyColumnNotLargeEnoughToScrollSwapVerticalAlignmentGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(
+                    space = itemSpacingDp,
+                    alignment = Alignment.Bottom
+                ),
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .requiredSize(itemSizeDp * 3.5f + itemSpacingDp * 2.5f)
+            ) {
+                items(3) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            assertThat(
+                positionIndicatorState.positionFraction
+            ).isEqualTo(0f)
+            assertThat(
+                positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+            ).isEqualTo(1f)
+        }
+    }
+
+    @Test
+    fun scrollableLazyColumnGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(itemSpacingDp),
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .requiredHeight(
+                        // Exactly the right size to hold 3 items with spacing
+                        itemSizeDp * 3f + itemSpacingDp * 2f
+                    ),
+            ) {
+                items(5) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            // Scroll forwards
+            runBlocking {
+                state.scrollBy(itemSizePx.toFloat() + itemSpacingPx.toFloat())
+            }
+
+            // And that the indicator is at position 0.5 and of expected size
+            assertThat(
+                positionIndicatorState.positionFraction
+            ).isWithin(0.05f).of(0.5f)
+            assertThat(
+                positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+            ).isWithin(0.05f).of(0.6f)
+        }
+    }
+
+    @Test
+    fun emptyReverseLayoutLazyColumnGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(itemSpacingDp),
+                reverseLayout = true,
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .requiredSize(itemSizeDp * 3.5f + itemSpacingDp * 2.5f)
+            ) {
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            assertThat(
+                positionIndicatorState.positionFraction
+            ).isEqualTo(0)
+            assertThat(
+                positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+            ).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun reverseLayoutLazyColumnNotLargeEnoughToScrollGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(
+                    space = itemSpacingDp,
+                    alignment = Alignment.Bottom
+                ),
+                reverseLayout = true,
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .fillMaxWidth()
+                    .requiredSize(itemSizeDp * 3.5f + itemSpacingDp * 2.5f)
+                    .background(Color.DarkGray),
+            ) {
+                items(3) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            assertThat(
+                positionIndicatorState.positionFraction
+            ).isEqualTo(0f)
+            assertThat(
+                positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+            ).isEqualTo(1f)
+        }
+    }
+
+    @Test
+    fun reverseLayoutScrollableLazyColumnGivesCorrectPositionAndSize() {
+        lateinit var state: LazyListState
+        lateinit var positionIndicatorState: PositionIndicatorState
+        var viewPortHeight = 0
+        rule.setContent {
+            state = rememberLazyListState()
+            positionIndicatorState = LazyColumnStateAdapter(state)
+            LazyColumn(
+                state = state,
+                verticalArrangement = Arrangement.spacedBy(itemSpacingDp),
+                reverseLayout = false,
+                modifier = Modifier
+                    .onSizeChanged { viewPortHeight = it.height }
+                    .requiredHeight(
+                        // Exactly the right size to hold 3 items with spacing
+                        itemSizeDp * 3f + itemSpacingDp * 2f
+                    )
+            ) {
+                items(5) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+            PositionIndicator(
+                state = positionIndicatorState,
+                indicatorHeight = 50.dp,
+                indicatorWidth = 4.dp,
+                paddingRight = 5.dp,
+            )
+        }
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy((itemSizePx + itemSpacingPx).toFloat())
+            }
+        }
+        rule.waitForIdle()
+
+        // That the indicator is at position 0.5 and of expected size
+        assertThat(
+            positionIndicatorState.positionFraction
+        ).isWithin(0.05f).of(0.5f)
+        assertThat(
+            positionIndicatorState.sizeFraction(viewPortHeight.toFloat())
+        ).isWithin(0.05f).of(0.6f)
+    }
+
+    @Test
     fun emptyScrollableColumnGivesCorrectPositionAndSize() {
         lateinit var state: ScrollState
         lateinit var positionIndicatorState: PositionIndicatorState
@@ -625,6 +912,21 @@
         }
     }
 
+    private fun LazyListLayoutInfo.assertWhollyVisibleItems(
+        firstItemIndex: Int,
+        firstItemNotVisible: Int = 0,
+        lastItemIndex: Int,
+        lastItemNotVisible: Int = 0,
+        viewPortHeight: Int
+    ) {
+        assertThat(visibleItemsInfo.first().index).isEqualTo(firstItemIndex)
+        assertThat(visibleItemsInfo.first().offset).isEqualTo(firstItemNotVisible)
+        assertThat(visibleItemsInfo.last().index).isEqualTo(lastItemIndex)
+        assertThat(
+            viewPortHeight - (visibleItemsInfo.last().offset + visibleItemsInfo.last().size)
+        ).isEqualTo(lastItemNotVisible)
+    }
+
     private fun ScalingLazyListLayoutInfo.assertWhollyVisibleItems(
         firstItemIndex: Int,
         firstItemNotVisible: Int = 0,
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeToDismissBoxTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeToDismissBoxTest.kt
index 1a2637c..b86b4d8 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeToDismissBoxTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeToDismissBoxTest.kt
@@ -27,6 +27,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.TouchInjectionScope
 import androidx.compose.ui.test.assertIsOff
@@ -107,6 +108,31 @@
     }
 
     @Test
+    fun does_not_dismiss_if_has_background_is_false() {
+        var dismissed = false
+        rule.setContentWithTheme {
+            val state = rememberSwipeToDismissBoxState()
+            LaunchedEffect(state.currentValue) {
+                dismissed =
+                    state.currentValue == SwipeDismissTarget.Dismissal
+            }
+            SwipeToDismissBox(
+                state = state,
+                modifier = Modifier.testTag(TEST_TAG),
+                hasBackground = false,
+            ) {
+                Text(CONTENT_MESSAGE, color = MaterialTheme.colors.onPrimary)
+            }
+        }
+
+        rule.onNodeWithTag(TEST_TAG).performTouchInput({ swipeRight() })
+
+        rule.runOnIdle {
+            assertEquals(false, dismissed)
+        }
+    }
+
+    @Test
     fun remembers_saved_state() {
         val showCounterForContent = mutableStateOf(true)
         rule.setContentWithTheme {
@@ -225,12 +251,15 @@
             }
         }
 
-        // Advance the clock by half the length of time configured for the swipe gesture,
-        // so that the background ought to be revealed.
-        rule.mainClock.autoAdvance = false
-        rule.onNodeWithTag(TEST_TAG).performTouchInput { swipeRight(durationMillis = LONG_SWIPE) }
-        rule.waitForIdle()
-        rule.mainClock.advanceTimeBy(milliseconds = LONG_SWIPE / 2)
+        // Click down and drag across 1/4 of the screen to start a swipe,
+        // but don't release the finger, so that the screen can be inspected
+        // (note that swipeRight would release the finger and does not pause time midway).
+        rule.onNodeWithTag(TEST_TAG).performTouchInput(
+            {
+                down(Offset(x = 0f, y = height / 2f))
+                moveTo(Offset(x = width / 4f, y = height / 2f))
+            }
+        )
 
         rule.onNodeWithText(expectedMessage).assertExists()
     }
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt
index 21001c1..d9ccd32 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt
@@ -25,6 +25,7 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.Stable
@@ -132,6 +133,31 @@
 )
 
 /**
+ * Creates an [PositionIndicator] based on the values in a [LazyListState] object that
+ * a [LazyColumn] uses.
+ *
+ * @param lazyListState the [LazyListState] to use as the basis for the
+ * PositionIndicatorState.
+ * @param modifier The modifier to be applied to the component
+ */
+@OptIn(ExperimentalAnimationApi::class)
+@Composable
+public fun PositionIndicator(
+    lazyListState: LazyListState,
+    modifier: Modifier = Modifier,
+    reverseDirection: Boolean = false
+) = PositionIndicator(
+    state = LazyColumnStateAdapter(
+        state = lazyListState
+    ),
+    indicatorHeight = 50.dp,
+    indicatorWidth = 4.dp,
+    paddingRight = 5.dp,
+    modifier = modifier,
+    reverseDirection = reverseDirection
+)
+
+/**
  * Creates an [PositionIndicator] for a rotating side button or rotating bezel style indicator.
  *
  * @param rsbRatio the value of the rsb/bezel indicator in the range 0..1 where 1 represents the
@@ -386,7 +412,79 @@
         val firstItemOffset = firstItem.offset - state.layoutInfo.viewportStartOffset
         val decimalFirstItemIndex =
             if (firstItemOffset < 0)
-                firstItem.index.toFloat() + abs(firstItemOffset) / firstItem.size.toFloat()
+                firstItem.index.toFloat() +
+                    abs(firstItemOffset.toFloat()) / firstItem.size.toFloat()
+            else firstItem.index.toFloat()
+        return decimalFirstItemIndex
+    }
+}
+
+/**
+ * An implementation of [PositionIndicatorState] to display the amount and position of a
+ * [LazyColumn] component via its [LazyListState].
+ *
+ * @param state the [LazyListState] to adapt.
+ *
+ * @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ */
+internal class LazyColumnStateAdapter(
+    private val state: LazyListState
+) : PositionIndicatorState {
+    override val positionFraction: Float
+        get() {
+            return if (state.layoutInfo.visibleItemsInfo.isEmpty()) {
+                0.0f
+            } else {
+                val decimalFirstItemIndex = decimalFirstItemIndex()
+                val decimalLastItemIndex = decimalLastItemIndex()
+                val decimalLastItemIndexDistanceFromEnd = state.layoutInfo.totalItemsCount -
+                    decimalLastItemIndex
+
+                if (decimalFirstItemIndex + decimalLastItemIndexDistanceFromEnd == 0.0f) {
+                    0.0f
+                } else {
+                    decimalFirstItemIndex /
+                        (decimalFirstItemIndex + decimalLastItemIndexDistanceFromEnd)
+                }
+            }
+        }
+
+    override fun sizeFraction(scrollableContainerSizePx: Float) =
+        if (state.layoutInfo.totalItemsCount == 0) {
+            1.0f
+        } else {
+            val decimalFirstItemIndex = decimalFirstItemIndex()
+            val decimalLastItemIndex = decimalLastItemIndex()
+
+            (decimalLastItemIndex - decimalFirstItemIndex) /
+                state.layoutInfo.totalItemsCount.toFloat()
+        }
+
+    override fun hashCode(): Int {
+        return state.hashCode()
+    }
+
+    override fun equals(other: Any?): Boolean {
+        return (other as? LazyColumnStateAdapter)?.state == state
+    }
+
+    private fun decimalLastItemIndex(): Float {
+        if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0f
+        val lastItem = state.layoutInfo.visibleItemsInfo.last()
+        val lastItemVisibleSize = state.layoutInfo.viewportEndOffset - lastItem.offset
+        val decimalLastItemIndex = lastItem.index.toFloat() +
+            lastItemVisibleSize.toFloat() / lastItem.size.toFloat()
+        return decimalLastItemIndex
+    }
+
+    private fun decimalFirstItemIndex(): Float {
+        if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0f
+        val firstItem = state.layoutInfo.visibleItemsInfo.first()
+        val firstItemOffset = firstItem.offset - state.layoutInfo.viewportStartOffset
+        val decimalFirstItemIndex =
+            if (firstItemOffset < 0)
+                firstItem.index.toFloat() +
+                    abs(firstItemOffset.toFloat()) / firstItem.size.toFloat()
             else firstItem.index.toFloat()
         return decimalFirstItemIndex
     }
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
index 1ac2979..f7a437f 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
@@ -91,54 +91,50 @@
                 // Go Up
                 val centralItemIndex = centralItem.index
                 var nextItemBottomNoPadding = centerItemInfo.offset - gapBetweenItemsPx.value!!
-                (centralItemIndex - 1 downTo 0).forEach { ix ->
+                val minIndex =
+                    lazyListState.layoutInfo.visibleItemsInfo.minOf { it.index }
+                (centralItemIndex - 1 downTo minIndex).forEach { ix ->
                     val currentItem =
-                        lazyListState.layoutInfo.visibleItemsInfo.find { it.index == ix }
-                    if (currentItem != null) {
-                        val itemInfo = createItemInfo(
-                            nextItemBottomNoPadding - currentItem.size,
-                            currentItem,
-                            verticalAdjustment,
-                            viewportHeightPx.value!!,
-                            scalingParams.value!!,
-                        )
-                        // If the item is visible in the viewport insert it at the start of the
-                        // list
-                        if ((itemInfo.offset + itemInfo.size) > verticalAdjustment) {
-                            // Insert the item info at the front of the list
-                            visibleItemsInfo.add(0, itemInfo)
-                        }
-                        nextItemBottomNoPadding = itemInfo.offset - gapBetweenItemsPx.value!!
+                        lazyListState.layoutInfo.visibleItemsInfo.find { it.index == ix }!!
+                    val itemInfo = createItemInfo(
+                        nextItemBottomNoPadding - currentItem.size,
+                        currentItem,
+                        verticalAdjustment,
+                        viewportHeightPx.value!!,
+                        scalingParams.value!!,
+                    )
+                    // If the item is visible in the viewport insert it at the start of the
+                    // list
+                    if ((itemInfo.offset + itemInfo.size) > verticalAdjustment) {
+                        // Insert the item info at the front of the list
+                        visibleItemsInfo.add(0, itemInfo)
                     }
+                    nextItemBottomNoPadding = itemInfo.offset - gapBetweenItemsPx.value!!
                 }
                 // Go Down
                 var nextItemTopNoPadding =
                     centerItemInfo.offset + centerItemInfo.size +
                         gapBetweenItemsPx.value!!
-                (
-                    centralItemIndex + 1 until
-                        (centralItemIndex + lazyListState.layoutInfo.visibleItemsInfo.size)
+                val maxIndex =
+                    lazyListState.layoutInfo.visibleItemsInfo.maxOf { it.index }
+                (centralItemIndex + 1..maxIndex).forEach { ix ->
+                    val currentItem =
+                        lazyListState.layoutInfo.visibleItemsInfo.find { it.index == ix }!!
+                    val itemInfo = createItemInfo(
+                        nextItemTopNoPadding,
+                        currentItem,
+                        verticalAdjustment,
+                        viewportHeightPx.value!!,
+                        scalingParams.value!!,
                     )
-                    .forEach { ix ->
-                        val currentItem =
-                            lazyListState.layoutInfo.visibleItemsInfo.find { it.index == ix }
-                        if (currentItem != null) {
-                            val itemInfo = createItemInfo(
-                                nextItemTopNoPadding,
-                                currentItem,
-                                verticalAdjustment,
-                                viewportHeightPx.value!!,
-                                scalingParams.value!!,
-                            )
-                            // If the item is visible in the viewport insert it at the end of the
-                            // list
-                            if ((itemInfo.offset - verticalAdjustment) < viewportHeightPx.value!!) {
-                                visibleItemsInfo.add(itemInfo)
-                            }
-                            nextItemTopNoPadding =
-                                itemInfo.offset + itemInfo.size + gapBetweenItemsPx.value!!
-                        }
+                    // If the item is visible in the viewport insert it at the end of the
+                    // list
+                    if ((itemInfo.offset - verticalAdjustment) < viewportHeightPx.value!!) {
+                        visibleItemsInfo.add(itemInfo)
                     }
+                    nextItemTopNoPadding =
+                        itemInfo.offset + itemInfo.size + gapBetweenItemsPx.value!!
+                }
             }
             DefaultScalingLazyListLayoutInfo(
                 visibleItemsInfo = visibleItemsInfo,
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt
index 69c3799..7a492e6 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt
@@ -21,16 +21,20 @@
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
-import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.offset
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
 import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.Stable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.unit.IntOffset
 import kotlin.math.roundToInt
 
@@ -58,6 +62,8 @@
  * remembered state to be correctly moved between background and foreground.
  * @Param contentKey Optional [key] which identifies the content currently composed in the
  * [content] block when isBackground == false. See [backgroundKey].
+ * @Param hasBackground Optional [Boolean] used to indicate if the content has no background,
+ * in which case the swipe gesture is disabled (since there is no parent destination).
  * @param content Slot for content, with the isBackground parameter enabling content to be
  * displayed behind the foreground content - the background is normally hidden,
  * is shown behind a scrim during the swipe gesture,
@@ -69,29 +75,30 @@
     state: SwipeToDismissBoxState,
     modifier: Modifier = Modifier,
     scrimColor: Color = MaterialTheme.colors.surface,
-    backgroundKey: Any = DefaultBackgroundKey,
-    contentKey: Any = DefaultContentKey,
+    backgroundKey: Any = SwipeToDismissBoxDefaults.BackgroundKey,
+    contentKey: Any = SwipeToDismissBoxDefaults.ContentKey,
+    hasBackground: Boolean = true,
     content: @Composable BoxScope.(isBackground: Boolean) -> Unit
-) = BoxWithConstraints(modifier) {
-    val maxWidth = constraints.maxWidth.toFloat()
-    // Map pixel position to states - initially, don't know the width in pixels so omit upper bound.
-    val anchors =
-        mapOf(
-            0f to SwipeDismissTarget.Original,
-            maxWidth to SwipeDismissTarget.Dismissal
-        )
-
+) {
+    // Will be updated in onSizeChanged, initialise to any value other than zero
+    // so that it is different to the other anchor used for the swipe gesture.
+    var maxWidth by remember { mutableStateOf(1f) }
     Box(
-        modifier = Modifier
+        modifier = modifier
             .fillMaxSize()
+            .onSizeChanged { maxWidth = it.width.toFloat() }
             .swipeable(
                 state = state,
-                anchors = anchors,
+                enabled = hasBackground,
+                anchors = anchors(maxWidth),
                 thresholds = { _, _ -> FractionalThreshold(SwipeThreshold) },
                 orientation = Orientation.Horizontal
             )
     ) {
         val offsetPx = state.offset.value.roundToInt()
+        // This temporary variable added to workaround an error
+        // thrown by the compose runtime - see b/199136503, avoids "Invalid Start Index" exception.
+        val pxModifier = Modifier.offset { IntOffset(offsetPx, 0) }.fillMaxSize()
         repeat(2) {
             val isBackground = it == 0
             // TODO(b/193606660): Add animations that follow after swipe confirmation.
@@ -101,18 +108,19 @@
                 } else {
                     if (isBackground) SwipeConfirmedBackgroundAlpha else SwipeConfirmedContentAlpha
                 }
-            val contentModifier =
-                if (isBackground)
-                    Modifier.fillMaxSize()
-                else
-                    Modifier.offset { IntOffset(offsetPx, 0) }.fillMaxSize()
+            val contentModifier = if (isBackground) Modifier.fillMaxSize() else pxModifier
             key(if (isBackground) backgroundKey else contentKey) {
-                if (!isBackground || offsetPx > 0) {
+                if (!isBackground || (hasBackground && offsetPx > 0)) {
                     Box(contentModifier) {
+                        // We use the repeat loop above and call content at this location
+                        // for both background and foreground so that any persistence
+                        // within the content composable has the same call stack which is used
+                        // as part of the hash identity for saveable state.
                         content(isBackground)
                         Box(
                             modifier = Modifier
-                                .matchParentSize().background(scrimColor.copy(alpha = scrimAlpha))
+                                .matchParentSize()
+                                .background(scrimColor.copy(alpha = scrimAlpha))
                         )
                     }
                 }
@@ -186,7 +194,24 @@
  */
 @ExperimentalWearMaterialApi
 public object SwipeToDismissBoxDefaults {
+    /**
+     * The default animation that will be used to animate to a new state after the swipe gesture.
+     */
     public val AnimationSpec = SwipeableDefaults.AnimationSpec
+
+    /**
+     * The default background key to identify the content displayed by the content block
+     * when isBackground == true. Specifying a background key instead of using the default
+     * allows remembered state to be correctly moved between background and foreground.
+     */
+    public val BackgroundKey: Any = "background"
+
+    /**
+     * The default content key to identify the content displayed by the content block
+     * when isBackground == false. Specifying a background key instead of using the default
+     * allows remembered state to be correctly moved between background and foreground.
+     */
+    public val ContentKey: Any = "content"
 }
 
 /**
@@ -205,8 +230,14 @@
     Dismissal
 }
 
-private val DefaultBackgroundKey = "background"
-private val DefaultContentKey = "content"
+// Map pixel position to states - initially, don't know the width in pixels so omit upper bound.
+@ExperimentalWearMaterialApi
+private fun anchors(maxWidth: Float): Map<Float, SwipeDismissTarget> =
+    mapOf(
+        0f to SwipeDismissTarget.Original,
+        maxWidth to SwipeDismissTarget.Dismissal
+    )
+
 private val SwipeStartedBackgroundAlpha = 0.5f
 private val SwipeConfirmedBackgroundAlpha = 0.0f
 private val SwipeStartedContentAlpha = 0.0f
diff --git a/wear/compose/compose-navigation/api/current.txt b/wear/compose/compose-navigation/api/current.txt
index 1fb4c19..81ac586 100644
--- a/wear/compose/compose-navigation/api/current.txt
+++ b/wear/compose/compose-navigation/api/current.txt
@@ -1,21 +1,8 @@
 // Signature format: 4.0
 package androidx.wear.compose.navigation {
 
-  public final class NamedNavArgument {
-    method public operator String component1();
-    method public operator androidx.navigation.NavArgument component2();
-    method public androidx.navigation.NavArgument getArgument();
-    method public String getName();
-    property public final androidx.navigation.NavArgument argument;
-    property public final String name;
-  }
-
-  public final class NamedNavArgumentKt {
-    method @androidx.navigation.NavDestinationDsl public static androidx.wear.compose.navigation.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
-  }
-
   public final class NavGraphBuilderKt {
-    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.wear.compose.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
   }
 
   public final class SwipeDismissableNavHostControllerKt {
diff --git a/wear/compose/compose-navigation/api/public_plus_experimental_current.txt b/wear/compose/compose-navigation/api/public_plus_experimental_current.txt
index 675ae65..cb3dc89 100644
--- a/wear/compose/compose-navigation/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-navigation/api/public_plus_experimental_current.txt
@@ -1,21 +1,8 @@
 // Signature format: 4.0
 package androidx.wear.compose.navigation {
 
-  public final class NamedNavArgument {
-    method public operator String component1();
-    method public operator androidx.navigation.NavArgument component2();
-    method public androidx.navigation.NavArgument getArgument();
-    method public String getName();
-    property public final androidx.navigation.NavArgument argument;
-    property public final String name;
-  }
-
-  public final class NamedNavArgumentKt {
-    method @androidx.navigation.NavDestinationDsl public static androidx.wear.compose.navigation.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
-  }
-
   public final class NavGraphBuilderKt {
-    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.wear.compose.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
   }
 
   public final class SwipeDismissableNavHostControllerKt {
diff --git a/wear/compose/compose-navigation/api/restricted_current.txt b/wear/compose/compose-navigation/api/restricted_current.txt
index 1fb4c19..81ac586 100644
--- a/wear/compose/compose-navigation/api/restricted_current.txt
+++ b/wear/compose/compose-navigation/api/restricted_current.txt
@@ -1,21 +1,8 @@
 // Signature format: 4.0
 package androidx.wear.compose.navigation {
 
-  public final class NamedNavArgument {
-    method public operator String component1();
-    method public operator androidx.navigation.NavArgument component2();
-    method public androidx.navigation.NavArgument getArgument();
-    method public String getName();
-    property public final androidx.navigation.NavArgument argument;
-    property public final String name;
-  }
-
-  public final class NamedNavArgumentKt {
-    method @androidx.navigation.NavDestinationDsl public static androidx.wear.compose.navigation.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
-  }
-
   public final class NavGraphBuilderKt {
-    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.wear.compose.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+    method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
   }
 
   public final class SwipeDismissableNavHostControllerKt {
diff --git a/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt b/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt
index 6bf999c..5cab501 100644
--- a/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt
+++ b/wear/compose/compose-navigation/src/androidTest/kotlin/androidx/wear/compose/navigation/SwipeDismissableNavHostTest.kt
@@ -22,7 +22,9 @@
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
 import androidx.compose.runtime.setValue
+import androidx.compose.testutils.WithTouchSlop
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
@@ -38,7 +40,6 @@
 import androidx.wear.compose.material.MaterialTheme
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.ToggleButton
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 
@@ -100,20 +101,26 @@
     @Test
     fun displays_previous_screen_during_swipe_gesture() {
         rule.setContentWithTheme {
-            SwipeDismissWithNavigation()
+            WithTouchSlop(0f) {
+                SwipeDismissWithNavigation()
+            }
         }
 
-        // Click to move to next destination then pause during a long swipe to dismiss.
+        // Click to move to next destination.
         rule.onNodeWithText(START).performClick()
-        rule.mainClock.autoAdvance = false
-        rule.onNodeWithTag(TEST_TAG).performTouchInput({ swipeRight() })
-        rule.mainClock.advanceTimeBy(milliseconds = LONG_SWIPE / 2)
+        // Click and drag to being a swipe gesture, but do not release the finger.
+        rule.onNodeWithTag(TEST_TAG).performTouchInput(
+            {
+                down(Offset(x = 0f, y = height / 2f))
+                moveTo(Offset(x = width / 4f, y = height / 2f))
+            }
+        )
 
+        // As the finger is still 'down', the background should be visible.
         rule.onNodeWithText(START).assertExists()
     }
 
     @Test
-    @Ignore // TODO(stevebower): reinstate test once aosp/1818154 has been submitted.
     fun destinations_keep_saved_state() {
         val screenId = mutableStateOf(START)
         rule.setContentWithTheme {
diff --git a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NavGraphBuilder.kt b/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NavGraphBuilder.kt
index 3efbce7..869a89f 100644
--- a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NavGraphBuilder.kt
+++ b/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/NavGraphBuilder.kt
@@ -17,6 +17,7 @@
 package androidx.wear.compose.navigation
 
 import androidx.compose.runtime.Composable
+import androidx.navigation.NamedNavArgument
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDeepLink
 import androidx.navigation.NavGraphBuilder
diff --git a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/SwipeDismissableNavHost.kt b/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/SwipeDismissableNavHost.kt
index 9e61241..a91eb3e5d 100644
--- a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/SwipeDismissableNavHost.kt
+++ b/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/SwipeDismissableNavHost.kt
@@ -39,6 +39,7 @@
 import androidx.wear.compose.material.ExperimentalWearMaterialApi
 import androidx.wear.compose.material.SwipeDismissTarget
 import androidx.wear.compose.material.SwipeToDismissBox
+import androidx.wear.compose.material.SwipeToDismissBoxDefaults
 import androidx.wear.compose.material.rememberSwipeToDismissBoxState
 
 /**
@@ -141,9 +142,12 @@
     SwipeToDismissBox(
         state = state,
         modifier = Modifier,
+        hasBackground = previous != null,
+        backgroundKey = previous?.id ?: SwipeToDismissBoxDefaults.BackgroundKey,
+        contentKey = current?.id ?: SwipeToDismissBoxDefaults.ContentKey,
         content = { isBackground ->
             BoxedStackEntryContent(if (isBackground) previous else current, stateHolder, modifier)
-        },
+        }
     )
 }
 
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt
index ee0484b..51e674a 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt
@@ -18,13 +18,9 @@
 
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
@@ -35,92 +31,98 @@
 import androidx.wear.compose.material.Card
 import androidx.wear.compose.material.CardDefaults
 import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.ScalingLazyColumn
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.TitleCard
 
 @Composable
 fun CardDemo() {
-    Column(
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(
+            space = 4.dp,
+            alignment = Alignment.CenterVertically
+        ),
+        contentPadding = PaddingValues(horizontal = 8.dp, vertical = 30.dp),
         modifier = Modifier.fillMaxSize()
-            .padding(start = 8.dp, end = 8.dp)
-            .verticalScroll(
-                rememberScrollState()
-            ),
-        verticalArrangement = Arrangement.Center,
-        horizontalAlignment = Alignment.CenterHorizontally
     ) {
-        Spacer(modifier = Modifier.size(30.dp))
-        Card(
-            onClick = {},
-            modifier = Modifier.fillMaxWidth()
-        ) {
-            Column(modifier = Modifier.fillMaxWidth()) {
-                Text("Basic unopinionated chip")
-                Text("Sets the shape")
-                Text("and the background")
+        item {
+            Card(
+                onClick = {},
+                modifier = Modifier.fillMaxWidth()
+            ) {
+                Column(modifier = Modifier.fillMaxWidth()) {
+                    Text("Basic unopinionated chip")
+                    Text("Sets the shape")
+                    Text("and the background")
+                }
             }
         }
-        Spacer(modifier = Modifier.size(4.dp))
-        AppCard(
-            onClick = {},
-            appName = { Text("AppName") },
-            title = { Text("AppCard") },
-            time = { Text("now") },
-            body = {
-                Column(modifier = Modifier.fillMaxWidth()) {
-                    Text("Some body content")
-                    Text("and some more body content")
+        item {
+            AppCard(
+                onClick = {},
+                appName = { Text("AppName") },
+                title = { Text("AppCard") },
+                time = { Text("now") },
+                body = {
+                    Column(modifier = Modifier.fillMaxWidth()) {
+                        Text("Some body content")
+                        Text("and some more body content")
+                    }
+                },
+            )
+        }
+        item {
+            TitleCard(
+                onClick = {},
+                title = { Text("TitleCard") },
+                time = { Text("now") },
+                body = {
+                    Column(modifier = Modifier.fillMaxWidth()) {
+                        Text("Some body content")
+                        Text("and some more body content")
+                    }
+                },
+            )
+        }
+        item {
+            TitleCard(
+                onClick = {},
+                title = { Text("TitleCard") },
+                body = {
+                    Column(modifier = Modifier.fillMaxWidth()) {
+                        Text("This title card doesn't show time")
+                    }
                 }
-            },
-        )
-        Spacer(modifier = Modifier.size(4.dp))
-        TitleCard(
-            onClick = {},
-            title = { Text("TitleCard") },
-            time = { Text("now") },
-            body = {
-                Column(modifier = Modifier.fillMaxWidth()) {
-                    Text("Some body content")
-                    Text("and some more body content")
-                }
-            },
-        )
-        Spacer(modifier = Modifier.size(4.dp))
-        TitleCard(
-            onClick = {},
-            title = { Text("TitleCard") },
-            body = {
-                Column(modifier = Modifier.fillMaxWidth()) {
-                    Text("This title card doesn't show time")
-                }
-            }
-        )
-        Spacer(modifier = Modifier.size(4.dp))
-        TitleCard(
-            onClick = {},
-            title = { Text("Custom TitleCard") },
-            body = {
-                Column(modifier = Modifier.fillMaxWidth()) {
-                    Text("This title card emphasises the title with custom color")
-                }
-            },
-            titleColor = Color.Yellow
-        )
-        Spacer(modifier = Modifier.size(4.dp))
-        TitleCard(
-            onClick = {},
-            title = { Text("TitleCard With an ImageBackground") },
-            body = {
-                Column(modifier = Modifier.fillMaxWidth()) {
-                    Text("Text coloured to stand out on the image")
-                }
-            },
-            backgroundPainter = CardDefaults.imageWithScrimBackgroundPainter(
-                backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1)
-            ),
-            bodyColor = MaterialTheme.colors.onSurface,
-            titleColor = MaterialTheme.colors.onSurface,
-        )
-        Spacer(modifier = Modifier.size(30.dp))
+            )
+        }
+        item {
+            TitleCard(
+                onClick = {},
+                title = { Text("Custom TitleCard") },
+                body = {
+                    Column(modifier = Modifier.fillMaxWidth()) {
+                        Text("This title card emphasises the title with custom color")
+                    }
+                },
+                titleColor = Color.Yellow
+            )
+        }
+        item {
+            TitleCard(
+                onClick = {},
+                title = { Text("TitleCard With an ImageBackground") },
+                body = {
+                    Column(modifier = Modifier.fillMaxWidth()) {
+                        Text("Text coloured to stand out on the image")
+                    }
+                },
+                backgroundPainter = CardDefaults.imageWithScrimBackgroundPainter(
+                    backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1)
+                ),
+                bodyColor = MaterialTheme.colors.onSurface,
+                titleColor = MaterialTheme.colors.onSurface,
+            )
+        }
     }
 }
\ No newline at end of file
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt
index e8ce92c..edd37d2 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt
@@ -17,7 +17,6 @@
 package androidx.wear.compose.integration.demos
 
 import android.widget.Toast
-import androidx.compose.foundation.ScrollState
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.PaddingValues
@@ -28,8 +27,6 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.wrapContentWidth
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
@@ -51,6 +48,7 @@
 import androidx.wear.compose.material.ChipDefaults
 import androidx.wear.compose.material.CompactChip
 import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.ScalingLazyColumn
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.ToggleButton
 import androidx.wear.compose.material.ToggleChip
@@ -58,329 +56,223 @@
 
 @Composable
 fun StandardChips() {
-    val scrollState: ScrollState = rememberScrollState()
     var enabled by remember { mutableStateOf(true) }
     var chipStyle by remember { mutableStateOf(ChipStyle.Primary) }
 
-    Column(
-        modifier = Modifier.verticalScroll(scrollState)
-            .padding(
-                PaddingValues(
-                    start = 8.dp,
-                    end = 8.dp,
-                    top = 15.dp,
-                    bottom = 50.dp
-                )
-            ),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
+        contentPadding = PaddingValues(
+            start = 8.dp,
+            end = 8.dp,
+            top = 15.dp,
+            bottom = 50.dp
+        )
     ) {
-        Text(
-            text = "Chip with Label",
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            textAlign = TextAlign.Center,
-            style = MaterialTheme.typography.caption1,
-            color = Color.White
-        )
-        DemoLabelChip(
-            label = "Single Label",
-            colors = chipColors(chipStyle),
-            enabled = enabled,
-        )
-        DemoLabelChip(
-            label = "Standard chip with long label to show truncation which does not fit into" +
-                " 2 lines",
-            colors = chipColors(chipStyle),
-            enabled = enabled,
-        )
-        Text(
-            "Chip with icon",
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            textAlign = TextAlign.Center,
-            style = MaterialTheme.typography.caption1
-        )
-        DemoIconChip(
-            colors = chipColors(chipStyle),
-            label = "Label with icon",
-            enabled = enabled,
-        ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
-
-        DemoIconChip(
-            colors = chipColors(chipStyle),
-            label = "Long label to show truncation which does not fit into" +
-                " 2 lines",
-            enabled = enabled,
-        ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
-        Text(
-            "Main + Secondary label",
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            textAlign = TextAlign.Center,
-            style = MaterialTheme.typography.caption1
-        )
-        DemoLabelChip(
-            label = "Main label and",
-            secondaryLabel = "Secondary label",
-            colors = chipColors(chipStyle),
-            enabled = enabled,
-        )
-        DemoLabelChip(
-            label = "Long label to show truncation which does not fit into" +
-                " 1 line",
-            secondaryLabel = "Secondary Label",
-            colors = chipColors(chipStyle),
-            enabled = enabled,
-        )
-        DemoIconChip(
-            colors = chipColors(chipStyle),
-            label = "Label with icon and",
-            secondaryLabel = "Secondary Label",
-            enabled = enabled,
-        ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
-        DemoIconChip(
-            colors = chipColors(chipStyle),
-            label = "Long label with truncation",
-            secondaryLabel = "Long secondary label to show truncation which does not fit into" +
-                "1 line",
-            enabled = enabled,
-        ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
-        ChipCustomizer(
-            enabled = enabled,
-            chipStyle = chipStyle,
-            onChipStyleChanged = { chipStyle = it },
-            onEnabledChanged = { enabled = it },
-        )
+        item {
+            Text(
+                text = "Chip with Label",
+                textAlign = TextAlign.Center,
+                style = MaterialTheme.typography.caption1,
+                color = Color.White
+            )
+        }
+        item {
+            DemoLabelChip(
+                label = "Single Label",
+                colors = chipColors(chipStyle),
+                enabled = enabled,
+            )
+        }
+        item {
+            DemoLabelChip(
+                label = "Standard chip with long label to show truncation which does not fit into" +
+                    " 2 lines",
+                colors = chipColors(chipStyle),
+                enabled = enabled,
+            )
+        }
+        item {
+            Text(
+                "Chip with icon",
+                textAlign = TextAlign.Center,
+                style = MaterialTheme.typography.caption1
+            )
+        }
+        item {
+            DemoIconChip(
+                colors = chipColors(chipStyle),
+                label = "Label with icon",
+                enabled = enabled,
+            ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
+        }
+        item {
+            DemoIconChip(
+                colors = chipColors(chipStyle),
+                label = "Long label to show truncation which does not fit into" +
+                    " 2 lines",
+                enabled = enabled,
+            ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
+        }
+        item {
+            Text(
+                "Main + Secondary label",
+                textAlign = TextAlign.Center,
+                style = MaterialTheme.typography.caption1
+            )
+        }
+        item {
+            DemoLabelChip(
+                label = "Main label and",
+                secondaryLabel = "Secondary label",
+                colors = chipColors(chipStyle),
+                enabled = enabled,
+            )
+        }
+        item {
+            DemoLabelChip(
+                label = "Long label to show truncation which does not fit into" +
+                    " 1 line",
+                secondaryLabel = "Secondary Label",
+                colors = chipColors(chipStyle),
+                enabled = enabled,
+            )
+        }
+        item {
+            DemoIconChip(
+                colors = chipColors(chipStyle),
+                label = "Label with icon and",
+                secondaryLabel = "Secondary Label",
+                enabled = enabled,
+            ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
+        }
+        item {
+            DemoIconChip(
+                colors = chipColors(chipStyle),
+                label = "Long label with truncation",
+                secondaryLabel = "Long secondary label to show truncation which does not fit into" +
+                    "1 line",
+                enabled = enabled,
+            ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
+        }
+        item {
+            ChipCustomizer(
+                enabled = enabled,
+                chipStyle = chipStyle,
+                onChipStyleChanged = { chipStyle = it },
+                onEnabledChanged = { enabled = it },
+            )
+        }
     }
 }
 
 @Composable
 fun SmallChips() {
-    val scrollState: ScrollState = rememberScrollState()
     var enabled by remember { mutableStateOf(true) }
     var chipStyle by remember { mutableStateOf(ChipStyle.Primary) }
 
-    Column(
-        modifier = Modifier.verticalScroll(scrollState)
-            .padding(
-                PaddingValues(
-                    start = 8.dp,
-                    end = 8.dp,
-                    top = 15.dp,
-                    bottom = 50.dp
-                )
-            ),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
+        contentPadding = PaddingValues(
+            start = 8.dp,
+            end = 8.dp,
+            top = 15.dp,
+            bottom = 50.dp
+        )
     ) {
-        Text(
-            text = "Compact Chip",
-            style = MaterialTheme.typography.body2,
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            color = Color.White
-        )
-
-        CompactChip(
-            onClick = {},
-            colors = chipColors(chipStyle),
-            label = { Text("Label") },
-            enabled = enabled,
-        )
-        CompactChip(
-            onClick = {},
-            colors = chipColors(chipStyle),
-            label = {
-                Text(
-                    "Long label to show truncation which does not fit into 1 line",
-                    maxLines = 1, overflow = TextOverflow.Ellipsis
-                )
-            },
-            enabled = enabled,
-        )
-        CompactChip(
-            onClick = {},
-            colors = chipColors(chipStyle),
-            label = {
-                Text("Label with icon", maxLines = 1, overflow = TextOverflow.Ellipsis)
-            },
-            icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
-            enabled = enabled,
-        )
-        CompactChip(
-            onClick = {},
-            colors = chipColors(chipStyle),
-            label = {
-                Text(
-                    "Label with icon to show truncation which does not fit into 1 line",
-                    maxLines = 1, overflow = TextOverflow.Ellipsis
-                )
-            },
-            enabled = enabled,
-            icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
-        )
-        ChipCustomizer(
-            enabled = enabled,
-            chipStyle = chipStyle,
-            onChipStyleChanged = { chipStyle = it },
-            onEnabledChanged = { enabled = it },
-        )
+        item {
+            Text(
+                text = "Compact Chip",
+                textAlign = TextAlign.Center,
+                style = MaterialTheme.typography.body2,
+                color = Color.White
+            )
+        }
+        item {
+            CompactChip(
+                onClick = {},
+                colors = chipColors(chipStyle),
+                label = { Text("Label") },
+                enabled = enabled,
+            )
+        }
+        item {
+            CompactChip(
+                onClick = {},
+                colors = chipColors(chipStyle),
+                label = {
+                    Text(
+                        "Long label to show truncation which does not fit into 1 line",
+                        maxLines = 1, overflow = TextOverflow.Ellipsis
+                    )
+                },
+                enabled = enabled,
+            )
+        }
+        item {
+            CompactChip(
+                onClick = {},
+                colors = chipColors(chipStyle),
+                label = {
+                    Text("Label with icon", maxLines = 1, overflow = TextOverflow.Ellipsis)
+                },
+                icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
+                enabled = enabled,
+            )
+        }
+        item {
+            CompactChip(
+                onClick = {},
+                colors = chipColors(chipStyle),
+                label = {
+                    Text(
+                        "Label with icon to show truncation which does not fit into 1 line",
+                        maxLines = 1, overflow = TextOverflow.Ellipsis
+                    )
+                },
+                enabled = enabled,
+                icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
+            )
+        }
+        item {
+            ChipCustomizer(
+                enabled = enabled,
+                chipStyle = chipStyle,
+                onChipStyleChanged = { chipStyle = it },
+                onEnabledChanged = { enabled = it },
+            )
+        }
     }
 }
 
 @Composable
 fun AvatarChips() {
-    val scrollState: ScrollState = rememberScrollState()
     var enabled by remember { mutableStateOf(true) }
 
-    Column(
-        modifier = Modifier.verticalScroll(scrollState)
-            .padding(
-                PaddingValues(
-                    start = 8.dp,
-                    end = 8.dp,
-                    top = 15.dp,
-                    bottom = 50.dp
-                )
-            ),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
+        contentPadding = PaddingValues(
+            start = 8.dp,
+            end = 8.dp,
+            top = 15.dp,
+            bottom = 50.dp
+        )
     ) {
-        Text(
-            text = "Chips with avatars",
-            style = MaterialTheme.typography.body2,
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            color = Color.White
-        )
-        DemoIconChip(
-            label = "Chip with text icon",
-            colors = ChipDefaults.secondaryChipColors(),
-            enabled = enabled,
-        ) {
-            TextIcon(
-                text = "M",
-                size = ChipDefaults.LargeIconSize,
-                style = MaterialTheme.typography.title3
+        item {
+            Text(
+                text = "Chips with avatars",
+                textAlign = TextAlign.Center,
+                style = MaterialTheme.typography.body2,
+                color = Color.White
             )
         }
-        DemoIconChip(
-            label = "Chip with text icon",
-            secondaryLabel = "And secondary label",
-            colors = ChipDefaults.secondaryChipColors(),
-            enabled = enabled,
-        ) {
-            TextIcon(
-                text = "M",
-                size = ChipDefaults.LargeIconSize,
-                style = MaterialTheme.typography.title3
-            )
-        }
-        Text(
-            text = "Small Avatar Chips",
-            style = MaterialTheme.typography.body2,
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            color = Color.White
-        )
-        DemoIconChip(
-            label = "App Title",
-            secondaryLabel = "Custom background & content color",
-            colors = ChipDefaults.primaryChipColors(
-                backgroundColor = Color(0x775FB2FF),
-                contentColor = MaterialTheme.colors.onPrimary
-            ),
-            enabled = enabled,
-        ) {
-            DemoImage(resourceId = R.drawable.ic_maps_icon)
-        }
-        DemoIconChip(
-            label = "App title",
-            secondaryLabel = "Default color with gradient",
-            colors = ChipDefaults.gradientBackgroundChipColors(),
-            enabled = enabled,
-        ) {
-            DemoImage(resourceId = R.drawable.ic_maps_icon)
-        }
-        DemoIconChip(
-            label = "App title",
-            secondaryLabel = "Gradient background and onPrimary content",
-            colors = ChipDefaults.gradientBackgroundChipColors(
-                startBackgroundColor = Color(0x775FB2FF),
-                contentColor = MaterialTheme.colors.onPrimary
-            ),
-            enabled = enabled,
-        ) {
-            DemoImage(resourceId = R.drawable.ic_maps_icon)
-        }
-        DemoIconChip(
-            label = "App title",
-            secondaryLabel = "Gradient background and custom content",
-            colors = ChipDefaults.gradientBackgroundChipColors(
-                startBackgroundColor = Color(0x775FB2FF),
-                contentColor = Color.LightGray
-            ),
-            enabled = enabled,
-        ) {
-            DemoImage(resourceId = R.drawable.ic_maps_icon)
-        }
-        ToggleChip(
-            checked = enabled,
-            onCheckedChange = { enabled = it },
-            label = {
-                Text("Chips enabled")
-            },
-            toggleIcon = {
-                ToggleChipDefaults.SwitchIcon(checked = enabled)
-            }
-        )
-    }
-}
-
-@Composable
-fun RtlChips() {
-    val scrollState: ScrollState = rememberScrollState()
-
-    Column(
-        modifier = Modifier.verticalScroll(scrollState)
-            .padding(
-                PaddingValues(
-                    start = 8.dp,
-                    end = 8.dp,
-                    top = 15.dp,
-                    bottom = 50.dp
-                )
-            ),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
-    ) {
-        Text(
-            text = "Right to left chips",
-            modifier = Modifier.align(Alignment.CenterHorizontally),
-            textAlign = TextAlign.Center,
-            style = MaterialTheme.typography.caption1,
-            color = Color.White
-        )
-        CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-            DemoLabelChip(
-                label = "Standard chip",
-                colors = ChipDefaults.primaryChipColors(),
-            )
-            DemoLabelChip(
-                label = "Standard chip with long label to show truncation which does not fit into" +
-                    " 2 lines",
-                colors = ChipDefaults.primaryChipColors(),
-            )
-            DemoIconChip(
-                colors = ChipDefaults.primaryChipColors(),
-                label = "Standard chip with ",
-                secondaryLabel = "Secondary Label",
-            ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
-            CompactChip(
-                onClick = {},
-                colors = ChipDefaults.primaryChipColors(),
-                label = {
-                    Text(
-                        "Compact chip with label & icon", maxLines = 1,
-                        overflow = TextOverflow.Ellipsis
-                    )
-                },
-                icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
-            )
+        item {
             DemoIconChip(
                 label = "Chip with text icon",
                 colors = ChipDefaults.secondaryChipColors(),
+                enabled = enabled,
             ) {
                 TextIcon(
                     text = "M",
@@ -388,187 +280,355 @@
                     style = MaterialTheme.typography.title3
                 )
             }
+        }
+        item {
             DemoIconChip(
-                label = "Standard chip with",
-                secondaryLabel = "Default gradient color",
-                colors = ChipDefaults.gradientBackgroundChipColors(),
+                label = "Chip with text icon",
+                secondaryLabel = "And secondary label",
+                colors = ChipDefaults.secondaryChipColors(),
+                enabled = enabled,
+            ) {
+                TextIcon(
+                    text = "M",
+                    size = ChipDefaults.LargeIconSize,
+                    style = MaterialTheme.typography.title3
+                )
+            }
+        }
+        item {
+            Text(
+                text = "Small Avatar Chips",
+                textAlign = TextAlign.Center,
+                style = MaterialTheme.typography.body2,
+                color = Color.White
+            )
+        }
+        item {
+            DemoIconChip(
+                label = "App Title",
+                secondaryLabel = "Custom background & content color",
+                colors = ChipDefaults.primaryChipColors(
+                    backgroundColor = Color(0x775FB2FF),
+                    contentColor = MaterialTheme.colors.onPrimary
+                ),
+                enabled = enabled,
             ) {
                 DemoImage(resourceId = R.drawable.ic_maps_icon)
             }
         }
+        item {
+            DemoIconChip(
+                label = "App title",
+                secondaryLabel = "Default color with gradient",
+                colors = ChipDefaults.gradientBackgroundChipColors(),
+                enabled = enabled,
+            ) {
+                DemoImage(resourceId = R.drawable.ic_maps_icon)
+            }
+        }
+        item {
+            DemoIconChip(
+                label = "App title",
+                secondaryLabel = "Gradient background and onPrimary content",
+                colors = ChipDefaults.gradientBackgroundChipColors(
+                    startBackgroundColor = Color(0x775FB2FF),
+                    contentColor = MaterialTheme.colors.onPrimary
+                ),
+                enabled = enabled,
+            ) {
+                DemoImage(resourceId = R.drawable.ic_maps_icon)
+            }
+        }
+        item {
+            DemoIconChip(
+                label = "App title",
+                secondaryLabel = "Gradient background and custom content",
+                colors = ChipDefaults.gradientBackgroundChipColors(
+                    startBackgroundColor = Color(0x775FB2FF),
+                    contentColor = Color.LightGray
+                ),
+                enabled = enabled,
+            ) {
+                DemoImage(resourceId = R.drawable.ic_maps_icon)
+            }
+        }
+        item {
+            ToggleChip(
+                checked = enabled,
+                onCheckedChange = { enabled = it },
+                label = {
+                    Text("Chips enabled")
+                },
+                toggleIcon = {
+                    ToggleChipDefaults.SwitchIcon(checked = enabled)
+                }
+            )
+        }
+    }
+}
+
+@Composable
+fun RtlChips() {
+    CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+        ScalingLazyColumn(
+            horizontalAlignment = Alignment.CenterHorizontally,
+            verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
+            contentPadding = PaddingValues(
+                start = 8.dp,
+                end = 8.dp,
+                top = 15.dp,
+                bottom = 50.dp
+            )
+        ) {
+            item {
+                Text(
+                    text = "Right to left chips",
+                    textAlign = TextAlign.Center,
+                    style = MaterialTheme.typography.caption1,
+                    color = Color.White
+                )
+            }
+            item {
+                DemoLabelChip(
+                    label = "Standard chip",
+                    colors = ChipDefaults.primaryChipColors(),
+                )
+            }
+            item {
+                DemoLabelChip(
+                    label = "Standard chip with long label to show truncation " +
+                        "which does not fit into 2 lines",
+                    colors = ChipDefaults.primaryChipColors(),
+                )
+            }
+            item {
+                DemoIconChip(
+                    colors = ChipDefaults.primaryChipColors(),
+                    label = "Standard chip with ",
+                    secondaryLabel = "Secondary Label",
+                ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
+            }
+            item {
+                CompactChip(
+                    onClick = {},
+                    colors = ChipDefaults.primaryChipColors(),
+                    label = {
+                        Text(
+                            "Compact chip with label & icon", maxLines = 1,
+                            overflow = TextOverflow.Ellipsis
+                        )
+                    },
+                    icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
+                )
+            }
+            item {
+                DemoIconChip(
+                    label = "Chip with text icon",
+                    colors = ChipDefaults.secondaryChipColors(),
+                ) {
+                    TextIcon(
+                        text = "M",
+                        size = ChipDefaults.LargeIconSize,
+                        style = MaterialTheme.typography.title3
+                    )
+                }
+            }
+            item {
+                DemoIconChip(
+                    label = "Standard chip with",
+                    secondaryLabel = "Default gradient color",
+                    colors = ChipDefaults.gradientBackgroundChipColors(),
+                ) {
+                    DemoImage(resourceId = R.drawable.ic_maps_icon)
+                }
+            }
+        }
     }
 }
 
 @Composable
 fun CustomChips() {
     val applicationContext = LocalContext.current
-    val scrollState: ScrollState = rememberScrollState()
     var enabled by remember { mutableStateOf(true) }
 
-    Column(
-        modifier = Modifier.verticalScroll(scrollState)
-            .padding(
-                PaddingValues(
-                    start = 8.dp,
-                    end = 8.dp,
-                    top = 15.dp,
-                    bottom = 50.dp
-                )
-            ),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
+        contentPadding = PaddingValues(
+            start = 8.dp,
+            end = 8.dp,
+            top = 15.dp,
+            bottom = 50.dp
+        )
     ) {
-
-        MaterialTheme(colors = MaterialTheme.colors.copy(primary = Color.Cyan)) {
-            DemoIconChip(
-                label = "Overridden Theme Primary + Icon",
-                colors = ChipDefaults.primaryChipColors(),
-                enabled = enabled,
-            ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
-        }
-        DemoLabelChip(
-            label = "Custom background",
-            secondaryLabel = "With secondary label",
-            colors = ChipDefaults.primaryChipColors(
-                backgroundColor = Color.Yellow.copy(alpha = 0.5f)
-            ),
-            enabled = enabled,
-        )
-        Chip(
-            onClick = { },
-            colors = ChipDefaults.primaryChipColors(),
-            label = {
-                Text(
-                    text = "Custom label color", maxLines = 1,
-                    overflow = TextOverflow.Ellipsis,
-                    color = Color.Yellow,
-                )
-            },
-            secondaryLabel = {
-                Text(
-                    text = "Custom secondary label color",
-                    maxLines = 1,
-                    overflow = TextOverflow.Ellipsis,
-                    color = Color.Yellow,
-                )
-            },
-            icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
-            enabled = enabled
-        )
-        Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .wrapContentWidth(Alignment.CenterHorizontally)
-        ) {
-            DemoLabelChip(
-                label = "Chip with fixed width",
-                modifier = Modifier.width(100.dp),
-                colors = ChipDefaults.primaryChipColors(),
-                enabled = enabled,
-            )
-        }
-        Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .wrapContentWidth(Alignment.CenterHorizontally)
-        ) {
-            CompactChip(
-                onClick = {
-                    Toast.makeText(
-                        applicationContext, "Wrap content chip with custom background color",
-                        Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ChipDefaults.primaryChipColors(
-                    backgroundColor = Color.Yellow,
-                    contentColor = MaterialTheme.colors.surface
-                ),
-                icon = {
-                    DemoIcon(
-                        resourceId = R.drawable.ic_accessibility_24px,
-                        modifier = Modifier.fillMaxSize()
-                    )
-                },
-                enabled = enabled,
-            )
-        }
-        Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .wrapContentWidth(Alignment.CenterHorizontally)
-        ) {
-            CompactChip(
-                onClick = {
-                    Toast.makeText(
-                        applicationContext, "Fixed width chip with custom icon color",
-                        Toast.LENGTH_LONG
-                    ).show()
-                },
-                modifier = Modifier.width(100.dp),
-                colors = ChipDefaults.secondaryChipColors(contentColor = Color.Yellow),
-                icon = {
-                    DemoIcon(
-                        resourceId = R.drawable.ic_accessibility_24px,
-                        modifier = Modifier.fillMaxSize()
-                    )
-                },
-                enabled = enabled,
-            )
-        }
-        ToggleChip(
-            checked = enabled,
-            onCheckedChange = { enabled = it },
-            label = {
-                Text("Chips enabled")
-            },
-            toggleIcon = {
-                ToggleChipDefaults.SwitchIcon(checked = enabled)
+        item {
+            MaterialTheme(colors = MaterialTheme.colors.copy(primary = Color.Cyan)) {
+                DemoIconChip(
+                    label = "Overridden Theme Primary + Icon",
+                    colors = ChipDefaults.primaryChipColors(),
+                    enabled = enabled,
+                ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
             }
-        )
+        }
+        item {
+            DemoLabelChip(
+                label = "Custom background",
+                secondaryLabel = "With secondary label",
+                colors = ChipDefaults.primaryChipColors(
+                    backgroundColor = Color.Yellow.copy(alpha = 0.5f)
+                ),
+                enabled = enabled,
+            )
+        }
+        item {
+            Chip(
+                onClick = { },
+                colors = ChipDefaults.primaryChipColors(),
+                label = {
+                    Text(
+                        text = "Custom label color", maxLines = 1,
+                        overflow = TextOverflow.Ellipsis,
+                        color = Color.Yellow,
+                    )
+                },
+                secondaryLabel = {
+                    Text(
+                        text = "Custom secondary label color",
+                        maxLines = 1,
+                        overflow = TextOverflow.Ellipsis,
+                        color = Color.Yellow,
+                    )
+                },
+                icon = { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) },
+                enabled = enabled
+            )
+        }
+        item {
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentWidth(Alignment.CenterHorizontally)
+            ) {
+                DemoLabelChip(
+                    label = "Chip with fixed width",
+                    modifier = Modifier.width(100.dp),
+                    colors = ChipDefaults.primaryChipColors(),
+                    enabled = enabled,
+                )
+            }
+        }
+        item {
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentWidth(Alignment.CenterHorizontally)
+            ) {
+                CompactChip(
+                    onClick = {
+                        Toast.makeText(
+                            applicationContext, "Wrap content chip with custom background color",
+                            Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ChipDefaults.primaryChipColors(
+                        backgroundColor = Color.Yellow,
+                        contentColor = MaterialTheme.colors.surface
+                    ),
+                    icon = {
+                        DemoIcon(
+                            resourceId = R.drawable.ic_accessibility_24px,
+                            modifier = Modifier.fillMaxSize()
+                        )
+                    },
+                    enabled = enabled,
+                )
+            }
+        }
+        item {
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentWidth(Alignment.CenterHorizontally)
+            ) {
+                CompactChip(
+                    onClick = {
+                        Toast.makeText(
+                            applicationContext, "Fixed width chip with custom icon color",
+                            Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    modifier = Modifier.width(100.dp),
+                    colors = ChipDefaults.secondaryChipColors(contentColor = Color.Yellow),
+                    icon = {
+                        DemoIcon(
+                            resourceId = R.drawable.ic_accessibility_24px,
+                            modifier = Modifier.fillMaxSize()
+                        )
+                    },
+                    enabled = enabled,
+                )
+            }
+        }
+        item {
+            ToggleChip(
+                checked = enabled,
+                onCheckedChange = { enabled = it },
+                label = {
+                    Text("Chips enabled")
+                },
+                toggleIcon = {
+                    ToggleChipDefaults.SwitchIcon(checked = enabled)
+                }
+            )
+        }
     }
 }
 
 @Composable
 fun ImageBackgroundChips() {
-    val scrollState: ScrollState = rememberScrollState()
     var enabled by remember { mutableStateOf(true) }
 
-    Column(
-        modifier = Modifier.verticalScroll(scrollState)
-            .padding(
-                PaddingValues(
-                    start = 8.dp,
-                    end = 8.dp,
-                    top = 15.dp,
-                    bottom = 50.dp
-                )
-            ),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically)
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
+        contentPadding = PaddingValues(
+            start = 8.dp,
+            end = 8.dp,
+            top = 15.dp,
+            bottom = 50.dp
+        )
     ) {
-        DemoLabelChip(
-            label = "Custom background image",
-            colors = ChipDefaults.imageBackgroundChipColors(
-                backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1),
-            ),
-            enabled = enabled,
-        )
-        DemoLabelChip(
-            label = "Custom background image",
-            secondaryLabel = "with secondary label",
-            colors = ChipDefaults.imageBackgroundChipColors(
-                backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1),
-            ),
-            enabled = enabled,
-        )
-        ToggleChip(
-            checked = enabled,
-            onCheckedChange = { enabled = it },
-            label = {
-                Text("Chips enabled")
-            },
-            toggleIcon = {
-                ToggleChipDefaults.SwitchIcon(checked = enabled)
-            }
-        )
+        item {
+            DemoLabelChip(
+                label = "Custom background image",
+                colors = ChipDefaults.imageBackgroundChipColors(
+                    backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1),
+                ),
+                enabled = enabled,
+            )
+        }
+        item {
+            DemoLabelChip(
+                label = "Custom background image",
+                secondaryLabel = "with secondary label",
+                colors = ChipDefaults.imageBackgroundChipColors(
+                    backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1),
+                ),
+                enabled = enabled,
+            )
+        }
+        item {
+            ToggleChip(
+                checked = enabled,
+                onCheckedChange = { enabled = it },
+                label = {
+                    Text("Chips enabled")
+                },
+                toggleIcon = {
+                    ToggleChipDefaults.SwitchIcon(checked = enabled)
+                }
+            )
+        }
     }
 }
 
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt
index 67d2b91..42a4d5b 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt
@@ -33,6 +33,7 @@
 import androidx.wear.compose.material.ScalingLazyColumn
 import androidx.wear.compose.material.SwipeDismissTarget
 import androidx.wear.compose.material.SwipeToDismissBox
+import androidx.wear.compose.material.SwipeToDismissBoxDefaults
 import androidx.wear.compose.material.SwipeToDismissBoxState
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.rememberSwipeToDismissBoxState
@@ -63,6 +64,9 @@
         is ComposableDemo -> {
             SwipeToDismissBox(
                 state = swipeDismissStateWithNavigation(onNavigateBack),
+                hasBackground = parentDemo != null,
+                backgroundKey = parentDemo?.title ?: SwipeToDismissBoxDefaults.BackgroundKey,
+                contentKey = demo.title,
             ) { isBackground ->
                 if (isBackground) {
                     if (parentDemo != null) {
@@ -89,6 +93,9 @@
 ) {
     SwipeToDismissBox(
         state = swipeDismissStateWithNavigation(onNavigateBack),
+        hasBackground = parentDemo != null,
+        backgroundKey = parentDemo?.title ?: SwipeToDismissBoxDefaults.BackgroundKey,
+        contentKey = category.title,
     ) { isBackground ->
         if (isBackground) {
             if (parentDemo != null) {
@@ -98,7 +105,7 @@
             ScalingLazyColumn(
                 horizontalAlignment = Alignment.CenterHorizontally,
                 contentPadding = PaddingValues(vertical = 16.dp),
-                modifier = Modifier.fillMaxWidth().testTag(DemoListTag)
+                modifier = Modifier.fillMaxWidth().testTag(DemoListTag),
             ) {
                 item {
                     Text(
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
index 9be4dbd..482acbe 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
@@ -50,6 +50,29 @@
     "Material",
     listOf(
         DemoCategory(
+            "TimeText",
+            listOf(
+                ComposableDemo("Clock only") {
+                    TimeTextClockOnly()
+                },
+                ComposableDemo("Clock with leading text") {
+                    TimeTextWithLeadingText()
+                },
+                ComposableDemo("Clock with trailing text") {
+                    TimeTextWithTrailingText()
+                },
+                ComposableDemo("Clock with leading and trailing text") {
+                    TimeTextWithLeadingAndTrailingText()
+                },
+                ComposableDemo("Clock with custom separator") {
+                    TimeTextWithCustomSeparator()
+                },
+                ComposableDemo("Clock with full date and time format") {
+                    TimeTextWithFullDateAndTimeFormat()
+                },
+            )
+        ),
+        DemoCategory(
             "Button",
             listOf(
                 ComposableDemo("Button Sizes") { ButtonSizes() },
@@ -96,28 +119,5 @@
                 },
             )
         ),
-        DemoCategory(
-            "TimeText",
-            listOf(
-                ComposableDemo("Clock only") {
-                    TimeTextClockOnly()
-                },
-                ComposableDemo("Clock with leading text") {
-                    TimeTextWithLeadingText()
-                },
-                ComposableDemo("Clock with trailing text") {
-                    TimeTextWithTrailingText()
-                },
-                ComposableDemo("Clock with leading and trailing text") {
-                    TimeTextWithLeadingAndTrailingText()
-                },
-                ComposableDemo("Clock with custom separator") {
-                    TimeTextWithCustomSeparator()
-                },
-                ComposableDemo("Clock with full date and time format") {
-                    TimeTextWithFullDateAndTimeFormat()
-                },
-            )
-        )
     ),
 )
diff --git a/wear/wear-complications-data/build.gradle b/wear/wear-complications-data/build.gradle
index ffb01a0..6ea0b83 100644
--- a/wear/wear-complications-data/build.gradle
+++ b/wear/wear-complications-data/build.gradle
@@ -40,6 +40,7 @@
     testImplementation(libs.mockitoCore)
     testImplementation(libs.truth)
     testImplementation("junit:junit:4.13")
+    testImplementation(libs.kotlinReflect)
 
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemDataSources.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemDataSources.kt
index 037c51b..e90c06f 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemDataSources.kt
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemDataSources.kt
@@ -25,6 +25,8 @@
  */
 public class SystemDataSources private constructor() {
     public companion object {
+        // NEXT AVAILABLE DATA SOURCE ID: 17
+
         /** Specifies that no complication data source should be used.  */
         public const val NO_DATA_SOURCE: Int = -1
 
@@ -110,6 +112,9 @@
          */
         public const val DATA_SOURCE_UNREAD_NOTIFICATION_COUNT: Int = 7
 
+        /** Deprecated data source, no longer available. Was GOOGLE_PAY. */
+        internal const val DATA_SOURCE_DEPRECATED8: Int = 8
+
         /**
          * Id for the 'next event' complication complication data source.
          *
@@ -122,6 +127,12 @@
          */
         public const val DATA_SOURCE_NEXT_EVENT: Int = 9
 
+        /** Deprecated data source, no longer available. Was RETAIL_STEP_COUNT. */
+        internal const val DATA_SOURCE_DEPRECATED10: Int = 10
+
+        /** Deprecated data source, no longer available. Was RETAIL_CHAT. */
+        internal const val DATA_SOURCE_DEPRECATED11: Int = 11
+
         /**
          * Id for the 'sunrise sunset' complication complication data source.
          *
@@ -154,6 +165,9 @@
          */
         public const val DATA_SOURCE_FAVORITE_CONTACT: Int = 14
 
+        /** Deprecated data source, no longer available. Was MOST_RECENT_APP. */
+        internal const val DATA_SOURCE_DEPRECATED15: Int = 15
+
         /**
          * Id for the 'day and date' complication complication data source.
          *
diff --git a/wear/wear-complications-data/src/test/java/androidx/wear/complications/SystemDataSourcesTest.kt b/wear/wear-complications-data/src/test/java/androidx/wear/complications/SystemDataSourcesTest.kt
new file mode 100644
index 0000000..a0681d4
--- /dev/null
+++ b/wear/wear-complications-data/src/test/java/androidx/wear/complications/SystemDataSourcesTest.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2021 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.wear.complications
+
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Assert.fail
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.reflect.KProperty
+
+@RunWith(SharedRobolectricTestRunner::class)
+public class SystemDataSourcesTest {
+
+    @Test
+    fun dataSourceIdsAreUnique() {
+        val valuesMap = HashMap<Int, String>()
+        SystemDataSources.Companion::class.members.forEach { member ->
+            if (member !is KProperty) {
+                // Only consider properties.
+                return
+            }
+            // Must be final and const.
+            assertWithMessage("${member.name} should be final")
+                .that(member.isFinal)
+                .isTrue()
+            assertWithMessage("${member.name} should be const")
+                .that(member.isConst)
+                .isTrue()
+            when (val value = member.getter.call(SystemDataSources.Companion)) {
+                is Int -> {
+                    valuesMap[value]?.let {
+                        fail("${member.name} duplicates value of ${valuesMap[value]}")
+                    }
+                    valuesMap[value] = member.name
+                }
+                else -> fail("${member.name} should be an int")
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-client/api/current.txt b/wear/wear-watchface-client/api/current.txt
index 7162aea..407e165 100644
--- a/wear/wear-watchface-client/api/current.txt
+++ b/wear/wear-watchface-client/api/current.txt
@@ -102,6 +102,7 @@
 
   public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public void addWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener, java.util.concurrent.Executor executor);
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
@@ -111,6 +112,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
+    method public void removeWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
     method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void setWatchUiState(androidx.wear.watchface.client.WatchUiState watchUiState) throws android.os.RemoteException;
@@ -138,6 +140,10 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
+  public static fun interface InteractiveWatchFaceClient.WatchFaceReadyListener {
+    method public void onWatchFaceReady();
+  }
+
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, @Px int surfaceWidth, @Px int surfaceHeight) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses={ServiceNotBoundException::class, ServiceStartFailureException::class}) public default static suspend Object? createWatchFaceControlClient(android.content.Context context, String watchFacePackageName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p) throws androidx.wear.watchface.client.WatchFaceControlClient.ServiceNotBoundException, androidx.wear.watchface.client.WatchFaceControlClient.ServiceStartFailureException;
diff --git a/wear/wear-watchface-client/api/public_plus_experimental_current.txt b/wear/wear-watchface-client/api/public_plus_experimental_current.txt
index c547d88..66f9f1f 100644
--- a/wear/wear-watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-client/api/public_plus_experimental_current.txt
@@ -122,6 +122,7 @@
 
   public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public void addWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener, java.util.concurrent.Executor executor);
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
@@ -131,6 +132,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
+    method public void removeWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
     method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void setWatchUiState(androidx.wear.watchface.client.WatchUiState watchUiState) throws android.os.RemoteException;
@@ -158,6 +160,10 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
+  public static fun interface InteractiveWatchFaceClient.WatchFaceReadyListener {
+    method public void onWatchFaceReady();
+  }
+
   @kotlin.RequiresOptIn(message="This is an experimental API that may change or be removed without warning.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) public @interface WatchFaceClientExperimental {
   }
 
diff --git a/wear/wear-watchface-client/api/restricted_current.txt b/wear/wear-watchface-client/api/restricted_current.txt
index 5957bf9..3229976 100644
--- a/wear/wear-watchface-client/api/restricted_current.txt
+++ b/wear/wear-watchface-client/api/restricted_current.txt
@@ -106,6 +106,7 @@
 
   public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
     method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public void addWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener, java.util.concurrent.Executor executor);
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
@@ -115,6 +116,7 @@
     method @AnyThread public boolean isConnectionAlive();
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
     method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
+    method public void removeWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
     method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void setWatchUiState(androidx.wear.watchface.client.WatchUiState watchUiState) throws android.os.RemoteException;
@@ -142,6 +144,10 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
+  public static fun interface InteractiveWatchFaceClient.WatchFaceReadyListener {
+    method public void onWatchFaceReady();
+  }
+
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
     method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, @Px int surfaceWidth, @Px int surfaceHeight) throws android.os.RemoteException;
     method @kotlin.jvm.Throws(exceptionClasses={ServiceNotBoundException::class, ServiceStartFailureException::class}) public default static suspend Object? createWatchFaceControlClient(android.content.Context context, String watchFacePackageName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p) throws androidx.wear.watchface.client.WatchFaceControlClient.ServiceNotBoundException, androidx.wear.watchface.client.WatchFaceControlClient.ServiceStartFailureException;
@@ -154,6 +160,7 @@
 
   public static final class WatchFaceControlClient.Companion {
     method @kotlin.jvm.Throws(exceptionClasses={ServiceNotBoundException::class, ServiceStartFailureException::class}) public suspend Object? createWatchFaceControlClient(android.content.Context context, String watchFacePackageName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p) throws androidx.wear.watchface.client.WatchFaceControlClient.ServiceNotBoundException, androidx.wear.watchface.client.WatchFaceControlClient.ServiceStartFailureException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public suspend Object? createWatchFaceControlClientImpl(android.content.Context context, android.content.Intent intent, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> p);
   }
 
   public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
diff --git a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index 65ac7c1..804a1bb 100644
--- a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -20,9 +20,12 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.Rect
 import android.graphics.RectF
+import android.graphics.SurfaceTexture
 import android.os.Handler
 import android.os.Looper
 import android.view.Surface
@@ -41,21 +44,25 @@
 import androidx.wear.complications.data.PlainComplicationText
 import androidx.wear.complications.data.RangedValueComplicationData
 import androidx.wear.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.ComplicationSlot
+import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.ComplicationSlotsManager
 import androidx.wear.watchface.ContentDescriptionLabel
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.WatchFaceService
+import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
 import androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType
 import androidx.wear.watchface.client.DeviceConfig
 import androidx.wear.watchface.client.HeadlessWatchFaceClient
+import androidx.wear.watchface.client.InteractiveWatchFaceClient
 import androidx.wear.watchface.client.WatchFaceControlClient
 import androidx.wear.watchface.client.WatchUiState
 import androidx.wear.watchface.control.WatchFaceControlService
-import androidx.wear.watchface.ComplicationSlotBoundsType
 import androidx.wear.watchface.samples.BLUE_STYLE
 import androidx.wear.watchface.samples.COLOR_STYLE_SETTING
 import androidx.wear.watchface.samples.COMPLICATIONS_STYLE_SETTING
@@ -72,10 +79,12 @@
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption
 import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.async
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import org.junit.After
@@ -91,6 +100,8 @@
 import org.mockito.Mockito
 import org.mockito.MockitoAnnotations
 import java.time.Instant
+import java.time.ZoneId
+import java.time.ZonedDateTime
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.TimeoutException
@@ -116,6 +127,9 @@
     private lateinit var surfaceHolder: SurfaceHolder
 
     @Mock
+    private lateinit var surfaceHolder2: SurfaceHolder
+
+    @Mock
     private lateinit var surface: Surface
     private lateinit var engine: WatchFaceService.EngineWrapper
     private val handler = Handler(Looper.getMainLooper())
@@ -132,6 +146,7 @@
         Mockito.`when`(surfaceHolder.surfaceFrame)
             .thenReturn(Rect(0, 0, 400, 400))
         Mockito.`when`(surfaceHolder.surface).thenReturn(surface)
+        Mockito.`when`(surface.isValid).thenReturn(false)
     }
 
     @After
@@ -190,14 +205,17 @@
         }
     }
 
-    private fun <X> awaitWithTimeout(thing: Deferred<X>): X {
+    private fun <X> awaitWithTimeout(
+        thing: Deferred<X>,
+        timeoutMillis: Long = CONNECT_TIMEOUT_MILLIS
+    ): X {
         var value: X? = null
         val latch = CountDownLatch(1)
         handlerCoroutineScope.launch {
             value = thing.await()
             latch.countDown()
         }
-        if (!latch.await(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
+        if (!latch.await(timeoutMillis, TimeUnit.MILLISECONDS)) {
             throw TimeoutException("Timeout waiting for thing!")
         }
         return value!!
@@ -573,14 +591,23 @@
         // additional synchronization to ensure it's side effects have been applied before
         // inspecting complicationSlotsState otherwise we risk test flakes.
         val updateCountDownLatch = CountDownLatch(1)
+        var leftComplicationSlot: ComplicationSlot
+
         runBlocking {
-            val leftComplicationSlot = engine.deferredWatchFaceImpl.await()
+            leftComplicationSlot = engine.deferredWatchFaceImpl.await()
                 .complicationSlotsManager.complicationSlots[
                 EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
             ]!!
+        }
 
-            leftComplicationSlot.complicationData.addObserver {
-                updateCountDownLatch.countDown()
+        var isFirstCall = true
+        handlerCoroutineScope.launch {
+            leftComplicationSlot.complicationData.collect {
+                if (!isFirstCall) {
+                    updateCountDownLatch.countDown()
+                } else {
+                    isFirstCall = false
+                }
             }
         }
 
@@ -922,6 +949,7 @@
         assertThat(instance).isNotNull()
         instance?.close()
 
+        // The previous instance should still be usable despite the new instance being closed.
         interactiveInstance.updateComplicationData(complications)
         val bitmap = interactiveInstance.renderWatchFaceToBitmap(
             RenderParameters(
@@ -1069,6 +1097,160 @@
             )
         )
     }
+
+    @Test
+    fun addWatchFaceReadyListener_canvasRender() {
+        val initCompletableDeferred = CompletableDeferred<Unit>()
+        val wallpaperService = TestAsyncCanvasRenderInitWatchFaceService(
+            context,
+            surfaceHolder,
+            initCompletableDeferred
+        )
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+        }
+
+        val bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
+        val canvas = Canvas(bitmap)
+        Mockito.`when`(surfaceHolder.lockHardwareCanvas()).thenReturn(canvas)
+
+        // Create the engine which triggers the crashing watchface.
+        handler.post {
+            engine = wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
+        }
+
+        // Wait for the instance to be created.
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+
+        try {
+            val wfReady = CompletableDeferred<Unit>()
+            interactiveInstance.addWatchFaceReadyListener(
+                { wfReady.complete(Unit) },
+                { runnable -> runnable.run() }
+            )
+            assertThat(wfReady.isCompleted).isFalse()
+
+            initCompletableDeferred.complete(Unit)
+
+            // This should not timeout.
+            awaitWithTimeout(wfReady)
+        } finally {
+            interactiveInstance.close()
+        }
+    }
+
+    @Test
+    fun removeWatchFaceReadyListener_canvasRender() {
+        val initCompletableDeferred = CompletableDeferred<Unit>()
+        val wallpaperService = TestAsyncCanvasRenderInitWatchFaceService(
+            context,
+            surfaceHolder,
+            initCompletableDeferred
+        )
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+        }
+
+        val bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
+        val canvas = Canvas(bitmap)
+        Mockito.`when`(surfaceHolder.lockHardwareCanvas()).thenReturn(canvas)
+
+        val renderLatch = CountDownLatch(1)
+        Mockito.`when`(surfaceHolder.unlockCanvasAndPost(canvas)).then {
+            renderLatch.countDown()
+        }
+
+        // Create the engine which triggers the crashing watchface.
+        handler.post {
+            engine = wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
+        }
+
+        // Wait for the instance to be created.
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+
+        try {
+            var listenerCalled = false
+            val listener =
+                InteractiveWatchFaceClient.WatchFaceReadyListener { listenerCalled = true }
+            interactiveInstance.addWatchFaceReadyListener(
+                listener,
+                { runnable -> runnable.run() }
+            )
+            interactiveInstance.removeWatchFaceReadyListener(listener)
+            assertThat(listenerCalled).isFalse()
+
+            initCompletableDeferred.complete(Unit)
+
+            assertTrue(renderLatch.await(DESTROY_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS))
+
+            assertThat(listenerCalled).isFalse()
+        } finally {
+            interactiveInstance.close()
+        }
+    }
+
+    @Test
+    fun addWatchFaceReadyListener_glesRender() {
+        val surfaceTexture = SurfaceTexture(false)
+        surfaceTexture.setDefaultBufferSize(10, 10)
+        Mockito.`when`(surfaceHolder2.surface).thenReturn(Surface(surfaceTexture))
+        Mockito.`when`(surfaceHolder2.surfaceFrame)
+            .thenReturn(Rect(0, 0, 10, 10))
+
+        val onUiThreadGlSurfaceCreatedCompletableDeferred = CompletableDeferred<Unit>()
+        val onBackgroundThreadGlContextCreatedCompletableDeferred = CompletableDeferred<Unit>()
+        val wallpaperService = TestAsyncGlesRenderInitWatchFaceService(
+            context,
+            surfaceHolder2,
+            onUiThreadGlSurfaceCreatedCompletableDeferred,
+            onBackgroundThreadGlContextCreatedCompletableDeferred
+        )
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+        }
+        // Create the engine which triggers the crashing watchface.
+        handler.post {
+            engine = wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
+        }
+
+        // Wait for the instance to be created.
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+
+        try {
+            val wfReady = CompletableDeferred<Unit>()
+            interactiveInstance.addWatchFaceReadyListener(
+                { wfReady.complete(Unit) },
+                { runnable -> runnable.run() }
+            )
+            assertThat(wfReady.isCompleted).isFalse()
+
+            onUiThreadGlSurfaceCreatedCompletableDeferred.complete(Unit)
+            onBackgroundThreadGlContextCreatedCompletableDeferred.complete(Unit)
+
+            // This can be a bit slow.
+            awaitWithTimeout(wfReady, 2000)
+        } finally {
+            interactiveInstance.close()
+        }
+    }
 }
 
 internal class TestExampleCanvasAnalogWatchFaceService(
@@ -1143,3 +1325,98 @@
 
     override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
 }
+
+internal class TestAsyncCanvasRenderInitWatchFaceService(
+    testContext: Context,
+    private var surfaceHolderOverride: SurfaceHolder,
+    private var initCompletableDeferred: CompletableDeferred<Unit>
+) : WatchFaceService() {
+
+    init {
+        attachBaseContext(testContext)
+    }
+
+    override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
+
+    override suspend fun createWatchFace(
+        surfaceHolder: SurfaceHolder,
+        watchState: WatchState,
+        complicationSlotsManager: ComplicationSlotsManager,
+        currentUserStyleRepository: CurrentUserStyleRepository
+    ) = WatchFace(
+        WatchFaceType.DIGITAL,
+        object : Renderer.CanvasRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            CanvasType.HARDWARE,
+            16
+        ) {
+            override suspend fun init() {
+                initCompletableDeferred.await()
+            }
+
+            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                // Actually rendering something isn't required.
+            }
+
+            override fun renderHighlightLayer(
+                canvas: Canvas,
+                bounds: Rect,
+                zonedDateTime: ZonedDateTime
+            ) {
+                TODO("Not yet implemented")
+            }
+        }
+    ).setSystemTimeProvider(object : WatchFace.SystemTimeProvider {
+        override fun getSystemTimeMillis() = 123456789L
+
+        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
+    })
+}
+
+internal class TestAsyncGlesRenderInitWatchFaceService(
+    testContext: Context,
+    private var surfaceHolderOverride: SurfaceHolder,
+    private var onUiThreadGlSurfaceCreatedCompletableDeferred: CompletableDeferred<Unit>,
+    private var onBackgroundThreadGlContextCreatedCompletableDeferred: CompletableDeferred<Unit>
+) : WatchFaceService() {
+    internal lateinit var watchFace: WatchFace
+
+    init {
+        attachBaseContext(testContext)
+    }
+
+    override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
+
+    override suspend fun createWatchFace(
+        surfaceHolder: SurfaceHolder,
+        watchState: WatchState,
+        complicationSlotsManager: ComplicationSlotsManager,
+        currentUserStyleRepository: CurrentUserStyleRepository
+    ) = WatchFace(
+        WatchFaceType.DIGITAL,
+        object : Renderer.GlesRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            16
+        ) {
+            override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
+                onUiThreadGlSurfaceCreatedCompletableDeferred.await()
+            }
+
+            override suspend fun onBackgroundThreadGlContextCreated() {
+                onBackgroundThreadGlContextCreatedCompletableDeferred.await()
+            }
+
+            override fun render(zonedDateTime: ZonedDateTime) {
+                // GLES rendering is complicated and not strictly necessary for our test.
+            }
+
+            override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
+                TODO("Not yet implemented")
+            }
+        }
+    )
+}
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index eba08b2..149e9ec 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
@@ -17,6 +17,8 @@
 package androidx.wear.watchface.client
 
 import android.graphics.Bitmap
+import android.os.Handler
+import android.os.HandlerThread
 import android.os.RemoteException
 import android.support.wearable.watchface.SharedMemoryImage
 import androidx.annotation.AnyThread
@@ -33,6 +35,7 @@
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
 import androidx.wear.watchface.ComplicationSlotBoundsType
+import androidx.wear.watchface.control.IWatchfaceReadyListener
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.style.UserStyle
@@ -184,7 +187,10 @@
     @Throws(RemoteException::class)
     public fun performAmbientTick()
 
-    /** Callback that observes when the client disconnects. */
+    /**
+     * Callback that observes when the client disconnects. Use [addClientDisconnectListener] to
+     * register a ClientDisconnectListener.
+     */
     public interface ClientDisconnectListener {
         /**
          * The client disconnected, typically due to the server side crashing. Note this is not
@@ -206,6 +212,35 @@
     /** Returns true if the connection to the server side is alive. */
     @AnyThread
     public fun isConnectionAlive(): Boolean
+
+    /**
+     * Interface passed to [addWatchFaceReadyListener] which calls
+     * [WatchFaceReadyListener.onWatchFaceReady] when the watch face is ready to render. Use
+     * [addWatchFaceReadyListener] to register a WatchFaceReadyListener.
+     */
+    public fun interface WatchFaceReadyListener {
+        /**
+         * Called when the watchface is ready to render.
+         *
+         * Note in the event of the watch face disconnecting (e.g. due to a crash) this callback
+         * will never fire. Use [ClientDisconnectListener] to observe disconnects.
+         */
+        public fun onWatchFaceReady()
+    }
+
+    /**
+     * Registers a [WatchFaceReadyListener] which gets called when the watch face is ready to
+     * render.
+     *
+     * Note in the event of the watch face disconnecting (e.g. due to a crash) the listener will
+     * never get called. Use [ClientDisconnectListener] to observe disconnects.
+     */
+    public fun addWatchFaceReadyListener(listener: WatchFaceReadyListener, executor: Executor)
+
+    /**
+     * Stops listening for events registered by [addWatchFaceReadyListener].
+     */
+    public fun removeWatchFaceReadyListener(listener: WatchFaceReadyListener)
 }
 
 /** Controls a stateful remote interactive watch face. */
@@ -214,7 +249,11 @@
 ) : InteractiveWatchFaceClient {
 
     private val lock = Any()
-    private val listeners = HashMap<InteractiveWatchFaceClient.ClientDisconnectListener, Executor>()
+    private val disconnectListeners =
+        HashMap<InteractiveWatchFaceClient.ClientDisconnectListener, Executor>()
+    private val readyListeners =
+        HashMap<InteractiveWatchFaceClient.WatchFaceReadyListener, Executor>()
+    private var watchfaceReadyListenerRegistered = false
 
     init {
         iInteractiveWatchFace.asBinder().linkToDeath(
@@ -223,7 +262,7 @@
                     HashMap<InteractiveWatchFaceClient.ClientDisconnectListener, Executor>
 
                 synchronized(lock) {
-                    listenerCopy = HashMap(listeners)
+                    listenerCopy = HashMap(disconnectListeners)
                 }
 
                 for ((listener, executor) in listenerCopy) {
@@ -348,10 +387,10 @@
         executor: Executor
     ) {
         synchronized(lock) {
-            require(!listeners.contains(listener)) {
+            require(!disconnectListeners.contains(listener)) {
                 "Don't call addClientDisconnectListener multiple times for the same listener"
             }
-            listeners.put(listener, executor)
+            disconnectListeners.put(listener, executor)
         }
     }
 
@@ -359,9 +398,74 @@
         listener: InteractiveWatchFaceClient.ClientDisconnectListener
     ) {
         synchronized(lock) {
-            listeners.remove(listener)
+            disconnectListeners.remove(listener)
         }
     }
 
     override fun isConnectionAlive() = iInteractiveWatchFace.asBinder().isBinderAlive
+
+    private fun registerWatchfaceReadyListener() {
+        if (watchfaceReadyListenerRegistered) {
+            return
+        }
+        if (iInteractiveWatchFace.apiVersion >= 2) {
+            iInteractiveWatchFace.addWatchfaceReadyListener(
+                object : IWatchfaceReadyListener.Stub() {
+                    override fun getApiVersion(): Int = IWatchfaceReadyListener.API_VERSION
+
+                    override fun onWatchfaceReady() {
+                        this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
+                    }
+                }
+            )
+        } else {
+            // We can emulate this on an earlier API by using a call to get userStyleSchema that
+            // will block until the watch face is ready. to Avoid blocking the current thread we
+            // spin up a temporary thread.
+            val thread = HandlerThread("addWatchFaceReadyListener")
+            thread.start()
+            val handler = Handler(thread.looper)
+            handler.post {
+                iInteractiveWatchFace.userStyleSchema
+                this@InteractiveWatchFaceClientImpl.onWatchFaceReady()
+                thread.quitSafely()
+            }
+        }
+        watchfaceReadyListenerRegistered = true
+    }
+
+    internal fun onWatchFaceReady() {
+        var listenerCopy: HashMap<InteractiveWatchFaceClient.WatchFaceReadyListener, Executor>
+
+        synchronized(lock) {
+            listenerCopy = HashMap(readyListeners)
+        }
+
+        for ((listener, executor) in listenerCopy) {
+            executor.execute {
+                listener.onWatchFaceReady()
+            }
+        }
+    }
+
+    override fun addWatchFaceReadyListener(
+        listener: InteractiveWatchFaceClient.WatchFaceReadyListener,
+        executor: Executor
+    ) {
+        synchronized(lock) {
+            require(!readyListeners.contains(listener)) {
+                "Don't call addWatchFaceReadyListener multiple times for the same listener"
+            }
+            registerWatchfaceReadyListener()
+            readyListeners.put(listener, executor)
+        }
+    }
+
+    override fun removeWatchFaceReadyListener(
+        listener: InteractiveWatchFaceClient.WatchFaceReadyListener
+    ) {
+        synchronized(lock) {
+            readyListeners.remove(listener)
+        }
+    }
 }
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index d8e2e4cd..ba77278 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -23,6 +23,7 @@
 import android.os.IBinder
 import android.os.RemoteException
 import androidx.annotation.Px
+import androidx.annotation.RestrictTo
 import androidx.wear.complications.DefaultComplicationDataSourcePolicy
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.complications.data.ComplicationType
@@ -75,7 +76,9 @@
             }
         )
 
-        internal suspend fun createWatchFaceControlClientImpl(
+        /** @hide */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public suspend fun createWatchFaceControlClientImpl(
             context: Context,
             intent: Intent
         ): WatchFaceControlClient {
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
index de55990..c83fef1 100644
--- a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
@@ -562,8 +562,7 @@
         }
 
     /**
-     * Sets the complication data to be drawn. If `complicationData` is `null`, nothing will be
-     * drawn when [draw] is called.
+     * Sets the complication data to be drawn.
      *
      * @param complicationData The [ComplicationData] to set
      * @param loadDrawablesAsync If true any drawables should be loaded asynchronously,
diff --git a/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl
index b5f8551..677d9e8 100644
--- a/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl
+++ b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IInteractiveWatchFace.aidl
@@ -17,6 +17,7 @@
 package androidx.wear.watchface.control;
 
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel;
+import androidx.wear.watchface.control.IWatchfaceReadyListener;
 import androidx.wear.watchface.control.data.WatchFaceRenderParams;
 import androidx.wear.watchface.data.WatchUiState;
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat;
@@ -32,12 +33,12 @@
 interface IInteractiveWatchFace {
     // IMPORTANT NOTE: All methods must be given an explicit transaction id that must never change
     // in the future to remain binary backwards compatible.
-    // Next Id: 17
+    // Next Id: 18
 
     /**
      * API version number. This should be incremented every time a new method is added.
      */
-    const int API_VERSION = 1;
+    const int API_VERSION = 2;
 
     /** Indicates a "down" touch event on the watch face. */
     const int TAP_TYPE_DOWN = 0;
@@ -175,4 +176,12 @@
      * @since API version 1.
      */
     ContentDescriptionLabel[] getContentDescriptionLabels() = 16;
+
+    /**
+     * Adds a listener that will be called when the watch face is ready to render. If the watchface
+     * is already ready this will be called immediately.
+     *
+     * @since API version 2.
+     */
+    oneway void addWatchfaceReadyListener(in IWatchfaceReadyListener listener) = 17;
 }
diff --git a/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl
new file mode 100644
index 0000000..11bfaf4
--- /dev/null
+++ b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IWatchfaceReadyListener.aidl
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2021 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.wear.watchface.control;
+
+/**
+ * Interface of a service that allows the user to create watch face instances.
+ *
+ * @hide
+ */
+interface IWatchfaceReadyListener {
+    // IMPORTANT NOTE: All methods must be given an explicit transaction id that must never change
+    // in the future to remain binary backwards compatible.
+    // Next Id: 3
+
+    /**
+     * API version number. This should be incremented every time a new method is added.
+     */
+    const int API_VERSION = 1;
+
+    /**
+     * Returns the version number for this API which the client can use to determine which methods
+     * are available.
+     *
+     * @since API version 1.
+     */
+    int getApiVersion() = 1;
+
+    /**
+     * Called when the watch face is ready to render.
+     *
+     * @since API version 1.
+     */
+    oneway void onWatchfaceReady() = 2;
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-editor-guava/api/current.txt b/wear/wear-watchface-editor-guava/api/current.txt
index bf7d01d..8a5446f 100644
--- a/wear/wear-watchface-editor-guava/api/current.txt
+++ b/wear/wear-watchface-editor-guava/api/current.txt
@@ -7,13 +7,13 @@
     method @RequiresApi(27) @UiThread public static androidx.wear.watchface.editor.ListenableEditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
     method public Integer? getBackgroundComplicationSlotId();
     method public Integer? getComplicationSlotIdAt(int x, int y);
-    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
-    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
-    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>> getListenableComplicationPreviewData();
-    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationDataSourceInfo>> getListenableComplicationsProviderInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
+    method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>>> getListenableComplicationPreviewData();
+    method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationDataSourceInfo>>> getListenableComplicationsProviderInfo();
     method public java.time.Instant getPreviewReferenceInstant();
-    method public androidx.wear.watchface.style.UserStyle getUserStyle();
+    method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
@@ -23,12 +23,11 @@
     method public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
     method public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? slotIdToComplicationData);
     method public void setCommitChangesOnClose(boolean commitChangesOnClose);
-    method public void setUserStyle(androidx.wear.watchface.style.UserStyle userStyle);
     property public Integer? backgroundComplicationSlotId;
     property public boolean commitChangesOnClose;
-    property public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public java.time.Instant previewReferenceInstant;
-    property public androidx.wear.watchface.style.UserStyle userStyle;
+    property public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
     property public androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
     property public android.content.ComponentName watchFaceComponentName;
     property @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId watchFaceId;
diff --git a/wear/wear-watchface-editor-guava/api/public_plus_experimental_current.txt b/wear/wear-watchface-editor-guava/api/public_plus_experimental_current.txt
index bf7d01d..8a5446f 100644
--- a/wear/wear-watchface-editor-guava/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-editor-guava/api/public_plus_experimental_current.txt
@@ -7,13 +7,13 @@
     method @RequiresApi(27) @UiThread public static androidx.wear.watchface.editor.ListenableEditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
     method public Integer? getBackgroundComplicationSlotId();
     method public Integer? getComplicationSlotIdAt(int x, int y);
-    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
-    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
-    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>> getListenableComplicationPreviewData();
-    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationDataSourceInfo>> getListenableComplicationsProviderInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
+    method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>>> getListenableComplicationPreviewData();
+    method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationDataSourceInfo>>> getListenableComplicationsProviderInfo();
     method public java.time.Instant getPreviewReferenceInstant();
-    method public androidx.wear.watchface.style.UserStyle getUserStyle();
+    method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
@@ -23,12 +23,11 @@
     method public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
     method public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? slotIdToComplicationData);
     method public void setCommitChangesOnClose(boolean commitChangesOnClose);
-    method public void setUserStyle(androidx.wear.watchface.style.UserStyle userStyle);
     property public Integer? backgroundComplicationSlotId;
     property public boolean commitChangesOnClose;
-    property public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public java.time.Instant previewReferenceInstant;
-    property public androidx.wear.watchface.style.UserStyle userStyle;
+    property public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
     property public androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
     property public android.content.ComponentName watchFaceComponentName;
     property @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId watchFaceId;
diff --git a/wear/wear-watchface-editor-guava/api/restricted_current.txt b/wear/wear-watchface-editor-guava/api/restricted_current.txt
index bf7d01d..8a5446f 100644
--- a/wear/wear-watchface-editor-guava/api/restricted_current.txt
+++ b/wear/wear-watchface-editor-guava/api/restricted_current.txt
@@ -7,13 +7,13 @@
     method @RequiresApi(27) @UiThread public static androidx.wear.watchface.editor.ListenableEditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
     method public Integer? getBackgroundComplicationSlotId();
     method public Integer? getComplicationSlotIdAt(int x, int y);
-    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
-    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
-    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>> getListenableComplicationPreviewData();
-    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationDataSourceInfo>> getListenableComplicationsProviderInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
+    method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>>> getListenableComplicationPreviewData();
+    method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationDataSourceInfo>>> getListenableComplicationsProviderInfo();
     method public java.time.Instant getPreviewReferenceInstant();
-    method public androidx.wear.watchface.style.UserStyle getUserStyle();
+    method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
@@ -23,12 +23,11 @@
     method public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
     method public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? slotIdToComplicationData);
     method public void setCommitChangesOnClose(boolean commitChangesOnClose);
-    method public void setUserStyle(androidx.wear.watchface.style.UserStyle userStyle);
     property public Integer? backgroundComplicationSlotId;
     property public boolean commitChangesOnClose;
-    property public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public java.time.Instant previewReferenceInstant;
-    property public androidx.wear.watchface.style.UserStyle userStyle;
+    property public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
     property public androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
     property public android.content.ComponentName watchFaceComponentName;
     property @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId watchFaceId;
diff --git a/wear/wear-watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt b/wear/wear-watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
index ad9e4c3..37020d8 100644
--- a/wear/wear-watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
+++ b/wear/wear-watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
@@ -36,6 +36,8 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.TimeoutCancellationException
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.launch
 import java.time.Instant
 import kotlin.coroutines.CoroutineContext
@@ -118,13 +120,13 @@
     @RequiresApi(Build.VERSION_CODES.R)
     override val watchFaceId: WatchFaceId = wrappedEditorSession.watchFaceId
 
-    override var userStyle: UserStyle by wrappedEditorSession::userStyle
+    override val userStyle: MutableStateFlow<UserStyle> by wrappedEditorSession::userStyle
 
     override val previewReferenceInstant: Instant = wrappedEditorSession.previewReferenceInstant
 
     override val userStyleSchema: UserStyleSchema by wrappedEditorSession::userStyleSchema
 
-    override val complicationSlotsState: Map<Int, ComplicationSlotState> by
+    override val complicationSlotsState: StateFlow<Map<Int, ComplicationSlotState>> by
     wrappedEditorSession::complicationSlotsState
 
     @Suppress("INAPPLICABLE_JVM_NAME")
@@ -133,8 +135,8 @@
 
     /** [ListenableFuture] wrapper around [EditorSession.getComplicationsPreviewData]. */
     public fun getListenableComplicationPreviewData():
-        ListenableFuture<Map<Int, ComplicationData>> {
-            val future = ResolvableFuture.create<Map<Int, ComplicationData>>()
+        ListenableFuture<StateFlow<Map<Int, ComplicationData>>> {
+            val future = ResolvableFuture.create<StateFlow<Map<Int, ComplicationData>>>()
             getCoroutineScope().launch {
                 try {
                     future.set(wrappedEditorSession.getComplicationsPreviewData())
@@ -147,8 +149,8 @@
 
     /** [ListenableFuture] wrapper around [EditorSession.getComplicationsDataSourceInfo]. */
     public fun getListenableComplicationsProviderInfo():
-        ListenableFuture<Map<Int, ComplicationDataSourceInfo?>> {
-            val future = ResolvableFuture.create<Map<Int, ComplicationDataSourceInfo?>>()
+        ListenableFuture<StateFlow<Map<Int, ComplicationDataSourceInfo?>>> {
+            val future = ResolvableFuture.create<StateFlow<Map<Int, ComplicationDataSourceInfo?>>>()
             getCoroutineScope().launch {
                 try {
                     future.set(wrappedEditorSession.getComplicationsDataSourceInfo())
@@ -159,10 +161,11 @@
             return future
         }
 
-    override suspend fun getComplicationsPreviewData(): Map<Int, ComplicationData> =
+    override suspend fun getComplicationsPreviewData(): StateFlow<Map<Int, ComplicationData>> =
         wrappedEditorSession.getComplicationsPreviewData()
 
-    override suspend fun getComplicationsDataSourceInfo(): Map<Int, ComplicationDataSourceInfo?> =
+    override suspend fun
+    getComplicationsDataSourceInfo(): StateFlow<Map<Int, ComplicationDataSourceInfo?>> =
         wrappedEditorSession.getComplicationsDataSourceInfo()
 
     @get:SuppressWarnings("AutoBoxing")
diff --git a/wear/wear-watchface-editor/api/current.txt b/wear/wear-watchface-editor/api/current.txt
index 8447aa2..28bd8ba 100644
--- a/wear/wear-watchface-editor/api/current.txt
+++ b/wear/wear-watchface-editor/api/current.txt
@@ -39,11 +39,11 @@
     method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public default static suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p) throws kotlinx.coroutines.TimeoutCancellationException;
     method public Integer? getBackgroundComplicationSlotId();
     method @UiThread public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
-    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
-    method @UiThread public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method @UiThread public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
     method public java.time.Instant getPreviewReferenceInstant();
-    method public androidx.wear.watchface.style.UserStyle getUserStyle();
+    method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
@@ -51,12 +51,11 @@
     method @UiThread public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
     method @UiThread public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? slotIdToComplicationData);
     method @UiThread public void setCommitChangesOnClose(boolean commitChangesOnClose);
-    method public void setUserStyle(androidx.wear.watchface.style.UserStyle userStyle);
     property public abstract Integer? backgroundComplicationSlotId;
     property @UiThread public abstract boolean commitChangesOnClose;
-    property public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public abstract java.time.Instant previewReferenceInstant;
-    property public abstract androidx.wear.watchface.style.UserStyle userStyle;
+    property public abstract kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
     property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
     property public abstract android.content.ComponentName watchFaceComponentName;
     property @RequiresApi(android.os.Build.VERSION_CODES.R) public abstract androidx.wear.watchface.client.WatchFaceId watchFaceId;
diff --git a/wear/wear-watchface-editor/api/public_plus_experimental_current.txt b/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
index 8447aa2..28bd8ba 100644
--- a/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
@@ -39,11 +39,11 @@
     method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public default static suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p) throws kotlinx.coroutines.TimeoutCancellationException;
     method public Integer? getBackgroundComplicationSlotId();
     method @UiThread public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
-    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
-    method @UiThread public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method @UiThread public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
     method public java.time.Instant getPreviewReferenceInstant();
-    method public androidx.wear.watchface.style.UserStyle getUserStyle();
+    method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
@@ -51,12 +51,11 @@
     method @UiThread public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
     method @UiThread public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? slotIdToComplicationData);
     method @UiThread public void setCommitChangesOnClose(boolean commitChangesOnClose);
-    method public void setUserStyle(androidx.wear.watchface.style.UserStyle userStyle);
     property public abstract Integer? backgroundComplicationSlotId;
     property @UiThread public abstract boolean commitChangesOnClose;
-    property public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public abstract java.time.Instant previewReferenceInstant;
-    property public abstract androidx.wear.watchface.style.UserStyle userStyle;
+    property public abstract kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
     property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
     property public abstract android.content.ComponentName watchFaceComponentName;
     property @RequiresApi(android.os.Build.VERSION_CODES.R) public abstract androidx.wear.watchface.client.WatchFaceId watchFaceId;
diff --git a/wear/wear-watchface-editor/api/restricted_current.txt b/wear/wear-watchface-editor/api/restricted_current.txt
index 8069dc7..874ff95 100644
--- a/wear/wear-watchface-editor/api/restricted_current.txt
+++ b/wear/wear-watchface-editor/api/restricted_current.txt
@@ -8,8 +8,9 @@
     method protected final boolean getClosed();
     method public boolean getCommitChangesOnClose();
     method public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
-    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public kotlinx.coroutines.flow.MutableStateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
     method public final kotlinx.coroutines.CoroutineScope getCoroutineScope();
     method protected final boolean getForceClosed();
     method public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
@@ -21,6 +22,7 @@
     property public Integer? backgroundComplicationSlotId;
     property protected final boolean closed;
     property public boolean commitChangesOnClose;
+    property public kotlinx.coroutines.flow.MutableStateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public final kotlinx.coroutines.CoroutineScope coroutineScope;
     property protected final boolean forceClosed;
   }
@@ -63,11 +65,11 @@
     method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public default static suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p) throws kotlinx.coroutines.TimeoutCancellationException;
     method public Integer? getBackgroundComplicationSlotId();
     method @UiThread public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
-    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
-    method @UiThread public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>> p);
-    method @UiThread public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.ComplicationDataSourceInfo>>> p);
+    method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>>> p);
     method public java.time.Instant getPreviewReferenceInstant();
-    method public androidx.wear.watchface.style.UserStyle getUserStyle();
+    method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
     method public android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
@@ -75,12 +77,11 @@
     method @UiThread public suspend Object? openComplicationDataSourceChooser(int complicationSlotId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationDataSource> p);
     method @UiThread public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? slotIdToComplicationData);
     method @UiThread public void setCommitChangesOnClose(boolean commitChangesOnClose);
-    method public void setUserStyle(androidx.wear.watchface.style.UserStyle userStyle);
     property public abstract Integer? backgroundComplicationSlotId;
     property @UiThread public abstract boolean commitChangesOnClose;
-    property public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
     property public abstract java.time.Instant previewReferenceInstant;
-    property public abstract androidx.wear.watchface.style.UserStyle userStyle;
+    property public abstract kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
     property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
     property public abstract android.content.ComponentName watchFaceComponentName;
     property @RequiresApi(android.os.Build.VERSION_CODES.R) public abstract androidx.wear.watchface.client.WatchFaceId watchFaceId;
diff --git a/wear/wear-watchface-editor/build.gradle b/wear/wear-watchface-editor/build.gradle
index 8637e4b..58ed02d 100644
--- a/wear/wear-watchface-editor/build.gradle
+++ b/wear/wear-watchface-editor/build.gradle
@@ -34,7 +34,7 @@
     api(libs.kotlinCoroutinesAndroid)
 
     implementation("androidx.core:core:1.1.0")
-    implementation project(path: ':lifecycle:lifecycle-common-java8')
+    implementation("androidx.lifecycle:lifecycle-common-java8:2.3.1")
 
     androidTestImplementation(project(":wear:wear-watchface-complications-rendering"))
     androidTestImplementation(project(":wear:wear-watchface-editor-guava"))
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
index b2ccf67..f63b16f 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
@@ -20,17 +20,14 @@
 import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.Rect
-import android.os.Build
 import android.os.Bundle
 import android.util.TypedValue
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.Button
-import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.fragment.app.Fragment
-import androidx.wear.complications.ComplicationDataSourceInfo
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
@@ -38,6 +35,8 @@
 import androidx.wear.watchface.editor.ChosenComplicationDataSource
 import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.widget.SwipeDismissFrameLayout
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 
 /**
@@ -82,20 +81,16 @@
     private val watchFaceConfigActivity: WatchFaceConfigActivity
 ) : SwipeDismissFrameLayout(context) {
 
-    companion object {
-        private const val TAG = "ConfigView"
-    }
-
-    private lateinit var previewComplicationData: Map<Int, ComplicationData>
+    private lateinit var previewComplicationData: StateFlow<Map<Int, ComplicationData>>
     private val drawRect = Rect()
 
     // One invisible button per complication.
     private val complicationButtons =
-        watchFaceConfigActivity.editorSession.complicationSlotsState.mapValues { stateEntry ->
+        watchFaceConfigActivity.editorSession.complicationSlotsState.value.mapValues { entry ->
             // TODO(alexclarke): This button is a Rect which makes the tap animation look bad.
-            if (stateEntry.value.fixedComplicationDataSource ||
-                !stateEntry.value.isEnabled ||
-                stateEntry.key == watchFaceConfigActivity.editorSession.backgroundComplicationSlotId
+            if (entry.value.fixedComplicationDataSource ||
+                !entry.value.isEnabled ||
+                entry.key == watchFaceConfigActivity.editorSession.backgroundComplicationSlotId
             ) {
                 // Do not create a button for fixed complicationSlots, disabled complicationSlots,
                 // or background complicationSlots.
@@ -112,9 +107,15 @@
                             )
                         }.resourceId
                     )
-                    setOnClickListener { onComplicationButtonClicked(stateEntry.key) }
+                    setOnClickListener { onComplicationButtonClicked(entry.key) }
                     setOnLongClickListener {
-                        TooltipApi26.updateTooltip(it, watchFaceConfigActivity, stateEntry.key)
+                        watchFaceConfigActivity.coroutineScope.launch {
+                            val dataSourceInfo =
+                                watchFaceConfigActivity.editorSession
+                                    .getComplicationsDataSourceInfo().value[entry.key]
+                            it.tooltipText =
+                                dataSourceInfo?.name ?: "Empty complication data source"
+                        }
                         // Do not consume the long click so that the tooltip is shown by the
                         // default handler.
                         false
@@ -129,14 +130,22 @@
             previewComplicationData =
                 watchFaceConfigActivity.editorSession.getComplicationsPreviewData()
             setWillNotDraw(false)
+            previewComplicationData.collect {
+                requestLayout()
+                invalidate()
+            }
         }
     }
 
     override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
         super.onLayout(changed, left, top, right, bottom)
-        for ((id, view) in complicationButtons) {
-            val rect = watchFaceConfigActivity.editorSession.complicationSlotsState[id]!!.bounds
-            view?.layout(
+        for ((id, button) in complicationButtons) {
+            val rect =
+                watchFaceConfigActivity.editorSession.complicationSlotsState.value[id]!!.bounds
+            button?.width = rect.width()
+            button?.height = rect.width()
+            button?.layoutParams = LayoutParams(rect.width(), rect.height())
+            button?.layout(
                 rect.left,
                 rect.top,
                 rect.right,
@@ -152,30 +161,9 @@
                     complicationSlotId
                 )
             updateUi(chosenComplicationDataSource)
-            // Redraw after the complication data source chooser has run.
-            invalidate()
         }
     }
 
-    @RequiresApi(Build.VERSION_CODES.O)
-    private object TooltipApi26 {
-        fun updateTooltip(
-            button: View,
-            watchFaceConfigActivity: WatchFaceConfigActivity,
-            complicationSlotId: Int
-        ) {
-            watchFaceConfigActivity.coroutineScope.launch {
-                val dataSourceInfo =
-                    watchFaceConfigActivity.editorSession
-                        .getComplicationsDataSourceInfo()[complicationSlotId]
-                button.tooltipText = getDataSourceInfoToast(dataSourceInfo)
-            }
-        }
-
-        private fun getDataSourceInfoToast(dataSourceInfo: ComplicationDataSourceInfo?): String =
-            dataSourceInfo?.name ?: "Empty complication data source"
-    }
-
     override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
         drawRect.set(0, 0, width, height)
     }
@@ -193,7 +181,7 @@
                 )
             ),
             editingSession.previewReferenceInstant,
-            previewComplicationData
+            previewComplicationData.value
         )
         canvas.drawBitmap(bitmap, drawRect, drawRect, null)
     }
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
index ceeba0b..838a8e4 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
@@ -85,7 +85,7 @@
     private fun initConfigOptions() {
         val editingSession = watchFaceConfigActivity.editorSession
         val hasBackgroundComplication = editingSession.backgroundComplicationSlotId != null
-        val numComplications = editingSession.complicationSlotsState.size
+        val numComplications = editingSession.complicationSlotsState.value.size
         val hasNonBackgroundComplication =
             numComplications > if (hasBackgroundComplication) 1 else 0
         val configOptions = ArrayList<ConfigOption>()
@@ -186,7 +186,7 @@
                 watchFaceConfigActivity.fragmentController.showStyleConfigFragment(
                     configKey,
                     editingSession.userStyleSchema,
-                    editingSession.userStyle
+                    editingSession.userStyle.value
                 )
             }
         }
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt
index fb3cfe3..d020d17 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/StyleConfigFragment.kt
@@ -213,7 +213,7 @@
     internal fun setUserStyleOption(userStyleOption: UserStyleSetting.Option) {
         val watchFaceConfigActivity = (activity as WatchFaceConfigActivity)
         val editorSession = watchFaceConfigActivity.editorSession
-        editorSession.userStyle = userStyle.toMutableUserStyle().apply {
+        editorSession.userStyle.value = userStyle.toMutableUserStyle().apply {
             this[styleSetting] = userStyleOption
         }.toUserStyle()
     }
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
index 442620d..8d82ee9 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
@@ -162,7 +162,7 @@
         if (hasBackgroundComplication) {
             topLevelOptionCount++
         }
-        val numComplications = editorSession.complicationSlotsState.size
+        val numComplications = editorSession.complicationSlotsState.value.size
         val hasNonBackgroundComplication =
             numComplications > (if (hasBackgroundComplication) 1 else 0)
         if (hasNonBackgroundComplication) {
@@ -176,7 +176,8 @@
 
             // For a single complication go directly to the complication data source selector.
             numComplications == 1 -> {
-                val onlyComplication = editorSession.complicationSlotsState.entries.first()
+                val onlyComplication =
+                    editorSession.complicationSlotsState.value.entries.first()
                 coroutineScope.launch {
                     val chosenComplicationProvider =
                         fragmentController.showComplicationConfig(onlyComplication.key)
@@ -194,7 +195,7 @@
                 fragmentController.showStyleConfigFragment(
                     onlyStyleSetting.id.value,
                     editorSession.userStyleSchema,
-                    editorSession.userStyle
+                    editorSession.userStyle.value
                 )
             }
         }
diff --git a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
index e82a15e..eb0a902 100644
--- a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
+++ b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
@@ -191,7 +191,7 @@
 
         val resources = ApplicationProvider.getApplicationContext<Context>().resources
         val future = listenableEditorSession.getListenableComplicationPreviewData()
-        val previewData = future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        val previewData = future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS).value
 
         val leftComplicationData = previewData[LEFT_COMPLICATION_ID] as
             ShortTextComplicationData
@@ -255,7 +255,7 @@
         // This should update the preview data to point to the updated dataSource3 data.
         val previewComplication =
             listenableEditorSession.getListenableComplicationPreviewData()
-                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS)[LEFT_COMPLICATION_ID]
+                .get(TIMEOUT_MS, TimeUnit.MILLISECONDS).value[LEFT_COMPLICATION_ID]
                 as LongTextComplicationData
 
         assertThat(
@@ -287,8 +287,8 @@
 
             // Select [blueStyleOption] and [gothicStyleOption], which are the last options in the
             // corresponding setting definitions.
-            listenableEditorSession.userStyle =
-                listenableEditorSession.userStyle.toMutableUserStyle().apply {
+            listenableEditorSession.userStyle.value =
+                listenableEditorSession.userStyle.value.toMutableUserStyle().apply {
                     listenableEditorSession.userStyleSchema.userStyleSettings.forEach {
                         this[it] = it.options.last()
                     }
diff --git a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
index 7e22fa9..7f77b3f 100644
--- a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
+++ b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
@@ -476,7 +476,15 @@
                 ComplicationType.SMALL_IMAGE
             ),
             DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_SUNRISE_SUNSET),
-            ComplicationSlotBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
+            ComplicationSlotBounds(
+                ComplicationType.values().associateWith {
+                    if (it == ComplicationType.LONG_TEXT) {
+                        RectF(0.1f, 0.4f, 0.4f, 0.6f)
+                    } else {
+                        RectF(0.3f, 0.4f, 0.4f, 0.6f)
+                    }
+                }
+            )
         ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .build()
 
@@ -492,7 +500,15 @@
                 ComplicationType.SMALL_IMAGE
             ),
             DefaultComplicationDataSourcePolicy(SystemDataSources.DATA_SOURCE_DAY_OF_WEEK),
-            ComplicationSlotBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
+            ComplicationSlotBounds(
+                ComplicationType.values().associateWith {
+                    if (it == ComplicationType.LONG_TEXT) {
+                        RectF(0.6f, 0.4f, 0.9f, 0.6f)
+                    } else {
+                        RectF(0.6f, 0.4f, 0.7f, 0.6f)
+                    }
+                }
+            )
         ).setDefaultDataSourceType(ComplicationType.SHORT_TEXT)
             .setConfigExtras(
                 Bundle().apply {
@@ -733,45 +749,37 @@
             listOf(leftComplication, rightComplication, backgroundComplication)
         )
         scenario.onActivity {
-            assertThat(it.editorSession.complicationSlotsState.size).isEqualTo(3)
-            assertThat(it.editorSession.complicationSlotsState[LEFT_COMPLICATION_ID]!!.bounds)
-                .isEqualTo(Rect(80, 160, 160, 240))
-            assertThat(it.editorSession.complicationSlotsState[LEFT_COMPLICATION_ID]!!.boundsType)
+            val complicationSlotsState = it.editorSession.complicationSlotsState.value
+            assertThat(complicationSlotsState.size).isEqualTo(3)
+            assertThat(complicationSlotsState[LEFT_COMPLICATION_ID]!!.bounds)
+                .isEqualTo(Rect(120, 160, 160, 240))
+            assertThat(complicationSlotsState[LEFT_COMPLICATION_ID]!!.boundsType)
                 .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
             assertFalse(
-                it.editorSession.complicationSlotsState[
-                    LEFT_COMPLICATION_ID
-                ]!!.fixedComplicationDataSource
+                complicationSlotsState[LEFT_COMPLICATION_ID]!!.fixedComplicationDataSource
             )
             assertTrue(
-                it.editorSession.complicationSlotsState[LEFT_COMPLICATION_ID]!!.isInitiallyEnabled
+                complicationSlotsState[LEFT_COMPLICATION_ID]!!.isInitiallyEnabled
             )
 
-            assertThat(it.editorSession.complicationSlotsState[RIGHT_COMPLICATION_ID]!!.bounds)
-                .isEqualTo(Rect(240, 160, 320, 240))
-            assertThat(it.editorSession.complicationSlotsState[RIGHT_COMPLICATION_ID]!!.boundsType)
+            assertThat(complicationSlotsState[RIGHT_COMPLICATION_ID]!!.bounds)
+                .isEqualTo(Rect(240, 160, 280, 240))
+            assertThat(complicationSlotsState[RIGHT_COMPLICATION_ID]!!.boundsType)
                 .isEqualTo(ComplicationSlotBoundsType.ROUND_RECT)
             assertFalse(
-                it.editorSession.complicationSlotsState[RIGHT_COMPLICATION_ID]!!
-                    .fixedComplicationDataSource
+                complicationSlotsState[RIGHT_COMPLICATION_ID]!!.fixedComplicationDataSource
             )
-            assertTrue(
-                it.editorSession.complicationSlotsState[RIGHT_COMPLICATION_ID]!!.isInitiallyEnabled
-            )
+            assertTrue(complicationSlotsState[RIGHT_COMPLICATION_ID]!!.isInitiallyEnabled)
 
-            assertThat(it.editorSession.complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!.bounds)
+            assertThat(complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!.bounds)
                 .isEqualTo(screenBounds)
-            assertThat(
-                it.editorSession.complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!.boundsType
-            ).isEqualTo(ComplicationSlotBoundsType.BACKGROUND)
+            assertThat(complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!.boundsType)
+                .isEqualTo(ComplicationSlotBoundsType.BACKGROUND)
             assertFalse(
-                it.editorSession.complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!
-                    .fixedComplicationDataSource
+                complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!.fixedComplicationDataSource
             )
             assertFalse(
-                it.editorSession.complicationSlotsState[
-                    BACKGROUND_COMPLICATION_ID
-                ]!!.isInitiallyEnabled
+                complicationSlotsState[BACKGROUND_COMPLICATION_ID]!!.isInitiallyEnabled
             )
             // We could test more state but this should be enough.
         }
@@ -808,7 +816,7 @@
         )
         scenario.onActivity {
             assertTrue(
-                it.editorSession.complicationSlotsState[
+                it.editorSession.complicationSlotsState.value[
                     LEFT_COMPLICATION_ID
                 ]!!.fixedComplicationDataSource
             )
@@ -1085,6 +1093,10 @@
         }
 
         runBlocking {
+            assertThat(
+                editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds
+            ).isEqualTo(Rect(120, 160, 160, 240))
+
             /**
              * Invoke [TestComplicationHelperActivity] which will change the complication data
              * source (and hence the preview data) for [LEFT_COMPLICATION_ID].
@@ -1102,7 +1114,7 @@
 
             // This should update the preview data to point to the updated DataSource3 data.
             val previewComplication =
-                editorSession.getComplicationsPreviewData()[LEFT_COMPLICATION_ID]
+                editorSession.getComplicationsPreviewData().value[LEFT_COMPLICATION_ID]
                     as LongTextComplicationData
 
             assertThat(
@@ -1117,6 +1129,12 @@
                     ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID
                 )
             ).isEqualTo(testInstanceId.id)
+
+            // Selecting a LONG_TEXT complication should enlarge the complication's bounds due to
+            // it's set up.
+            assertThat(
+                editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds
+            ).isEqualTo(Rect(40, 160, 160, 240))
         }
     }
 
@@ -1239,7 +1257,7 @@
             assertThat(chosenComplicationDataSource.complicationSlotId)
                 .isEqualTo(LEFT_COMPLICATION_ID)
             assertThat(chosenComplicationDataSource.complicationDataSourceInfo).isNull()
-            assertThat(editorSession.getComplicationsPreviewData()[LEFT_COMPLICATION_ID])
+            assertThat(editorSession.getComplicationsPreviewData().value[LEFT_COMPLICATION_ID])
                 .isInstanceOf(EmptyComplicationData::class.java)
         }
     }
@@ -1391,7 +1409,7 @@
         )
         scenario.onActivity {
             assertThat(it.editorSession.getComplicationSlotIdAt(0, 0)).isEqualTo(null)
-            assertThat(it.editorSession.getComplicationSlotIdAt(85, 165))
+            assertThat(it.editorSession.getComplicationSlotIdAt(125, 165))
                 .isEqualTo(LEFT_COMPLICATION_ID)
             assertThat(it.editorSession.getComplicationSlotIdAt(245, 165))
                 .isEqualTo(RIGHT_COMPLICATION_ID)
@@ -1427,9 +1445,9 @@
         )
 
         scenario.onActivity { activity ->
-            assertThat(activity.editorSession.userStyle[colorStyleSetting])
+            assertThat(activity.editorSession.userStyle.value[colorStyleSetting])
                 .isEqualTo(greenStyleOption)
-            assertThat(activity.editorSession.userStyle[watchHandStyleSetting])
+            assertThat(activity.editorSession.userStyle.value[watchHandStyleSetting])
                 .isEqualTo(modernStyleOption)
         }
     }
@@ -1447,11 +1465,11 @@
 
         scenario.onActivity { activity ->
             // Select [blueStyleOption] and [gothicStyleOption].
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
                 mutableUserStyle[userStyleSetting] = userStyleSetting.options.last()
             }
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
             activity.editorSession.close()
             activity.finish()
         }
@@ -1509,9 +1527,9 @@
 
         scenario.onActivity { activity ->
             // Hide the left complication.
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             mutableUserStyle[complicationsStyleSetting] = rightOnlyComplicationsOption
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
             activity.editorSession.close()
             activity.finish()
         }
@@ -1596,11 +1614,11 @@
                 .isEqualTo(classicStyleOption.id.value)
 
             // Select [blueStyleOption] and [gothicStyleOption].
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
                 mutableUserStyle[userStyleSetting] = userStyleSetting.options.last()
             }
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
 
             // The editorDelegate should be unaffected because a separate headless instance is
             // used.
@@ -1647,11 +1665,11 @@
                 activity.deferredDone.await()
             }
             // Select [blueStyleOption] and [gothicStyleOption].
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
                 mutableUserStyle[userStyleSetting] = userStyleSetting.options.last()
             }
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
             activity.editorSession.close()
             activity.finish()
         }
@@ -1691,11 +1709,11 @@
                 .isEqualTo(classicStyleOption.id.value)
 
             // Select [blueStyleOption] and [gothicStyleOption].
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
                 mutableUserStyle[userStyleSetting] = userStyleSetting.options.last()
             }
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
 
             // This should cause the style on the to be reverted back to the initial style.
             activity.editorSession.commitChangesOnClose = false
@@ -1740,11 +1758,11 @@
                 .isEqualTo(classicStyleOption.id.value)
 
             // Select [blueStyleOption] and [gothicStyleOption].
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
                 mutableUserStyle[userStyleSetting] = userStyleSetting.options.last()
             }
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
 
             activity.editorSession.close()
             activity.finish()
@@ -1835,11 +1853,11 @@
 
         scenario.onActivity { activity ->
             // Select [blueStyleOption] and [gothicStyleOption].
-            val mutableUserStyle = activity.editorSession.userStyle.toMutableUserStyle()
+            val mutableUserStyle = activity.editorSession.userStyle.value.toMutableUserStyle()
             for (userStyleSetting in activity.editorSession.userStyleSchema.userStyleSettings) {
                 mutableUserStyle[userStyleSetting] = userStyleSetting.options.last()
             }
-            activity.editorSession.userStyle = mutableUserStyle.toUserStyle()
+            activity.editorSession.userStyle.value = mutableUserStyle.toUserStyle()
         }
 
         EditorService.globalEditorService.closeEditor()
@@ -1978,7 +1996,7 @@
 
         scenario.onActivity { activity ->
             runBlocking {
-                val previewData = activity.editorSession.getComplicationsPreviewData()
+                val previewData = activity.editorSession.getComplicationsPreviewData().value
                 assertThat(previewData.size).isEqualTo(2)
                 assertThat(previewData[LEFT_COMPLICATION_ID])
                     .isInstanceOf(ShortTextComplicationData::class.java)
@@ -2013,7 +2031,7 @@
 
         scenario.onActivity { activity ->
             runBlocking {
-                val previewData = activity.editorSession.getComplicationsPreviewData()
+                val previewData = activity.editorSession.getComplicationsPreviewData().value
                 assertThat(previewData.size).isEqualTo(2)
                 assertThat(previewData[LEFT_COMPLICATION_ID])
                     .isInstanceOf(ShortTextComplicationData::class.java)
diff --git a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index 9d31efb..55bb17e 100644
--- a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -68,6 +68,10 @@
 import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.async
 import kotlinx.coroutines.cancel
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
@@ -106,7 +110,7 @@
      * The current [UserStyle]. Assigning to this will cause the style to update. However, styling
      * changes to the watch face will be reverted upon exit.
      */
-    public var userStyle: UserStyle
+    public val userStyle: MutableStateFlow<UserStyle>
 
     /** The reference preview [Instant] for this watch face to render previews with. */
     public val previewReferenceInstant: Instant
@@ -115,10 +119,10 @@
     public val userStyleSchema: UserStyleSchema
 
     /**
-     * Map of complication slot ids to [ComplicationSlotState] for each complication slot. Note
-     * [ComplicationSlotState] can change, typically in response to styling.
+     * A [Flow] of a Map of complication slot ids to [ComplicationSlotState] for each complication
+     * slot.
      */
-    public val complicationSlotsState: Map<Int, ComplicationSlotState>
+    public val complicationSlotsState: StateFlow<Map<Int, ComplicationSlotState>>
 
     /**
      * Whether any changes should be committed when the session is closed (defaults to `true`).
@@ -139,17 +143,17 @@
     public var commitChangesOnClose: Boolean
 
     /**
-     * Returns a map of [androidx.wear.watchface.ComplicationSlot] ids to preview [ComplicationData]
-     * suitable for use in rendering a preview of the watch face. Note if a slot is configured to
-     * be empty then it will an instance of [EmptyComplicationData]. Disabled complicationSlots
-     * are included. Note also unlike live data this is static per complication data source, but it
-     * may update (on the UiThread) as a result of [openComplicationDataSourceChooser].
+     * Returns a flow of maps of [androidx.wear.watchface.ComplicationSlot] ids to preview
+     * [ComplicationData] suitable for use in rendering a preview of the watch face. Note if a
+     * slot is configured to be empty then it will an instance of [EmptyComplicationData].
+     * Disabled complicationSlots are included. Note also unlike live data this is static per
+     * complication data source, but it may update (on the UiThread) as a result of
+     * [openComplicationDataSourceChooser].
      */
-    @UiThread
-    public suspend fun getComplicationsPreviewData(): Map<Int, ComplicationData>
+    public suspend fun getComplicationsPreviewData(): StateFlow<Map<Int, ComplicationData>>
 
     /**
-     * Returns a map of [androidx.wear.watchface.ComplicationSlot] ids to
+     * Returns a flow of maps of [androidx.wear.watchface.ComplicationSlot] ids to
      * [ComplicationDataSourceInfo] that represent the information available about the data
      * source for each complication.
      *
@@ -157,9 +161,8 @@
      * [androidx.wear.watchface.ComplicationSlot] is configured to show the empty complication
      * data source.
      */
-    @UiThread
-    public suspend fun getComplicationsDataSourceInfo():
-        Map<Int, ComplicationDataSourceInfo?>
+    public suspend fun
+    getComplicationsDataSourceInfo(): StateFlow<Map<Int, ComplicationDataSourceInfo?>>
 
     /** The ID of the background complication or `null` if there isn't one. */
     @get:SuppressWarnings("AutoBoxing")
@@ -197,9 +200,6 @@
      * instance of [ChosenComplicationDataSource] that contains information about the chosen
      * data source.
      *
-     * If the complication data source was changed then the map returned by
-     * [getComplicationsPreviewData] is updated (on the UiThread).
-     *
      * @param complicationSlotId The id of the [androidx.wear.watchface.ComplicationSlot] to select
      * a complication data source for.
      * @throws IllegalStateException if a previous invocation of openComplicationDataSourceChooser
@@ -270,11 +270,9 @@
             "EditorSession.createOnWatchEditorSessionAsyncImpl"
         ).use {
             val coroutineScope = CoroutineScope(Dispatchers.Main.immediate)
-            var isRFlow = true
             val editorRequest = editIntent.getParcelableExtra<ComponentName>(
                 Constants.EXTRA_WATCH_FACE_COMPONENT
             )?.let {
-                isRFlow = false
                 EditorRequest(it, "", null)
             } ?: EditorRequest.createFromIntent(editIntent)
             // We need to respect the lifecycle and register the ActivityResultListener now.
@@ -285,7 +283,6 @@
                 editorRequest.initialUserStyle,
                 complicationDataSourceInfoRetrieverProvider,
                 coroutineScope,
-                isRFlow,
                 editorRequest.previewScreenshotParams
             )
             // But full initialization has to be deferred because
@@ -424,20 +421,19 @@
      * This is completed when [fetchComplicationsData] has called [getPreviewData] for each
      * complication and each of those have been completed.
      */
-    private val deferredComplicationPreviewDataMap =
-        CompletableDeferred<MutableMap<Int, ComplicationData>>()
+    internal val deferredComplicationPreviewDataMapFlow =
+        CompletableDeferred<MutableStateFlow<Map<Int, ComplicationData>>>()
 
-    override suspend fun getComplicationsPreviewData(): Map<Int, ComplicationData> {
-        return deferredComplicationPreviewDataMap.await()
-    }
+    override suspend fun getComplicationsPreviewData(): StateFlow<Map<Int, ComplicationData>> =
+        deferredComplicationPreviewDataMapFlow.await()
 
-    // This is completed when [fetchDataSourceInfo] has called [getDataSourceInfo] for each
-    // complication and each of those have been completed.
-    private val deferredComplicationsDataSourceInfoMap =
-        CompletableDeferred<MutableMap<Int, ComplicationDataSourceInfo?>>()
+    /** This is completed when [fetchComplicationsData] has fetched the data. */
+    private val deferredComplicationsDataSourceInfoMapFlow =
+        CompletableDeferred<MutableStateFlow<Map<Int, ComplicationDataSourceInfo?>>>()
 
-    override suspend fun getComplicationsDataSourceInfo(): Map<Int, ComplicationDataSourceInfo?> =
-        deferredComplicationsDataSourceInfoMap.await()
+    override suspend fun
+    getComplicationsDataSourceInfo(): StateFlow<Map<Int, ComplicationDataSourceInfo?>> =
+        deferredComplicationsDataSourceInfoMapFlow.await()
 
     /** Pending result for ComplicationDataSourceChooserRequest. */
     internal var pendingComplicationDataSourceChooserResult:
@@ -448,6 +444,21 @@
             onComplicationDataSourceChooserResult(it)
         }
 
+    // Fetches the current ComplicationSlotState for each complication.
+    internal abstract fun fetchComplicationSlotsState(): Map<Int, ComplicationSlotState>
+
+    private val complicationSlotsStateDelegate = lazy {
+        MutableStateFlow(fetchComplicationSlotsState())
+    }
+    override val complicationSlotsState by complicationSlotsStateDelegate
+
+    /** Updates [complicationSlotsState] if it has been initialized. */
+    internal fun maybeUpdateComplicationSlotsState() {
+        if (complicationSlotsStateDelegate.isInitialized()) {
+            complicationSlotsState.value = fetchComplicationSlotsState()
+        }
+    }
+
     internal fun onComplicationDataSourceChooserResult(
         complicationDataSourceChooserResult: ComplicationDataSourceChooserResult?
     ) {
@@ -464,7 +475,10 @@
         "BaseEditorSession.openComplicationDataSourceChooser $complicationSlotId"
     ).use {
         requireNotClosed()
-        require(!complicationSlotsState[complicationSlotId]!!.fixedComplicationDataSource) {
+        require(
+            !complicationSlotsState.value[complicationSlotId]!!
+                .fixedComplicationDataSource
+        ) {
             "Can't configure fixed complication ID $complicationSlotId"
         }
 
@@ -506,20 +520,27 @@
             complicationDataSourceInfoRetrieverProvider.getComplicationDataSourceInfoRetriever()
 
         try {
-            val complicationsDataSourceInfoMap = deferredComplicationsDataSourceInfoMap.await()
-            complicationsDataSourceInfoMap[complicationSlotId] =
-                complicationDataSourceChooserResult.dataSourceInfo
+            val complicationsDataSourceInfoMapFlow =
+                deferredComplicationsDataSourceInfoMapFlow.await()
+
+            // Emit an updated complicationsDataSourceInfoMap.
+            complicationsDataSourceInfoMapFlow.value =
+                HashMap(complicationsDataSourceInfoMapFlow.value).apply {
+                    this[complicationSlotId] = complicationDataSourceChooserResult.dataSourceInfo
+                }
+
             val previewData = getPreviewData(
                 complicationDataSourceInfoRetriever,
                 complicationDataSourceChooserResult.dataSourceInfo
             )
-            val complicationPreviewDataMap = deferredComplicationPreviewDataMap.await()
-            if (previewData == null) {
-                complicationPreviewDataMap[complicationSlotId] =
-                    EmptyComplicationData()
-            } else {
-                complicationPreviewDataMap[complicationSlotId] = previewData
-            }
+            val complicationPreviewDataMapFlow = deferredComplicationPreviewDataMapFlow.await()
+
+            // Emit an updated complicationPreviewDataMap.
+            complicationPreviewDataMapFlow.value =
+                HashMap(complicationPreviewDataMapFlow.value).apply {
+                    this[complicationSlotId] = previewData ?: EmptyComplicationData()
+                }
+
             return ChosenComplicationDataSource(
                 complicationSlotId,
                 complicationDataSourceChooserResult.dataSourceInfo,
@@ -528,19 +549,24 @@
         } finally {
             // This gets called after the above coroutine has finished.
             complicationDataSourceInfoRetriever.close()
+
+            // Changing a complication data source could result in the type and therefore the bounds
+            // changing. This needs to be done after updating the preview data in case that affects
+            // the ComplicationType and hence the bounds of the complication.
+            maybeUpdateComplicationSlotsState()
         }
     }
 
     override val backgroundComplicationSlotId: Int? by lazy {
         requireNotClosed()
-        complicationSlotsState.entries.firstOrNull {
+        complicationSlotsState.value.entries.firstOrNull {
             it.value.boundsType == ComplicationSlotBoundsType.BACKGROUND
         }?.key
     }
 
     override fun getComplicationSlotIdAt(@Px x: Int, @Px y: Int): Int? {
         requireNotClosed()
-        return complicationSlotsState.entries.firstOrNull {
+        return complicationSlotsState.value.entries.firstOrNull {
             it.value.isEnabled && when (it.value.boundsType) {
                 ComplicationSlotBoundsType.ROUND_RECT -> it.value.bounds.contains(x, y)
                 ComplicationSlotBoundsType.BACKGROUND -> false
@@ -592,7 +618,9 @@
     protected fun fetchComplicationsData(fetchCoroutineScope: CoroutineScope): Job {
         val complicationDataSourceInfoRetriever =
             complicationDataSourceInfoRetrieverProvider.getComplicationDataSourceInfoRetriever()
-        return fetchCoroutineScope.launchWithTracing("BaseEditorSession.fetchComplicationsData") {
+        return fetchCoroutineScope.launchWithTracing(
+            "BaseEditorSession.fetchComplicationsData"
+        ) {
             try {
                 // Unlikely but WCS could conceivably crash during this call. We could retry but
                 // it's not obvious if that'd succeed or if WCS session state is recoverable,
@@ -600,26 +628,29 @@
                 val dataSourceInfoArray =
                     complicationDataSourceInfoRetriever.retrieveComplicationDataSourceInfo(
                         watchFaceComponentName,
-                        complicationSlotsState.keys.toIntArray()
+                        complicationSlotsState.value.keys.toIntArray()
                     )
-                deferredComplicationsDataSourceInfoMap.complete(
-                    extractComplicationsDataSourceInfoMap(dataSourceInfoArray)?.toMutableMap()
-                        ?: mutableMapOf()
+                deferredComplicationsDataSourceInfoMapFlow.complete(
+                    MutableStateFlow(
+                        extractComplicationsDataSourceInfoMap(dataSourceInfoArray) ?: emptyMap()
+                    )
                 )
-                deferredComplicationPreviewDataMap.complete(
-                    // Parallel fetch preview ComplicationData.
-                    dataSourceInfoArray?.associateBy(
-                        { it.slotId },
-                        {
-                            async {
-                                getPreviewData(complicationDataSourceInfoRetriever, it.info)
+                // Parallel fetch preview ComplicationData.
+                deferredComplicationPreviewDataMapFlow.complete(
+                    MutableStateFlow(
+                        dataSourceInfoArray?.associateBy(
+                            { it.slotId },
+                            {
+                                async {
+                                    getPreviewData(complicationDataSourceInfoRetriever, it.info)
+                                }
                             }
-                        }
-                        // Coerce to a Map<Int, ComplicationData> omitting null values.
-                        // If mapNotNullValues existed we would use it here.
-                    )?.mapValues {
-                        it.value.await() ?: EmptyComplicationData()
-                    }?.toMutableMap() ?: mutableMapOf()
+                            // Coerce to a Map<Int, ComplicationData> omitting null values.
+                            // If mapNotNullValues existed we would use it here.
+                        )?.mapValues {
+                            it.value.await() ?: EmptyComplicationData()
+                        } ?: emptyMap()
+                    )
                 )
             } finally {
                 complicationDataSourceInfoRetriever.close()
@@ -646,7 +677,7 @@
                                 renderWatchFaceToBitmap(
                                     previewScreenshotParams.renderParameters,
                                     previewScreenshotParams.instant,
-                                    getComplicationsPreviewData()
+                                    getComplicationsPreviewData().value
                                 )
                             )
                         } else {
@@ -655,9 +686,9 @@
                     EditorService.globalEditorService.broadcastEditorState(
                         EditorStateWireFormat(
                             watchFaceId.id,
-                            userStyle.toWireFormat(),
-                            getComplicationsPreviewData().mapNotNull {
-                                if (complicationSlotsState[it.key]!!.isEnabled) {
+                            userStyle.value.toWireFormat(),
+                            getComplicationsPreviewData().value.mapNotNull {
+                                if (complicationSlotsState.value[it.key]!!.isEnabled) {
                                     IdAndComplicationDataWireFormat(
                                         it.key,
                                         it.value.asWireComplicationData()
@@ -709,7 +740,6 @@
     private val initialEditorUserStyle: UserStyleData?,
     complicationDataSourceInfoRetrieverProvider: ComplicationDataSourceInfoRetrieverProvider,
     coroutineScope: CoroutineScope,
-    private val isRFlow: Boolean,
     previewScreenshotParams: PreviewScreenshotParams?
 ) : BaseEditorSession(
     activity,
@@ -728,11 +758,24 @@
         editorDelegate.previewReferenceInstant
     }
 
-    override val complicationSlotsState
-        get() = editorDelegate.complicationSlotsManager.complicationSlots.mapValues {
+    override fun fetchComplicationSlotsState(): Map<Int, ComplicationSlotState> {
+        val previewDataMap = runBlocking {
+            if (deferredComplicationPreviewDataMapFlow.isCompleted) {
+                deferredComplicationPreviewDataMapFlow.await().value
+            } else {
+                null
+            }
+        }
+        return editorDelegate.complicationSlotsManager.complicationSlots.mapValues {
             requireNotClosed()
+            // Get the ComplicationType from the preview data if available. This is important
+            // because the type and therefore bounds may change based on the selected complication
+            // data source.
+            val type = previewDataMap?.let { previewDataMap ->
+                previewDataMap[it.key]!!.type
+            } ?: it.value.complicationData.value.type
             ComplicationSlotState(
-                it.value.computeBounds(editorDelegate.screenBounds),
+                it.value.computeBounds(editorDelegate.screenBounds, type),
                 it.value.boundsType,
                 it.value.supportedTypes,
                 it.value.defaultDataSourcePolicy,
@@ -744,24 +787,9 @@
                 it.value.configExtras
             )
         }
+    }
 
-    private var _userStyle: UserStyle? = null
-
-    // We make a deep copy of the style because assigning to it can otherwise have unexpected
-    // side effects (it would apply to the active watch face).
-    override var userStyle: UserStyle
-        get() {
-            requireNotClosed()
-            if (_userStyle == null) {
-                _userStyle = UserStyle(editorDelegate.userStyle)
-            }
-            return _userStyle!!
-        }
-        set(value) {
-            requireNotClosed()
-            _userStyle = value
-            editorDelegate.userStyle = UserStyle(value)
-        }
+    override val userStyle by lazy { MutableStateFlow(editorDelegate.userStyle) }
 
     private lateinit var previousWatchFaceUserStyle: UserStyle
     private lateinit var backgroundCoroutineScope: CoroutineScope
@@ -793,7 +821,7 @@
         // fail to persist this change and we rely on the system reverting the style change in this
         // eventuality.
         if (!commitChangesOnClose && this::previousWatchFaceUserStyle.isInitialized) {
-            userStyle = previousWatchFaceUserStyle
+            userStyle.value = previousWatchFaceUserStyle
         }
 
         if (this::fetchComplicationsDataJob.isInitialized) {
@@ -820,7 +848,7 @@
     fun setEditorDelegate(editorDelegate: WatchFace.EditorDelegate) {
         this.editorDelegate = editorDelegate
 
-        previousWatchFaceUserStyle = UserStyle(editorDelegate.userStyle)
+        previousWatchFaceUserStyle = editorDelegate.userStyle
 
         // Apply any initial style from the intent.  Note we don't restore the previous style at
         // the end since we assume we're editing the current active watchface.
@@ -834,6 +862,20 @@
         )
 
         fetchComplicationsDataJob = fetchComplicationsData(backgroundCoroutineScope)
+
+        coroutineScope.launch {
+            var first = true
+            userStyle.collect {
+                // We can ignore the first callback because it's for the initial style.
+                if (!first) {
+                    editorDelegate.userStyle = it
+
+                    // Changing the style may enable/disable complications.
+                    maybeUpdateComplicationSlotsState()
+                }
+                first = false
+            }
+        }
     }
 }
 
@@ -855,11 +897,27 @@
 ) {
     override val userStyleSchema = headlessWatchFaceClient.userStyleSchema
 
-    override var userStyle = UserStyle(initialUserStyle, userStyleSchema)
+    override val userStyle = MutableStateFlow(UserStyle(initialUserStyle, userStyleSchema))
+
+    init {
+        coroutineScope.launch {
+            var first = true
+            userStyle.collect {
+                // Changing the style may enable/disable complications. We can ignore the first
+                // callback because it's for the initial style.
+                if (!first) {
+                    maybeUpdateComplicationSlotsState()
+                }
+                first = false
+            }
+        }
+    }
 
     override val previewReferenceInstant = headlessWatchFaceClient.previewReferenceInstant
 
-    override val complicationSlotsState = headlessWatchFaceClient.complicationSlotsState
+    // Fetches the current ComplicationSlotState for each complication.
+    override fun fetchComplicationSlotsState(): Map<Int, ComplicationSlotState> =
+        headlessWatchFaceClient.complicationSlotsState
 
     override fun renderWatchFaceToBitmap(
         renderParameters: RenderParameters,
@@ -874,7 +932,7 @@
             } else {
                 instant
             },
-            userStyle,
+            userStyle.value,
             slotIdToComplicationData
         )
     }
@@ -923,15 +981,15 @@
         context: Context,
         input: ComplicationDataSourceChooserRequest
     ): Intent {
+        val complicationSlotsState = input.editorSession.complicationSlotsState.value
         val intent = ComplicationHelperActivity.createComplicationDataSourceChooserHelperIntent(
             context,
             input.editorSession.watchFaceComponentName,
             input.complicationSlotId,
-            input.editorSession.complicationSlotsState[input.complicationSlotId]!!.supportedTypes,
+            complicationSlotsState[input.complicationSlotId]!!.supportedTypes,
             input.instanceId
         )
-        val complicationState =
-            input.editorSession.complicationSlotsState[input.complicationSlotId]!!
+        val complicationState = complicationSlotsState[input.complicationSlotId]!!
         intent.replaceExtras(
             Bundle(complicationState.complicationConfigExtras).apply { putAll(intent.extras!!) }
         )
@@ -945,8 +1003,8 @@
     }
 
     override fun parseResult(resultCode: Int, intent: Intent?) = intent?.let {
-        val extras = intent.extras?.let {
-            Bundle(it).apply { remove(EXTRA_PROVIDER_INFO) }
+        val extras = intent.extras?.let { extras ->
+            Bundle(extras).apply { remove(EXTRA_PROVIDER_INFO) }
         } ?: Bundle.EMPTY
         ComplicationDataSourceChooserResult(
             it.getParcelableExtra<android.support.wearable.complications.ComplicationProviderInfo>(
diff --git a/wear/wear-watchface-guava/api/current.txt b/wear/wear-watchface-guava/api/current.txt
index 8c68d0a..a01ac28 100644
--- a/wear/wear-watchface-guava/api/current.txt
+++ b/wear/wear-watchface-guava/api/current.txt
@@ -1,6 +1,25 @@
 // Signature format: 4.0
 package androidx.wear.watchface {
 
+  public abstract class ListenableCanvasRenderer extends androidx.wear.watchface.Renderer.CanvasRenderer {
+    ctor public ListenableCanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @androidx.wear.watchface.CanvasType int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
+    method public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> initFuture();
+  }
+
+  public abstract class ListenableGlesRenderer extends androidx.wear.watchface.Renderer.GlesRenderer {
+    ctor public ListenableGlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList);
+    method public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method protected com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> onBackgroundThreadGlContextCreatedFuture();
+    method public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread protected com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> onUiThreadGlSurfaceCreatedFuture(@Px int width, @Px int height);
+    method @WorkerThread public final void runBackgroundThreadGlCommands(Runnable runnable);
+    method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
+  }
+
+  public final class ListenableGlesRendererKt {
+  }
+
   public abstract class ListenableWatchFaceService extends androidx.wear.watchface.WatchFaceService {
     ctor public ListenableWatchFaceService();
     method protected suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
diff --git a/wear/wear-watchface-guava/api/public_plus_experimental_current.txt b/wear/wear-watchface-guava/api/public_plus_experimental_current.txt
index 8c68d0a..a01ac28 100644
--- a/wear/wear-watchface-guava/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-guava/api/public_plus_experimental_current.txt
@@ -1,6 +1,25 @@
 // Signature format: 4.0
 package androidx.wear.watchface {
 
+  public abstract class ListenableCanvasRenderer extends androidx.wear.watchface.Renderer.CanvasRenderer {
+    ctor public ListenableCanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @androidx.wear.watchface.CanvasType int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
+    method public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> initFuture();
+  }
+
+  public abstract class ListenableGlesRenderer extends androidx.wear.watchface.Renderer.GlesRenderer {
+    ctor public ListenableGlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList);
+    method public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method protected com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> onBackgroundThreadGlContextCreatedFuture();
+    method public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread protected com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> onUiThreadGlSurfaceCreatedFuture(@Px int width, @Px int height);
+    method @WorkerThread public final void runBackgroundThreadGlCommands(Runnable runnable);
+    method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
+  }
+
+  public final class ListenableGlesRendererKt {
+  }
+
   public abstract class ListenableWatchFaceService extends androidx.wear.watchface.WatchFaceService {
     ctor public ListenableWatchFaceService();
     method protected suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
diff --git a/wear/wear-watchface-guava/api/restricted_current.txt b/wear/wear-watchface-guava/api/restricted_current.txt
index 8c68d0a..a01ac28 100644
--- a/wear/wear-watchface-guava/api/restricted_current.txt
+++ b/wear/wear-watchface-guava/api/restricted_current.txt
@@ -1,6 +1,25 @@
 // Signature format: 4.0
 package androidx.wear.watchface {
 
+  public abstract class ListenableCanvasRenderer extends androidx.wear.watchface.Renderer.CanvasRenderer {
+    ctor public ListenableCanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @androidx.wear.watchface.CanvasType int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
+    method public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> initFuture();
+  }
+
+  public abstract class ListenableGlesRenderer extends androidx.wear.watchface.Renderer.GlesRenderer {
+    ctor public ListenableGlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList);
+    method public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method protected com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> onBackgroundThreadGlContextCreatedFuture();
+    method public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread protected com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> onUiThreadGlSurfaceCreatedFuture(@Px int width, @Px int height);
+    method @WorkerThread public final void runBackgroundThreadGlCommands(Runnable runnable);
+    method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
+  }
+
+  public final class ListenableGlesRendererKt {
+  }
+
   public abstract class ListenableWatchFaceService extends androidx.wear.watchface.WatchFaceService {
     ctor public ListenableWatchFaceService();
     method protected suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
diff --git a/wear/wear-watchface-guava/build.gradle b/wear/wear-watchface-guava/build.gradle
index 62b5606..d355b9c 100644
--- a/wear/wear-watchface-guava/build.gradle
+++ b/wear/wear-watchface-guava/build.gradle
@@ -27,8 +27,9 @@
 
 dependencies {
     api(project(":wear:wear-watchface"))
-    api(libs.guavaListenableFuture)
+    api(libs.guavaAndroid)
 
+    androidTestImplementation(project(":wear:wear-watchface-client"))
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
diff --git a/wear/wear-watchface-guava/src/androidTest/AndroidManifest.xml b/wear/wear-watchface-guava/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..235f4ce
--- /dev/null
+++ b/wear/wear-watchface-guava/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<!--
+  Copyright 2021 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.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.wear.watchface.test">
+    <application android:requestLegacyExternalStorage="true">
+        <service android:name="androidx.wear.watchface.test.WatchFaceControlTestService"/>
+    </application>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+</manifest>
\ No newline at end of file
diff --git a/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableCanvasRendererTest.kt b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableCanvasRendererTest.kt
new file mode 100644
index 0000000..82b3197
--- /dev/null
+++ b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableCanvasRendererTest.kt
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2021 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.wear.watchface.test
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Rect
+import android.os.Build
+import android.view.SurfaceHolder
+import androidx.annotation.RequiresApi
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.wear.watchface.CanvasType
+import androidx.wear.watchface.ComplicationSlotsManager
+import androidx.wear.watchface.ListenableCanvasRenderer
+import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceService
+import androidx.wear.watchface.WatchFaceType
+import androidx.wear.watchface.WatchState
+import androidx.wear.watchface.client.DeviceConfig
+import androidx.wear.watchface.client.WatchUiState
+import androidx.wear.watchface.style.CurrentUserStyleRepository
+import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.ListenableFuture
+import com.google.common.util.concurrent.SettableFuture
+import kotlinx.coroutines.async
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.time.ZoneId
+import java.time.ZonedDateTime
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+internal class TestAsyncCanvasRenderInitWatchFaceService(
+    testContext: Context,
+    private var surfaceHolderOverride: SurfaceHolder,
+    private var initFuture: ListenableFuture<Unit>
+) : WatchFaceService() {
+
+    val lock = Any()
+    val initFutureLatch = CountDownLatch(1)
+    var hasRendered = false
+
+    init {
+        attachBaseContext(testContext)
+    }
+
+    override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
+
+    override suspend fun createWatchFace(
+        surfaceHolder: SurfaceHolder,
+        watchState: WatchState,
+        complicationSlotsManager: ComplicationSlotsManager,
+        currentUserStyleRepository: CurrentUserStyleRepository
+    ) = WatchFace(
+        WatchFaceType.DIGITAL,
+        object : ListenableCanvasRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            CanvasType.HARDWARE,
+            16
+        ) {
+            override fun initFuture(): ListenableFuture<Unit> {
+                initFutureLatch.countDown()
+                return initFuture
+            }
+
+            override fun render(canvas: Canvas, bounds: Rect, zonedDateTime: ZonedDateTime) {
+                // Actually rendering something isn't required.
+                synchronized(lock) {
+                    hasRendered = true
+                }
+            }
+
+            override fun renderHighlightLayer(
+                canvas: Canvas,
+                bounds: Rect,
+                zonedDateTime: ZonedDateTime
+            ) {
+                TODO("Not yet implemented")
+            }
+        }
+    ).setSystemTimeProvider(object : WatchFace.SystemTimeProvider {
+        override fun getSystemTimeMillis() = 123456789L
+
+        override fun getSystemTimeZoneId() = ZoneId.of("UTC")
+    })
+}
+
+@MediumTest
+@RequiresApi(Build.VERSION_CODES.O_MR1)
+@RunWith(AndroidJUnit4::class)
+public class AsyncListenableCanvasRendererTest : WatchFaceControlClientServiceTest() {
+
+    @Test
+    public fun asyncTest() {
+        val initFuture = SettableFuture.create<Unit>()
+        val watchFaceService =
+            TestAsyncCanvasRenderInitWatchFaceService(context, surfaceHolder, initFuture)
+
+        val deferredClient = handlerCoroutineScope.async {
+            watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                WatchUiState(false, 0),
+                null,
+                emptyMap()
+            )
+        }
+
+        handler.post {
+            watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
+        }
+
+        val client = awaitWithTimeout(deferredClient)
+
+        try {
+            assertThat(
+                watchFaceService.initFutureLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+            ).isTrue()
+            synchronized(watchFaceService.lock) {
+                assertThat(watchFaceService.hasRendered).isFalse()
+            }
+
+            initFuture.set(Unit)
+
+            assertThat(renderLatch.await(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)).isTrue()
+        } finally {
+            // Make sure we don't deadlock in case of a timeout which aborts the test mid way
+            // leaving this future incomplete.
+            initFuture.set(Unit)
+            client.close()
+        }
+    }
+}
diff --git a/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableGlesRendererTest.kt b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableGlesRendererTest.kt
new file mode 100644
index 0000000..5afef71
--- /dev/null
+++ b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableGlesRendererTest.kt
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2021 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.wear.watchface.test
+
+import android.content.Context
+import android.os.Build
+import android.view.SurfaceHolder
+import androidx.annotation.RequiresApi
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.wear.watchface.ComplicationSlotsManager
+import androidx.wear.watchface.ListenableGlesRenderer
+import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceService
+import androidx.wear.watchface.WatchFaceType
+import androidx.wear.watchface.WatchState
+import androidx.wear.watchface.client.DeviceConfig
+import androidx.wear.watchface.client.WatchUiState
+import androidx.wear.watchface.style.CurrentUserStyleRepository
+import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.ListenableFuture
+import com.google.common.util.concurrent.SettableFuture
+import kotlinx.coroutines.async
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.time.ZonedDateTime
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+internal class TestAsyncGlesRenderInitWatchFaceService(
+    testContext: Context,
+    private var surfaceHolderOverride: SurfaceHolder,
+    private var onUiThreadGlSurfaceCreatedFuture: ListenableFuture<Unit>,
+    private var onBackgroundThreadGlContextFuture: ListenableFuture<Unit>
+) : WatchFaceService() {
+    val lock = Any()
+    val onUiThreadGlSurfaceCreatedFutureLatch = CountDownLatch(1)
+    val onBackgroundThreadGlContextFutureLatch = CountDownLatch(1)
+    val renderLatch = CountDownLatch(1)
+    var hasRendered = false
+
+    init {
+        attachBaseContext(testContext)
+    }
+
+    override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
+
+    override suspend fun createWatchFace(
+        surfaceHolder: SurfaceHolder,
+        watchState: WatchState,
+        complicationSlotsManager: ComplicationSlotsManager,
+        currentUserStyleRepository: CurrentUserStyleRepository
+    ) = WatchFace(
+        WatchFaceType.DIGITAL,
+        object : ListenableGlesRenderer(
+            surfaceHolder,
+            currentUserStyleRepository,
+            watchState,
+            16
+        ) {
+            override fun onUiThreadGlSurfaceCreatedFuture(
+                width: Int,
+                height: Int
+            ): ListenableFuture<Unit> {
+                onUiThreadGlSurfaceCreatedFutureLatch.countDown()
+                return onUiThreadGlSurfaceCreatedFuture
+            }
+
+            override fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
+                onBackgroundThreadGlContextFutureLatch.countDown()
+                return onBackgroundThreadGlContextFuture
+            }
+
+            override fun render(zonedDateTime: ZonedDateTime) {
+                // GLES rendering is complicated and not strictly necessary for our test.
+                synchronized(lock) {
+                    hasRendered = true
+                }
+                renderLatch.countDown()
+            }
+
+            override fun renderHighlightLayer(zonedDateTime: ZonedDateTime) {
+                TODO("Not yet implemented")
+            }
+        }
+    )
+}
+
+@MediumTest
+@RequiresApi(Build.VERSION_CODES.O_MR1)
+@RunWith(AndroidJUnit4::class)
+public class AsyncListenableGlesRendererTest : WatchFaceControlClientServiceTest() {
+
+    @Test
+    public fun asyncTest() {
+        val onUiThreadGlSurfaceCreatedFuture = SettableFuture.create<Unit>()
+        val onBackgroundThreadGlContextFuture = SettableFuture.create<Unit>()
+        val watchFaceService = TestAsyncGlesRenderInitWatchFaceService(
+            context,
+            glSurfaceHolder,
+            onUiThreadGlSurfaceCreatedFuture,
+            onBackgroundThreadGlContextFuture
+        )
+
+        val deferredClient = handlerCoroutineScope.async {
+            watchFaceControlClientService.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                WatchUiState(false, 0),
+                null,
+                emptyMap()
+            )
+        }
+
+        handler.post {
+            watchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
+        }
+
+        val client = awaitWithTimeout(deferredClient)
+        try {
+            assertThat(
+                watchFaceService.onBackgroundThreadGlContextFutureLatch.await(
+                    TIMEOUT_MILLIS,
+                    TimeUnit.MILLISECONDS
+                )
+            ).isTrue()
+            synchronized(watchFaceService.lock) {
+                assertThat(watchFaceService.hasRendered).isFalse()
+            }
+            onBackgroundThreadGlContextFuture.set(Unit)
+
+            assertThat(
+                watchFaceService.onUiThreadGlSurfaceCreatedFutureLatch.await(
+                    TIMEOUT_MILLIS,
+                    TimeUnit.MILLISECONDS
+                )
+            ).isTrue()
+            synchronized(watchFaceService.lock) {
+                assertThat(watchFaceService.hasRendered).isFalse()
+            }
+            onUiThreadGlSurfaceCreatedFuture.set(Unit)
+
+            assertThat(
+                watchFaceService.renderLatch.await(
+                    TIMEOUT_MILLIS,
+                    TimeUnit.MILLISECONDS
+                )
+            ).isTrue()
+        } finally {
+            // Make sure we don't deadlock in case of a timeout which aborts the test mid way
+            // leaving these futures incomplete.
+            onBackgroundThreadGlContextFuture.set(Unit)
+            onUiThreadGlSurfaceCreatedFuture.set(Unit)
+            client.close()
+        }
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableWatchFaceServiceTest.kt
similarity index 95%
rename from wear/wear-watchface-guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
rename to wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableWatchFaceServiceTest.kt
index 28173f1..154f569 100644
--- a/wear/wear-watchface-guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
+++ b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/AsyncListenableWatchFaceServiceTest.kt
@@ -14,10 +14,13 @@
  * limitations under the License.
  */
 
+package androidx.wear.watchface.test
+
 import android.graphics.Canvas
 import android.graphics.Rect
-
 import android.view.SurfaceHolder
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.ComplicationSlotsManager
 import androidx.wear.watchface.ListenableWatchFaceService
@@ -33,6 +36,7 @@
 import com.google.common.util.concurrent.SettableFuture
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
+import org.junit.runner.RunWith
 import org.mockito.Mockito
 import java.time.Instant
 import java.time.ZonedDateTime
@@ -93,6 +97,8 @@
  * Illustrates that createWatchFaceFuture can be resolved in a different task posted to the main
  * looper.
  */
+@RunWith(AndroidJUnit4::class)
+@MediumTest
 public class AsyncListenableWatchFaceServiceTest {
 
     @Test
diff --git a/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt
new file mode 100644
index 0000000..94faf43
--- /dev/null
+++ b/wear/wear-watchface-guava/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2021 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.wear.watchface.test
+
+import android.app.Service
+import android.content.Context
+import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Rect
+import android.graphics.SurfaceTexture
+import android.os.Build
+import android.os.Handler
+import android.os.IBinder
+import android.os.Looper
+import android.view.Surface
+import android.view.SurfaceHolder
+import androidx.annotation.RequiresApi
+import androidx.test.core.app.ApplicationProvider
+import androidx.wear.watchface.client.WatchFaceControlClient
+import androidx.wear.watchface.control.IWatchFaceInstanceServiceStub
+import androidx.wear.watchface.control.WatchFaceControlService
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.android.asCoroutineDispatcher
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.mockito.Mockito
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+internal const val TIMEOUT_MILLIS = 1000L
+
+/**
+ * Test shim to allow us to connect to WatchFaceControlService from a test and to optionally
+ * override the reported API version.
+ */
+public class WatchFaceControlTestService : Service() {
+    public companion object {
+        /**
+         * If non-null this overrides the API version reported by [IWatchFaceInstanceServiceStub].
+         */
+        public var apiVersionOverride: Int? = null
+    }
+
+    private val realService = object : WatchFaceControlService() {
+        override fun createServiceStub(): IWatchFaceInstanceServiceStub =
+            object : IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper())) {
+                @RequiresApi(Build.VERSION_CODES.O_MR1)
+                override fun getApiVersion(): Int = apiVersionOverride ?: super.getApiVersion()
+            }
+
+        init {
+            setContext(ApplicationProvider.getApplicationContext<Context>())
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.O_MR1)
+    override fun onBind(intent: Intent?): IBinder? = realService.onBind(intent)
+}
+
+/** Base class for the various async tests. */
+public open class WatchFaceControlClientServiceTest {
+    val context = ApplicationProvider.getApplicationContext<Context>()
+    val handler = Handler(Looper.getMainLooper())
+    val handlerCoroutineScope = CoroutineScope(handler.asCoroutineDispatcher().immediate)
+
+    val surfaceHolder = Mockito.mock(SurfaceHolder::class.java)
+    val surface = Mockito.mock(Surface::class.java)
+    val renderLatch = CountDownLatch(1)
+
+    val surfaceTexture = SurfaceTexture(false)
+    val glSurface = Surface(surfaceTexture)
+    val glSurfaceHolder = Mockito.mock(SurfaceHolder::class.java)
+
+    val watchFaceControlClientService = runBlocking {
+        WatchFaceControlClient.createWatchFaceControlClientImpl(
+            context,
+            Intent(context, WatchFaceControlTestService::class.java).apply {
+                action = WatchFaceControlService.ACTION_WATCHFACE_CONTROL_SERVICE
+            }
+        )
+    }
+
+    @Before
+    fun setUp() {
+        Mockito.`when`(surfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 100, 100))
+        Mockito.`when`(surfaceHolder.surface).thenReturn(surface)
+        Mockito.`when`(surface.isValid).thenReturn(false)
+        val bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
+        val canvas = Canvas(bitmap)
+        Mockito.`when`(surfaceHolder.lockHardwareCanvas()).thenReturn(canvas)
+
+        Mockito.`when`(surfaceHolder.unlockCanvasAndPost(canvas)).then {
+            renderLatch.countDown()
+        }
+
+        surfaceTexture.setDefaultBufferSize(10, 10)
+        Mockito.`when`(glSurfaceHolder.surface).thenReturn(glSurface)
+        Mockito.`when`(glSurfaceHolder.surfaceFrame)
+            .thenReturn(Rect(0, 0, 10, 10))
+    }
+
+    fun <X> awaitWithTimeout(
+        thing: Deferred<X>,
+        timeoutMillis: Long = TIMEOUT_MILLIS
+    ): X {
+        var value: X? = null
+        val latch = CountDownLatch(1)
+        handlerCoroutineScope.launch {
+            value = thing.await()
+            latch.countDown()
+        }
+        if (!latch.await(timeoutMillis, TimeUnit.MILLISECONDS)) {
+            throw TimeoutException("Timeout waiting for thing!")
+        }
+        return value!!
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt b/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
new file mode 100644
index 0000000..4ed56833
--- /dev/null
+++ b/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 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.wear.watchface
+
+import android.view.SurfaceHolder
+import androidx.annotation.IntRange
+import androidx.annotation.UiThread
+import androidx.wear.watchface.style.CurrentUserStyleRepository
+import com.google.common.util.concurrent.ListenableFuture
+import com.google.common.util.concurrent.SettableFuture
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
+
+/**
+ * [ListenableFuture]-based compatibility wrapper around [Renderer.CanvasRenderer]'s suspending
+ * methods.
+ */
+public abstract class ListenableCanvasRenderer(
+    surfaceHolder: SurfaceHolder,
+    currentUserStyleRepository: CurrentUserStyleRepository,
+    watchState: WatchState,
+    @CanvasType private val canvasType: Int,
+    @IntRange(from = 0, to = 60000)
+    interactiveDrawModeUpdateDelayMillis: Long
+) : Renderer.CanvasRenderer(
+    surfaceHolder,
+    currentUserStyleRepository,
+    watchState,
+    canvasType,
+    interactiveDrawModeUpdateDelayMillis
+) {
+    /**
+     * Perform UiThread specific initialization.  Will be called once during initialization
+     * before any subsequent calls to [render].
+     *
+     * @return A ListenableFuture<Unit> which is resolved when UiThread has completed. Rendering
+     * will be blocked until this has resolved.
+     */
+    @UiThread
+    public open fun initFuture(): ListenableFuture<Unit> {
+        return SettableFuture.create<Unit>().apply {
+            set(Unit)
+        }
+    }
+
+    override suspend fun init(): Unit = suspendCoroutine {
+        val future = initFuture()
+        future.addListener(
+            { it.resume(future.get()) },
+            { runnable -> runnable.run() }
+        )
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt b/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
new file mode 100644
index 0000000..8a9dd5e
--- /dev/null
+++ b/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2021 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.wear.watchface
+
+import android.opengl.EGL14
+import android.view.SurfaceHolder
+import androidx.annotation.IntRange
+import androidx.annotation.Px
+import androidx.annotation.UiThread
+import androidx.annotation.WorkerThread
+import androidx.wear.watchface.style.CurrentUserStyleRepository
+import com.google.common.util.concurrent.ListenableFuture
+import com.google.common.util.concurrent.SettableFuture
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.sync.Mutex
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
+
+internal val EGL_CONFIG_ATTRIB_LIST = intArrayOf(
+    EGL14.EGL_RENDERABLE_TYPE,
+    EGL14.EGL_OPENGL_ES2_BIT,
+    EGL14.EGL_RED_SIZE,
+    8,
+    EGL14.EGL_GREEN_SIZE,
+    8,
+    EGL14.EGL_BLUE_SIZE,
+    8,
+    EGL14.EGL_ALPHA_SIZE,
+    8,
+    EGL14.EGL_NONE
+)
+
+internal val EGL_SURFACE_ATTRIB_LIST = intArrayOf(EGL14.EGL_NONE)
+
+/**
+ * [ListenableFuture]-based compatibility wrapper around [Renderer.GlesRenderer]'s suspending
+ * methods.
+ */
+public abstract class ListenableGlesRenderer(
+    surfaceHolder: SurfaceHolder,
+    currentUserStyleRepository: CurrentUserStyleRepository,
+    watchState: WatchState,
+    @IntRange(from = 0, to = 60000)
+    interactiveDrawModeUpdateDelayMillis: Long,
+    eglConfigAttribList: IntArray = EGL_CONFIG_ATTRIB_LIST,
+    eglSurfaceAttribList: IntArray = EGL_SURFACE_ATTRIB_LIST
+) : Renderer.GlesRenderer(
+    surfaceHolder,
+    currentUserStyleRepository,
+    watchState,
+    interactiveDrawModeUpdateDelayMillis,
+    eglConfigAttribList,
+    eglSurfaceAttribList
+) {
+    /**
+     * Inside of a [Mutex] this function sets the GL context associated with the
+     * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one,
+     * executes [runnable] and finally unsets the GL context.
+     *
+     * Access to the GL context this way is necessary because GL contexts are not shared
+     * between renderers and there can be multiple watch face instances existing concurrently
+     * (e.g. headless and interactive, potentially from different watch faces if an APK
+     * contains more than one [WatchFaceService]).
+     *
+     * NB this function is called by the library before running
+     * [runBackgroundThreadGlCommands] so there's no need to use this directly in client
+     * code unless you need to make GL calls outside of those methods.
+     *
+     * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
+     */
+    @WorkerThread
+    public fun runBackgroundThreadGlCommands(runnable: Runnable) {
+        runBlocking {
+            runBackgroundThreadGlCommands {
+                runnable.run()
+            }
+        }
+    }
+
+    /**
+     * Inside of a [Mutex] this function sets the UiThread GL context as the current
+     * one, executes [runnable] and finally unsets the GL context.
+     *
+     * Access to the GL context this way is necessary because GL contexts are not shared
+     * between renderers and there can be multiple watch face instances existing concurrently
+     * (e.g. headless and interactive, potentially from different watch faces if an APK
+     * contains more than one [WatchFaceService]).
+     *
+     * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
+     */
+    @UiThread
+    public fun runUiThreadGlCommands(runnable: Runnable) {
+        runBlocking {
+            runUiThreadGlCommands {
+                runnable.run()
+            }
+        }
+    }
+
+    /**
+     * Called once a background thread when a new GL context is created on the background
+     * thread, before any subsequent calls to [render]. Note this function is called inside a
+     * lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the
+     * GL context.
+     *
+     * @return A ListenableFuture<Unit> which is resolved when background thread work has
+     * completed. Rendering will be blocked until this has resolved.
+     */
+    protected open fun onBackgroundThreadGlContextCreatedFuture(): ListenableFuture<Unit> {
+        return SettableFuture.create<Unit>().apply {
+            set(Unit)
+        }
+    }
+
+    override suspend fun onBackgroundThreadGlContextCreated(): Unit = suspendCoroutine {
+        val future = onBackgroundThreadGlContextCreatedFuture()
+        future.addListener(
+            { it.resume(future.get()) },
+            { runnable -> runnable.run() }
+        )
+    }
+
+    /**
+     * Called when a new GL surface is created on the UiThread, before any subsequent calls
+     * to [render] and in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function
+     * is  called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which
+     * has synchronized access to the GL context.
+     *
+     * @param width width of surface in pixels
+     * @param height height of surface in pixels
+     * @return A ListenableFuture<Unit> which is resolved when UI thread work has completed.
+     * Rendering will be blocked until this has resolved.
+     */
+    @UiThread
+    protected open fun
+    onUiThreadGlSurfaceCreatedFuture(@Px width: Int, @Px height: Int): ListenableFuture<Unit> {
+        return SettableFuture.create<Unit>().apply {
+            set(Unit)
+        }
+    }
+
+    override suspend fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int): Unit =
+        suspendCoroutine {
+            val future = onUiThreadGlSurfaceCreatedFuture(width, height)
+            future.addListener(
+                { it.resume(future.get()) },
+                { runnable -> runnable.run() }
+            )
+        }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt b/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
index 5a60e4d..5b2cce6 100644
--- a/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
+++ b/wear/wear-watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
@@ -19,7 +19,8 @@
 import android.view.SurfaceHolder
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import com.google.common.util.concurrent.ListenableFuture
-import kotlinx.coroutines.CompletableDeferred
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
 
 /**
  * [ListenableFuture]-based compatibility wrapper around [WatchFaceService]'s suspending
@@ -39,7 +40,7 @@
         watchState: WatchState,
         complicationSlotsManager: ComplicationSlotsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
-    ): WatchFace = CompletableDeferred<WatchFace>().apply {
+    ): WatchFace = suspendCoroutine {
         val future = createWatchFaceFuture(
             surfaceHolder,
             watchState,
@@ -47,8 +48,8 @@
             currentUserStyleRepository
         )
         future.addListener(
-            { complete(future.get()) },
+            { it.resume(future.get()) },
             { runnable -> runnable.run() }
         )
-    }.await()
+    }
 }
\ No newline at end of file
diff --git a/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java b/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
index c378119..bc82b26 100644
--- a/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
+++ b/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
@@ -38,6 +38,8 @@
 import java.util.Map;
 import java.util.concurrent.Executor;
 
+import kotlinx.coroutines.flow.StateFlow;
+
 /** Configuration activity for the watch face. */
 public class ConfigActivity extends ComponentActivity {
 
@@ -127,13 +129,14 @@
         }
         addCallback(
                 mEditorSession.getListenableComplicationsProviderInfo(),
-                new BaseFutureCallback<Map<Integer, ComplicationDataSourceInfo>>(
+                new BaseFutureCallback<StateFlow<Map<Integer, ComplicationDataSourceInfo>>>(
                         this, TAG, "getListenableComplicationsProviderInfo") {
                     @Override
-                    public void onSuccess(Map<Integer, ComplicationDataSourceInfo> value) {
-                        super.onSuccess(value);
+                    public void onSuccess(
+                            StateFlow<Map<Integer, ComplicationDataSourceInfo>> flow) {
+                        super.onSuccess(flow);
                         ComplicationDataSourceInfo info =
-                                value.get(WatchFaceService.COMPLICATION_ID);
+                                flow.getValue().get(WatchFaceService.COMPLICATION_ID);
                         if (info == null) {
                             mComplicationProviderName.setText(
                                     getString(R.string.complication_none));
@@ -151,12 +154,13 @@
         }
         addCallback(
                 mEditorSession.getListenableComplicationPreviewData(),
-                new BaseFutureCallback<Map<Integer, ComplicationData>>(
+                new BaseFutureCallback<StateFlow<Map<Integer, ComplicationData>>>(
                         this, TAG, "getListenableComplicationPreviewData") {
                     @Override
-                    public void onSuccess(Map<Integer, ComplicationData> value) {
-                        super.onSuccess(value);
-                        ComplicationData preview = value.get(WatchFaceService.COMPLICATION_ID);
+                    public void onSuccess(StateFlow<Map<Integer, ComplicationData>> flow) {
+                        super.onSuccess(flow);
+                        ComplicationData preview =
+                                flow.getValue().get(WatchFaceService.COMPLICATION_ID);
                         if (preview != null) {
                             mComplicationPreview.setImageDrawable(mComplicationPreviewDrawable);
                             mComplicationPreviewDrawable.setComplicationData(preview, true);
diff --git a/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java b/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java
index f031661..d036a4c 100644
--- a/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java
+++ b/wear/wear-watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/WatchFaceService.java
@@ -48,7 +48,7 @@
 
     public static final int COMPLICATION_ID = 1;
     public static final ComplicationType[] COMPLICATION_TYPES = {
-        ComplicationType.SHORT_TEXT, ComplicationType.RANGED_VALUE
+        ComplicationType.SHORT_TEXT, ComplicationType.RANGED_VALUE, ComplicationType.SMALL_IMAGE
     };
     public static final RectF COMPLICATION_BOUNDS = new RectF(.3f, 0.7f, .7f, .9f);
 
diff --git a/wear/wear-watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java b/wear/wear-watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java
index b98b1b3..8068ea2 100644
--- a/wear/wear-watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java
+++ b/wear/wear-watchface-samples-minimal-style/src/main/java/androidx/wear/watchface/samples/minimal/style/ConfigActivity.java
@@ -98,10 +98,10 @@
             return;
         }
 
-        UserStyle userStyle = mEditorSession.getUserStyle();
+        UserStyle userStyle = mEditorSession.getUserStyle().getValue();
         TimeStyle.Value value = mTimeStyle.get(userStyle);
         TimeStyle.Value newValue = NEXT_VALUE_MAP.get(value);
-        mEditorSession.setUserStyle(mTimeStyle.set(userStyle, newValue));
+        mEditorSession.getUserStyle().setValue(mTimeStyle.set(userStyle, newValue));
         updateStyleValue();
     }
 
@@ -109,7 +109,7 @@
         if (mEditorSession == null) {
             return;
         }
-        TimeStyle.Value value = mTimeStyle.get(mEditorSession.getUserStyle());
+        TimeStyle.Value value = mTimeStyle.get(mEditorSession.getUserStyle().getValue());
         mStyleValue.setText(mTimeStyle.getDisplayName(value));
     }
 
diff --git a/wear/wear-watchface-style/api/current.txt b/wear/wear-watchface-style/api/current.txt
index ce50ce8..5aa14f2 100644
--- a/wear/wear-watchface-style/api/current.txt
+++ b/wear/wear-watchface-style/api/current.txt
@@ -90,7 +90,6 @@
 
   public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     method public static androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public boolean getValue();
     property public final boolean value;
     field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion Companion;
@@ -134,7 +133,6 @@
     method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> getComplicationSlotOverlays();
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     property public final java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays;
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
@@ -147,7 +145,6 @@
   public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(byte[] customValue);
     method public byte[] getCustomValue();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     property public final byte[] customValue;
   }
 
@@ -163,7 +160,6 @@
 
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public double getValue();
     property public final double value;
   }
@@ -187,7 +183,6 @@
     ctor public UserStyleSetting.ListUserStyleSetting.ListOption(androidx.wear.watchface.style.UserStyleSetting.Option.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, android.graphics.drawable.Icon? icon);
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
   }
@@ -204,7 +199,6 @@
 
   public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public long getValue();
     property public final long value;
   }
diff --git a/wear/wear-watchface-style/api/public_plus_experimental_current.txt b/wear/wear-watchface-style/api/public_plus_experimental_current.txt
index ce50ce8..5aa14f2 100644
--- a/wear/wear-watchface-style/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-style/api/public_plus_experimental_current.txt
@@ -90,7 +90,6 @@
 
   public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     method public static androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public boolean getValue();
     property public final boolean value;
     field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion Companion;
@@ -134,7 +133,6 @@
     method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> getComplicationSlotOverlays();
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     property public final java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays;
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
@@ -147,7 +145,6 @@
   public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(byte[] customValue);
     method public byte[] getCustomValue();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     property public final byte[] customValue;
   }
 
@@ -163,7 +160,6 @@
 
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public double getValue();
     property public final double value;
   }
@@ -187,7 +183,6 @@
     ctor public UserStyleSetting.ListUserStyleSetting.ListOption(androidx.wear.watchface.style.UserStyleSetting.Option.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, android.graphics.drawable.Icon? icon);
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
   }
@@ -204,7 +199,6 @@
 
   public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public long getValue();
     property public final long value;
   }
diff --git a/wear/wear-watchface-style/api/restricted_current.txt b/wear/wear-watchface-style/api/restricted_current.txt
index 7bd5cf3..1a1cd37 100644
--- a/wear/wear-watchface-style/api/restricted_current.txt
+++ b/wear/wear-watchface-style/api/restricted_current.txt
@@ -100,7 +100,6 @@
 
   public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     method public static androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public boolean getValue();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.BooleanOptionWireFormat toWireFormat();
     property public final boolean value;
@@ -149,7 +148,6 @@
     method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> getComplicationSlotOverlays();
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsOptionWireFormat toWireFormat();
     property public final java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays;
     property public final CharSequence displayName;
@@ -164,7 +162,6 @@
   public static final class UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption(byte[] customValue);
     method public byte[] getCustomValue();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueOptionWireFormat toWireFormat();
     property public final byte[] customValue;
   }
@@ -183,7 +180,6 @@
 
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public double getValue();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.DoubleRangeOptionWireFormat toWireFormat();
     property public final double value;
@@ -212,7 +208,6 @@
     ctor public UserStyleSetting.ListUserStyleSetting.ListOption(androidx.wear.watchface.style.UserStyleSetting.Option.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, android.graphics.drawable.Icon? icon);
     method public CharSequence getDisplayName();
     method public android.graphics.drawable.Icon? getIcon();
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ListOptionWireFormat toWireFormat();
     property public final CharSequence displayName;
     property public final android.graphics.drawable.Icon? icon;
@@ -232,7 +227,6 @@
 
   public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
     ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
-    method public Class<? extends androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettingClass$metalava_module();
     method public long getValue();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.LongRangeOptionWireFormat toWireFormat();
     property public final long value;
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
index 01d2d17..9275ab2 100644
--- a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
+++ b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
@@ -502,7 +502,7 @@
             override fun toWireFormat(): BooleanOptionWireFormat =
                 BooleanOptionWireFormat(id.value)
 
-            override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 BooleanUserStyleSetting::class.java
 
             override fun toString(): String = if (id.value[0] == 1.toByte()) "true" else "false"
@@ -847,7 +847,7 @@
                 icon = wireFormat.mIcon
             }
 
-            override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 ComplicationSlotsUserStyleSetting::class.java
 
             internal override fun estimateWireSizeInBytesAndValidateIconDimensions(
@@ -1037,7 +1037,7 @@
                 value = ByteBuffer.wrap(wireFormat.mId).double
             }
 
-            override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 DoubleRangeUserStyleSetting::class.java
 
             /** @hide */
@@ -1234,7 +1234,7 @@
                 icon = wireFormat.mIcon
             }
 
-            override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 ListUserStyleSetting::class.java
 
             internal override fun estimateWireSizeInBytesAndValidateIconDimensions(
@@ -1423,7 +1423,7 @@
                 value = ByteBuffer.wrap(wireFormat.mId).long
             }
 
-            override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 LongRangeUserStyleSetting::class.java
 
             /** @hide */
@@ -1533,7 +1533,7 @@
                 wireFormat: CustomValueOptionWireFormat
             ) : super(Id(wireFormat.mId))
 
-            override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
+            internal override fun getUserStyleSettingClass(): Class<out UserStyleSetting> =
                 CustomValueUserStyleSetting::class.java
 
             /** @hide */
diff --git a/wear/wear-watchface/api/current.txt b/wear/wear-watchface/api/current.txt
index 1e6e94f..0a61a68 100644
--- a/wear/wear-watchface/api/current.txt
+++ b/wear/wear-watchface/api/current.txt
@@ -30,7 +30,7 @@
     method @UiThread public int getAccessibilityTraversalIndex();
     method public int getBoundsType();
     method public androidx.wear.watchface.CanvasComplicationFactory getCanvasComplicationFactory();
-    method public androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> getComplicationData();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.complications.data.ComplicationData> getComplicationData();
     method @UiThread public androidx.wear.complications.ComplicationSlotBounds getComplicationSlotBounds();
     method public android.os.Bundle getConfigExtras();
     method @UiThread public androidx.wear.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
@@ -48,7 +48,7 @@
     property @UiThread public final int accessibilityTraversalIndex;
     property public final int boundsType;
     property public final androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory;
-    property public final androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> complicationData;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.complications.data.ComplicationData> complicationData;
     property @UiThread public final androidx.wear.complications.ComplicationSlotBounds complicationSlotBounds;
     property public final android.os.Bundle configExtras;
     property @UiThread public final androidx.wear.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
@@ -120,27 +120,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public abstract sealed class ObservableWatchData<T> {
-    method @UiThread public final void addObserver(androidx.wear.watchface.Observer<T> observer);
-    method @UiThread public T getValue();
-    method @UiThread public final T getValueOr(T default);
-    method @UiThread public final boolean hasValue();
-    method @UiThread public final void removeObserver(androidx.wear.watchface.Observer<T> observer);
-    method @UiThread protected void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public static final class ObservableWatchData.MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
-    ctor public ObservableWatchData.MutableObservableWatchData(T? initialValue);
-    ctor public ObservableWatchData.MutableObservableWatchData();
-    method @UiThread public void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public interface Observer<T> {
-    method public void onChanged(T);
-  }
-
   public final class RenderBufferTextureKt {
   }
 
@@ -219,10 +198,9 @@
 
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
     ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
-    method @UiThread public void init();
+    method @UiThread public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
     method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
-    method public void uiThreadInitInternal$metalava_module();
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
@@ -233,12 +211,12 @@
     method public final android.opengl.EGLConfig getEglConfig();
     method public final android.opengl.EGLDisplay getEglDisplay();
     method public final android.opengl.EGLContext getEglUiThreadContext();
-    method @WorkerThread public void onBackgroundThreadGlContextCreated();
-    method @UiThread public void onUiThreadGlSurfaceCreated(@Px int width, @Px int height);
+    method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @UiThread public abstract void render(java.time.ZonedDateTime zonedDateTime);
     method @UiThread public abstract void renderHighlightLayer(java.time.ZonedDateTime zonedDateTime);
-    method @WorkerThread public final void runBackgroundThreadGlCommands(Runnable runnable);
-    method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
+    method @WorkerThread public final suspend Object? runBackgroundThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> commands, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final suspend Object? runUiThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> commands, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public final void setEglConfig(android.opengl.EGLConfig eglConfig);
     method public final void setEglDisplay(android.opengl.EGLDisplay eglDisplay);
     property public final android.opengl.EGLContext eglBackgroundThreadContext;
@@ -330,25 +308,25 @@
   }
 
   public final class WatchState {
-    ctor public WatchState(androidx.wear.watchface.ObservableWatchData<java.lang.Integer> interruptionFilter, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless);
+    ctor public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless);
     method public long getAnalogPreviewReferenceTimeMillis();
     method @Px public int getChinHeight();
     method public long getDigitalPreviewReferenceTimeMillis();
     method public boolean getHasBurnInProtection();
     method public boolean getHasLowBitAmbient();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Integer> getInterruptionFilter();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient();
     method public boolean isHeadless();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible();
     property public final long analogPreviewReferenceTimeMillis;
     property @Px public final int chinHeight;
     property public final long digitalPreviewReferenceTimeMillis;
     property public final boolean hasBurnInProtection;
     property public final boolean hasLowBitAmbient;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Integer> interruptionFilter;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient;
     property public final boolean isHeadless;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible;
   }
 
 }
diff --git a/wear/wear-watchface/api/public_plus_experimental_current.txt b/wear/wear-watchface/api/public_plus_experimental_current.txt
index 1e6e94f..0a61a68 100644
--- a/wear/wear-watchface/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface/api/public_plus_experimental_current.txt
@@ -30,7 +30,7 @@
     method @UiThread public int getAccessibilityTraversalIndex();
     method public int getBoundsType();
     method public androidx.wear.watchface.CanvasComplicationFactory getCanvasComplicationFactory();
-    method public androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> getComplicationData();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.complications.data.ComplicationData> getComplicationData();
     method @UiThread public androidx.wear.complications.ComplicationSlotBounds getComplicationSlotBounds();
     method public android.os.Bundle getConfigExtras();
     method @UiThread public androidx.wear.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
@@ -48,7 +48,7 @@
     property @UiThread public final int accessibilityTraversalIndex;
     property public final int boundsType;
     property public final androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory;
-    property public final androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> complicationData;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.complications.data.ComplicationData> complicationData;
     property @UiThread public final androidx.wear.complications.ComplicationSlotBounds complicationSlotBounds;
     property public final android.os.Bundle configExtras;
     property @UiThread public final androidx.wear.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
@@ -120,27 +120,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public abstract sealed class ObservableWatchData<T> {
-    method @UiThread public final void addObserver(androidx.wear.watchface.Observer<T> observer);
-    method @UiThread public T getValue();
-    method @UiThread public final T getValueOr(T default);
-    method @UiThread public final boolean hasValue();
-    method @UiThread public final void removeObserver(androidx.wear.watchface.Observer<T> observer);
-    method @UiThread protected void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public static final class ObservableWatchData.MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
-    ctor public ObservableWatchData.MutableObservableWatchData(T? initialValue);
-    ctor public ObservableWatchData.MutableObservableWatchData();
-    method @UiThread public void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public interface Observer<T> {
-    method public void onChanged(T);
-  }
-
   public final class RenderBufferTextureKt {
   }
 
@@ -219,10 +198,9 @@
 
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
     ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
-    method @UiThread public void init();
+    method @UiThread public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
     method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
-    method public void uiThreadInitInternal$metalava_module();
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
@@ -233,12 +211,12 @@
     method public final android.opengl.EGLConfig getEglConfig();
     method public final android.opengl.EGLDisplay getEglDisplay();
     method public final android.opengl.EGLContext getEglUiThreadContext();
-    method @WorkerThread public void onBackgroundThreadGlContextCreated();
-    method @UiThread public void onUiThreadGlSurfaceCreated(@Px int width, @Px int height);
+    method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @UiThread public abstract void render(java.time.ZonedDateTime zonedDateTime);
     method @UiThread public abstract void renderHighlightLayer(java.time.ZonedDateTime zonedDateTime);
-    method @WorkerThread public final void runBackgroundThreadGlCommands(Runnable runnable);
-    method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
+    method @WorkerThread public final suspend Object? runBackgroundThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> commands, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final suspend Object? runUiThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> commands, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public final void setEglConfig(android.opengl.EGLConfig eglConfig);
     method public final void setEglDisplay(android.opengl.EGLDisplay eglDisplay);
     property public final android.opengl.EGLContext eglBackgroundThreadContext;
@@ -330,25 +308,25 @@
   }
 
   public final class WatchState {
-    ctor public WatchState(androidx.wear.watchface.ObservableWatchData<java.lang.Integer> interruptionFilter, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless);
+    ctor public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless);
     method public long getAnalogPreviewReferenceTimeMillis();
     method @Px public int getChinHeight();
     method public long getDigitalPreviewReferenceTimeMillis();
     method public boolean getHasBurnInProtection();
     method public boolean getHasLowBitAmbient();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Integer> getInterruptionFilter();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient();
     method public boolean isHeadless();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible();
     property public final long analogPreviewReferenceTimeMillis;
     property @Px public final int chinHeight;
     property public final long digitalPreviewReferenceTimeMillis;
     property public final boolean hasBurnInProtection;
     property public final boolean hasLowBitAmbient;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Integer> interruptionFilter;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient;
     property public final boolean isHeadless;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible;
   }
 
 }
diff --git a/wear/wear-watchface/api/restricted_current.txt b/wear/wear-watchface/api/restricted_current.txt
index 807bc31..713a1ab 100644
--- a/wear/wear-watchface/api/restricted_current.txt
+++ b/wear/wear-watchface/api/restricted_current.txt
@@ -72,6 +72,7 @@
   }
 
   public final class ComplicationSlot {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.Rect computeBounds(android.graphics.Rect screen, androidx.wear.complications.data.ComplicationType complicationType);
     method public android.graphics.Rect computeBounds(android.graphics.Rect screen);
     method public static androidx.wear.watchface.ComplicationSlot.Builder createBackgroundComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy);
     method public static androidx.wear.watchface.ComplicationSlot.Builder createEdgeComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
@@ -79,7 +80,7 @@
     method @UiThread public int getAccessibilityTraversalIndex();
     method public int getBoundsType();
     method public androidx.wear.watchface.CanvasComplicationFactory getCanvasComplicationFactory();
-    method public androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> getComplicationData();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.complications.data.ComplicationData> getComplicationData();
     method @UiThread public androidx.wear.complications.ComplicationSlotBounds getComplicationSlotBounds();
     method public android.os.Bundle getConfigExtras();
     method @UiThread public androidx.wear.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
@@ -97,7 +98,7 @@
     property @UiThread public final int accessibilityTraversalIndex;
     property public final int boundsType;
     property public final androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory;
-    property public final androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> complicationData;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.complications.data.ComplicationData> complicationData;
     property @UiThread public final androidx.wear.complications.ComplicationSlotBounds complicationSlotBounds;
     property public final android.os.Bundle configExtras;
     property @UiThread public final androidx.wear.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
@@ -190,49 +191,28 @@
     method public long getDigitalPreviewReferenceTimeMillis();
     method public boolean getHasBurnInProtection();
     method public boolean getHasLowBitAmbient();
-    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Integer> getInterruptionFilter();
-    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isAmbient();
-    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging();
+    method public kotlinx.coroutines.flow.MutableStateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> isAmbient();
+    method public kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> isBatteryLowAndNotCharging();
     method public boolean isHeadless();
-    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isVisible();
+    method public kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> isVisible();
     method public void setAnalogPreviewReferenceTimeMillis(long analogPreviewReferenceTimeMillis);
     method public void setChinHeight(@Px int value);
     method public void setDigitalPreviewReferenceTimeMillis(long digitalPreviewReferenceTimeMillis);
     method public void setHasBurnInProtection(boolean hasBurnInProtection);
     method public void setHasLowBitAmbient(boolean hasLowBitAmbient);
     method public void setHeadless(boolean isHeadless);
-    method public void setInterruptionFilter(androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Integer> interruptionFilter);
+    method public void setInterruptionFilter(kotlinx.coroutines.flow.MutableStateFlow<java.lang.Integer> interruptionFilter);
     property public final long analogPreviewReferenceTimeMillis;
     property @Px public final int chinHeight;
     property public final long digitalPreviewReferenceTimeMillis;
     property public final boolean hasBurnInProtection;
     property public final boolean hasLowBitAmbient;
-    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Integer> interruptionFilter;
-    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isAmbient;
-    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging;
+    property public final kotlinx.coroutines.flow.MutableStateFlow<java.lang.Integer> interruptionFilter;
+    property public final kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> isAmbient;
+    property public final kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> isBatteryLowAndNotCharging;
     property public final boolean isHeadless;
-    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isVisible;
-  }
-
-  public abstract sealed class ObservableWatchData<T> {
-    method @UiThread public final void addObserver(androidx.wear.watchface.Observer<T> observer);
-    method @UiThread public T getValue();
-    method @UiThread public final T getValueOr(T default);
-    method @UiThread public final boolean hasValue();
-    method @UiThread public final void removeObserver(androidx.wear.watchface.Observer<T> observer);
-    method @UiThread protected void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public static final class ObservableWatchData.MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
-    ctor public ObservableWatchData.MutableObservableWatchData(T? initialValue);
-    ctor public ObservableWatchData.MutableObservableWatchData();
-    method @UiThread public void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public interface Observer<T> {
-    method public void onChanged(T);
+    property public final kotlinx.coroutines.flow.MutableStateFlow<java.lang.Boolean> isVisible;
   }
 
   public final class RenderBufferTextureKt {
@@ -315,10 +295,9 @@
 
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
     ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
-    method @UiThread public void init();
+    method @UiThread public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
     method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
-    method public void uiThreadInitInternal$metalava_module();
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
@@ -329,12 +308,12 @@
     method public final android.opengl.EGLConfig getEglConfig();
     method public final android.opengl.EGLDisplay getEglDisplay();
     method public final android.opengl.EGLContext getEglUiThreadContext();
-    method @WorkerThread public void onBackgroundThreadGlContextCreated();
-    method @UiThread public void onUiThreadGlSurfaceCreated(@Px int width, @Px int height);
+    method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @UiThread public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @UiThread public abstract void render(java.time.ZonedDateTime zonedDateTime);
     method @UiThread public abstract void renderHighlightLayer(java.time.ZonedDateTime zonedDateTime);
-    method @WorkerThread public final void runBackgroundThreadGlCommands(Runnable runnable);
-    method @UiThread public final void runUiThreadGlCommands(Runnable runnable);
+    method @WorkerThread public final suspend Object? runBackgroundThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> commands, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final suspend Object? runUiThreadGlCommands(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> commands, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public final void setEglConfig(android.opengl.EGLConfig eglConfig);
     method public final void setEglDisplay(android.opengl.EGLDisplay eglDisplay);
     property public final android.opengl.EGLContext eglBackgroundThreadContext;
@@ -492,25 +471,25 @@
   }
 
   public final class WatchState {
-    ctor public WatchState(androidx.wear.watchface.ObservableWatchData<java.lang.Integer> interruptionFilter, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging, androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless);
+    ctor public WatchState(kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isBatteryLowAndNotCharging, kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible, boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis, @Px int chinHeight, boolean isHeadless);
     method public long getAnalogPreviewReferenceTimeMillis();
     method @Px public int getChinHeight();
     method public long getDigitalPreviewReferenceTimeMillis();
     method public boolean getHasBurnInProtection();
     method public boolean getHasLowBitAmbient();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Integer> getInterruptionFilter();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient();
     method public boolean isHeadless();
-    method public androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible();
     property public final long analogPreviewReferenceTimeMillis;
     property @Px public final int chinHeight;
     property public final long digitalPreviewReferenceTimeMillis;
     property public final boolean hasBurnInProtection;
     property public final boolean hasLowBitAmbient;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Integer> interruptionFilter;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isAmbient;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Integer> interruptionFilter;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient;
     property public final boolean isHeadless;
-    property public final androidx.wear.watchface.ObservableWatchData<java.lang.Boolean> isVisible;
+    property public final kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible;
   }
 
 }
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
index 7a6e366..ae2b82b 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
@@ -58,6 +58,11 @@
 import androidx.wear.watchface.style.UserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.Option
 import androidx.wear.watchface.style.WatchFaceLayer
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.android.asCoroutineDispatcher
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
 import java.time.ZonedDateTime
 import kotlin.math.max
 import kotlin.math.min
@@ -644,13 +649,18 @@
 
         // createWatchFace is called on a worker thread but the observers should be called from the
         // UiThread.
-        getUiThreadHandler().post {
-            upperComplication.complicationData.addObserver {
+        val uiScope = CoroutineScope(getUiThreadHandler().asCoroutineDispatcher())
+
+        uiScope.launch {
+            upperComplication.complicationData.collect {
                 // Force bounds recalculation, because this can affect the size of the central time
                 // display.
                 renderer.oldBounds.set(0, 0, 0, 0)
             }
-            lowerComplication.complicationData.addObserver {
+        }
+
+        uiScope.launch {
+            lowerComplication.complicationData.collect() {
                 // Force bounds recalculation, because this can affect the size of the central time
                 // display.
                 renderer.oldBounds.set(0, 0, 0, 0)
@@ -799,19 +809,21 @@
             }
         )
 
-        watchState.isAmbient.addObserver {
-            if (it) {
-                ambientEnterAnimator.start()
-            } else {
-                ambientExitAnimator.start()
-            }
+        CoroutineScope(Dispatchers.Main.immediate).launch {
+            watchState.isAmbient.collect {
+                if (it!!) {
+                    ambientEnterAnimator.start()
+                } else {
+                    ambientExitAnimator.start()
+                }
 
-            // Trigger recomputation of bounds.
-            oldBounds.set(0, 0, 0, 0)
-            val antiAlias = !(it && watchState.hasLowBitAmbient)
-            digitTextHoursPaint.setAntiAlias(antiAlias)
-            digitTextMinutesPaint.setAntiAlias(antiAlias)
-            digitTextSecondsPaint.setAntiAlias(antiAlias)
+                // Trigger recomputation of bounds.
+                oldBounds.set(0, 0, 0, 0)
+                val antiAlias = !(it && watchState.hasLowBitAmbient)
+                digitTextHoursPaint.isAntiAlias = antiAlias
+                digitTextMinutesPaint.isAntiAlias = antiAlias
+                digitTextSecondsPaint.isAntiAlias = antiAlias
+            }
         }
     }
 
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
index c76bd2e..8c72d26 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
@@ -93,7 +93,7 @@
     private lateinit var minuteHandQuad: Gles2TexturedTriangleList
     private lateinit var hourHandQuad: Gles2TexturedTriangleList
 
-    override fun onBackgroundThreadGlContextCreated() {
+    override suspend fun onBackgroundThreadGlContextCreated() {
         triangleTextureProgram = Gles2TexturedTriangleList.Program()
         backgroundQuad = createTexturedQuad(
             triangleTextureProgram, -10f, -10f, 20f, 20f
@@ -148,7 +148,7 @@
         }
     }
 
-    override fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
+    override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
         GLES20.glEnable(GLES20.GL_TEXTURE_2D)
 
         // Update the projection matrix based on the new aspect ratio.
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
index ccd06ac..2073a4c 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
@@ -222,7 +222,7 @@
     private lateinit var complicationTriangles: Gles2TexturedTriangleList
     private lateinit var complicationHighlightTriangles: Gles2ColoredTriangleList
 
-    override fun onBackgroundThreadGlContextCreated() {
+    override suspend fun onBackgroundThreadGlContextCreated() {
         // Create program for drawing triangles.
         coloredTriangleProgram = Gles2ColoredTriangleList.Program()
 
@@ -347,7 +347,7 @@
         )
     }
 
-    override fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
+    override suspend fun onUiThreadGlSurfaceCreated(width: Int, height: Int) {
         // Update the projection matrix based on the new aspect ratio.
         val aspectRatio = width.toFloat() / height
         Matrix.frustumM(
diff --git a/wear/wear-watchface/samples/src/main/res/values-da/strings.xml b/wear/wear-watchface/samples/src/main/res/values-da/strings.xml
index 5894569..b6559fe 100644
--- a/wear/wear-watchface/samples/src/main/res/values-da/strings.xml
+++ b/wear/wear-watchface/samples/src/main/res/values-da/strings.xml
@@ -29,7 +29,7 @@
     <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Længde på viserne"</string>
     <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Målestok for visere"</string>
     <string name="watchface_complications_setting" msgid="7605635862096204587">"Widgets"</string>
-    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Antal og placering"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Antal og lokation"</string>
     <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Begge"</string>
     <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ingen"</string>
     <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Venstre"</string>
diff --git a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
index c2fafbf..5acc600 100644
--- a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
+++ b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
@@ -394,6 +394,7 @@
 
         Mockito.`when`(surfaceHolder.surfaceFrame)
             .thenReturn(Rect(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT))
+
         Mockito.`when`(surfaceHolder.surface).thenReturn(Surface(surfaceTexture))
 
         setPendingWallpaperInteractiveWatchFaceInstance()
@@ -890,6 +891,5 @@
         )
 
         assertThat(ComplicationTapActivity.awaitIntent()).isNotNull()
-        interactiveWatchFaceInstance.release()
     }
 }
diff --git a/wear/wear-watchface/src/main/AndroidManifest.xml b/wear/wear-watchface/src/main/AndroidManifest.xml
index 85cb6cf..d92c4046 100644
--- a/wear/wear-watchface/src/main/AndroidManifest.xml
+++ b/wear/wear-watchface/src/main/AndroidManifest.xml
@@ -21,6 +21,11 @@
       <action
           android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST"/>
     </intent>
+    <intent>
+      <!-- Needed to have visibility on launcher items to handle app shortcuts in complications. -->
+      <action android:name="android.intent.action.MAIN" />
+      <category android:name="android.intent.category.LAUNCHER" />
+    </intent>
   </queries>
   <application>
     <uses-library android:name="com.google.android.wearable" android:required="false" />
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
index 472f3af..eead284 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
@@ -20,6 +20,7 @@
 import androidx.annotation.RestrictTo
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.launch
 
 /** @hide */
@@ -32,7 +33,7 @@
 ) : BroadcastsReceiver.BroadcastEventObserver {
 
     override fun onActionTimeTick() {
-        if (!watchState.isAmbient.value) {
+        if (!watchState.isAmbient.value!!) {
             watchFaceHostApi.invalidate()
         }
     }
@@ -69,10 +70,8 @@
 
     private fun updateBatteryLowAndNotChargingStatus(value: Boolean) {
         val isBatteryLowAndNotCharging =
-            watchState.isBatteryLowAndNotCharging as ObservableWatchData.MutableObservableWatchData
-        if (!isBatteryLowAndNotCharging.hasValue() ||
-            value != isBatteryLowAndNotCharging.value
-        ) {
+            watchState.isBatteryLowAndNotCharging as MutableStateFlow
+        if (!isBatteryLowAndNotCharging.hasValue() || value != isBatteryLowAndNotCharging.value) {
             isBatteryLowAndNotCharging.value = value
             watchFaceHostApi.invalidate()
         }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
index b071647..42d07be 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
@@ -32,11 +32,12 @@
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.NoDataComplicationData
-import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
+import androidx.wear.watchface.RenderParameters.HighlightedElement
 import androidx.wear.watchface.style.UserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay
-import androidx.wear.watchface.RenderParameters.HighlightedElement
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
 import java.time.Instant
 import java.time.ZonedDateTime
 
@@ -599,8 +600,8 @@
      * The [androidx.wear.complications.data.ComplicationData] associated with the
      * [ComplicationSlot]. This defaults to [NoDataComplicationData].
      */
-    public val complicationData: ObservableWatchData<ComplicationData> =
-        MutableObservableWatchData(NoDataComplicationData())
+    public val complicationData: StateFlow<ComplicationData> =
+        MutableStateFlow(NoDataComplicationData())
 
     /**
      * Whether or not the complication should be considered active and should be rendered at the
@@ -682,12 +683,18 @@
         this.invalidateListener = invalidateListener
     }
 
-    /** Computes the bounds of the complication by converting the unitSquareBounds to pixels. */
-    public fun computeBounds(screen: Rect): Rect {
-        // Try the current type if there is one, otherwise fall back to the bounds for the default
-        // complication data source type.
-        val unitSquareBounds =
-            complicationSlotBounds.perComplicationTypeBounds[complicationData.value.type]!!
+    /**
+     * Computes the bounds of the complication by converting the unitSquareBounds of the specified
+     * [complicationType] to pixels based on the [screen]'s dimensions.
+     *
+     * @param screen A [Rect] describing the dimensions of the screen.
+     * @param complicationType The [ComplicationType] to use when looking up the slot's
+     * [ComplicationSlotBounds.perComplicationTypeBounds].
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun computeBounds(screen: Rect, complicationType: ComplicationType): Rect {
+        val unitSquareBounds = complicationSlotBounds.perComplicationTypeBounds[complicationType]!!
         unitSquareBounds.intersect(unitSquare)
         // We add 0.5 to make toInt() round to the nearest whole number rather than truncating.
         return Rect(
@@ -698,6 +705,15 @@
         )
     }
 
+    /**
+     * Computes the bounds of the complication by converting the unitSquareBounds of the current
+     * complication type to pixels based on the [screen]'s dimensions.
+     *
+     * @param screen A [Rect] describing the dimensions of the screen.
+     */
+    public fun computeBounds(screen: Rect): Rect =
+        computeBounds(screen, complicationData.value.type)
+
     @UiThread
     internal fun dump(writer: IndentingPrintWriter) {
         writer.println("ComplicationSlot $id:")
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
index accb143..e4ba086 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
@@ -31,12 +31,12 @@
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.NoDataComplicationData
 import androidx.wear.utility.TraceEvent
-import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
 import androidx.wear.watchface.control.data.IdTypeAndDefaultProviderPolicyWireFormat
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
+import kotlinx.coroutines.flow.MutableStateFlow
 
 private fun getComponentName(context: Context) = ComponentName(
     context.packageName,
@@ -262,16 +262,23 @@
         complication.dataDirty = complication.dataDirty ||
             (complication.renderer.getData() != data)
         complication.renderer.loadData(data, true)
-        (complication.complicationData as MutableObservableWatchData<ComplicationData>).value =
-            data
+        (complication.complicationData as MutableStateFlow<ComplicationData>).value = data
+    }
+
+    /**
+     * For use by screen shot code which will reset the data afterwards, hence dirty bit not set.
+     */
+    internal fun setComplicationDataUpdateSync(complicationSlotId: Int, data: ComplicationData) {
+        val complication = complicationSlots[complicationSlotId] ?: return
+        complication.renderer.loadData(data, false)
+        (complication.complicationData as MutableStateFlow<ComplicationData>).value = data
     }
 
     @UiThread
     internal fun clearComplicationData() {
         for ((_, complication) in complicationSlots) {
             complication.renderer.loadData(NoDataComplicationData(), false)
-            (complication.complicationData as MutableObservableWatchData).value =
-                NoDataComplicationData()
+            (complication.complicationData as MutableStateFlow).value = NoDataComplicationData()
         }
     }
 
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt
deleted file mode 100644
index 12b1443..0000000
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2020 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.wear.watchface
-
-import androidx.annotation.UiThread
-
-/**
- * An observable UI thread only data holder class (see [Observer]).
- *
- * @param T The type of data held by this instance.
- * @param _value The initial value or `null` if there isn't an initial value.
- */
-public sealed class ObservableWatchData<T : Any> constructor(internal var _value: T?) {
-
-    private var iterating = false
-    private val observers = ArrayList<Observer<T>>()
-    private val toBeRemoved = HashSet<Observer<T>>()
-
-    /** Whether or not this ObservableWatchData contains a value. */
-    @UiThread
-    public fun hasValue(): Boolean = _value != null
-
-    /**
-     * Returns the value contained within this ObservableWatchData or default if there isn't one.
-     */
-    @UiThread
-    public fun getValueOr(default: T): T = if (_value != null) {
-        _value!!
-    } else {
-        default
-    }
-
-    /** The observable value. */
-    public open var value: T
-        @UiThread
-        get() = _value!!
-        @UiThread
-        protected set(v) {
-            require(!iterating)
-            iterating = true
-            _value = v
-
-            var index = 0
-            while (index < observers.size) {
-                val observer = observers[index++]
-                // The observer might unregister itself.
-                if (!toBeRemoved.contains(observer)) {
-                    observer.onChanged(v)
-                }
-            }
-            iterating = false
-            for (observer in toBeRemoved) {
-                observers.remove(observer)
-            }
-            toBeRemoved.clear()
-        }
-
-    /**
-     * Adds the given [Observer] to the observers list. If [hasValue] would return true then
-     * [Observer.onChanged] will be called. Subsequently [Observer.onChanged] will also be called
-     * any time [value] changes. All of these callbacks are assumed to occur on the UI thread.
-     */
-    @UiThread
-    public fun addObserver(observer: Observer<T>) {
-        require(!observers.contains(observer))
-        observers.add(observer)
-        // We want to dispatch a callback when added, and if we're iterating then adding to the end
-        // of the list is sufficient.
-        if (!iterating && _value != null) {
-            observer.onChanged(_value!!)
-        }
-    }
-
-    /** Removes an observer previously added by [addObserver]. */
-    @UiThread
-    public fun removeObserver(observer: Observer<T>) {
-        require(observers.contains(observer))
-
-        if (iterating) {
-            toBeRemoved.add(observer)
-        } else {
-            observers.remove(observer)
-        }
-    }
-
-    override fun toString(): String {
-        return if (hasValue()) {
-            value.toString()
-        } else {
-            "<unset>"
-        }
-    }
-
-    /**
-     * [ObservableWatchData] which publicly exposes [setValue(T)] method.
-     *
-     * @param T The type of data held by this instance
-     */
-    public class MutableObservableWatchData<T : Any>(initialValue: T?) :
-        ObservableWatchData<T>(initialValue) {
-        public constructor() : this(null)
-
-        /**
-         * Mutable observable value. Assigning a different value will trigger [Observer.onChanged]
-         * callbacks.
-         */
-        override var value: T
-            @UiThread
-            get() = _value!!
-            @UiThread
-            public set(v) {
-                super.value = v
-            }
-    }
-}
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Observer.java b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Observer.java
deleted file mode 100644
index b179769..0000000
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Observer.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2020 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.wear.watchface;
-
-import androidx.annotation.NonNull;
-
-/**
- * A simple callback that can receive from ObservableWatchData.  NB defined in java to allow SAM
- * conversion of kotlin lambdas.
- *
- * @param <T> The type of the parameter
- */
-@SuppressWarnings("CallbackName")
-public interface Observer<T> {
-    /**
-     * Called when the data is changed.
-     * @param t The new data
-     */
-    void onChanged(@NonNull T t);
-}
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
index c12d527..e472be2 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
@@ -45,6 +45,11 @@
 import androidx.wear.watchface.Renderer.GlesRenderer
 import androidx.wear.watchface.Renderer.GlesRenderer.GlesException
 import androidx.wear.watchface.style.CurrentUserStyleRepository
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
 import java.nio.ByteBuffer
 import java.time.ZonedDateTime
 
@@ -267,7 +272,7 @@
      */
     @UiThread
     public open fun shouldAnimate(): Boolean =
-        watchState.isVisible.value && !watchState.isAmbient.value
+        watchState.isVisible.value!! && !watchState.isAmbient.value!!
 
     /**
      * Schedules a call to either [CanvasRenderer.render] or [GlesRenderer.render] to draw the next
@@ -295,7 +300,7 @@
      * any subsequent calls to [renderInternal] or [takeScreenshot].
      */
     @UiThread
-    internal open fun uiThreadInitInternal() {}
+    internal open suspend fun uiThreadInitInternal(uiThreadCoroutineScope: CoroutineScope) {}
 
     /**
      * Watch faces that require [Canvas] rendering should extend their [Renderer] from this class.
@@ -306,6 +311,9 @@
      * memory barrier between construction and rendering so no special threading primitives are
      * required.
      *
+     * In Java it may be easier to extend [androidx.wear.watchface.ListenableCanvasRenderer]
+     * instead.
+     *
      * @param surfaceHolder The [SurfaceHolder] from which a [Canvas] to will be obtained and passed
      * into [render].
      * @param currentUserStyleRepository The watch face's associated [CurrentUserStyleRepository].
@@ -342,7 +350,7 @@
                 }
                 ) ?: return
             try {
-                if (Build.VERSION.SDK_INT >= 30 || watchState.isVisible.value) {
+                if (Build.VERSION.SDK_INT >= 30 || watchState.isVisible.value!!) {
                     renderAndComposite(canvas, zonedDateTime)
                 } else {
                     canvas.drawColor(Color.BLACK)
@@ -393,16 +401,17 @@
             }
         }
 
-        override fun uiThreadInitInternal() {
+        internal override suspend fun uiThreadInitInternal(uiThreadCoroutineScope: CoroutineScope) {
             init()
         }
 
         /**
          * Perform UiThread specific initialization.  Will be called once during initialization
-         * before any subsequent calls to [render].
+         * before any subsequent calls to [render].  If you need to override this method in java,
+         * consider using [androidx.wear.watchface.ListenableCanvasRenderer] instead.
          */
         @UiThread
-        public open fun init() {}
+        public open suspend fun init() {}
 
         /**
          * Sub-classes should override this to implement their watch face rendering logic which
@@ -483,6 +492,8 @@
      * faces if an APK contains more than one [WatchFaceService]). In addition most drivers do not
      * support concurrent access.
      *
+     * In Java it may be easier to extend [androidx.wear.watchface.ListenableGlesRenderer] instead.
+     *
      * @param surfaceHolder The [SurfaceHolder] whose [android.view.Surface] [render] will draw
      * into.
      * @param currentUserStyleRepository The associated [CurrentUserStyleRepository].
@@ -521,7 +532,7 @@
         private companion object {
             private const val TAG = "Gles2WatchFace"
 
-            private val glContextLock = Any()
+            private val glContextLock = Mutex()
         }
 
         /** Exception thrown if a GL call fails */
@@ -608,7 +619,7 @@
         }
 
         @Throws(GlesException::class)
-        private fun createWindowSurface(width: Int, height: Int) = TraceEvent(
+        private suspend fun createWindowSurface(width: Int, height: Int) = TraceEvent(
             "GlesRenderer.createWindowSurface"
         ).use {
             if (this::eglSurface.isInitialized) {
@@ -667,9 +678,9 @@
         }
 
         /**
-         * Inside of a synchronized block this function sets the GL context associated with the
+         * Inside of a [Mutex] this function sets the GL context associated with the
          * [WatchFaceService.getBackgroundThreadHandler]'s looper thread as the current one,
-         * executes [runnable] and finally unsets the GL context.
+         * executes [commands] and finally unsets the GL context.
          *
          * Access to the GL context this way is necessary because GL contexts are not shared
          * between renderers and there can be multiple watch face instances existing concurrently
@@ -678,12 +689,14 @@
          *
          * NB this function is called by the library before running
          * [runBackgroundThreadGlCommands] so there's no need to use this directly in client
-         * code unless you need to make GL calls outside of those methods.
+         * code unless you need to make GL calls outside of those methods. If you need to call this
+         * method from java, consider using [androidx.wear.watchface.ListenableGlesRenderer] which
+         * provides an overload taking a [Runnable].
          *
          * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
          */
         @WorkerThread
-        public fun runBackgroundThreadGlCommands(runnable: Runnable) {
+        public suspend fun runBackgroundThreadGlCommands(commands: suspend () -> Unit) {
             require(
                 watchFaceHostApi == null ||
                     watchFaceHostApi!!.getBackgroundThreadHandler().looper.isCurrentThread
@@ -691,7 +704,7 @@
                 "runBackgroundThreadGlCommands must be called from the Background Thread"
             }
             // It's only safe to run GL command from one thread at a time.
-            synchronized(glContextLock) {
+            glContextLock.withLock {
                 if (!EGL14.eglMakeCurrent(
                         eglDisplay,
                         fakeBackgroundThreadSurface,
@@ -705,7 +718,7 @@
                 }
 
                 try {
-                    runnable.run()
+                    commands()
                 } finally {
                     EGL14.eglMakeCurrent(
                         eglDisplay,
@@ -725,7 +738,7 @@
          */
         @UiThread
         @Throws(GlesException::class)
-        internal fun initBackgroundThreadOpenGlContext() =
+        internal suspend fun initBackgroundThreadOpenGlContext() =
             TraceEvent("GlesRenderer.initBackgroundThreadOpenGlContext").use {
                 eglBackgroundThreadContext = EGL14.eglCreateContext(
                     eglDisplay,
@@ -746,27 +759,27 @@
             }
 
         /**
-         * Inside of a synchronized block this function sets the UiThread GL context as the current
-         * one, executes [runnable] and finally unsets the GL context.
+         * Inside of a [Mutex] this function sets the UiThread GL context as the current
+         * one, executes [commands] and finally unsets the GL context.
          *
          * Access to the GL context this way is necessary because GL contexts are not shared
          * between renderers and there can be multiple watch face instances existing concurrently
          * (e.g. headless and interactive, potentially from different watch faces if an APK
          * contains more than one [WatchFaceService]).
          *
-         * NB this function is called by the library before running [render] or
-         * [onUiThreadGlSurfaceCreated] so there's no need to use this directly in client code
-         * unless you need to make GL calls outside of those methods.
+         * If you need to call this method from java, consider using
+         * [androidx.wear.watchface.ListenableGlesRenderer] which provides an overload taking a
+         * [Runnable].
          *
          * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
          */
-        @UiThread
-        public fun runUiThreadGlCommands(runnable: Runnable) {
+        public suspend fun runUiThreadGlCommands(commands: suspend() -> Unit) {
             require(watchFaceHostApi!!.getUiThreadHandler().looper.isCurrentThread) {
                 "runUiThreadGlCommands must be called from the UiThread"
             }
+
             // It's only safe to run GL command from one thread at a time.
-            synchronized(glContextLock) {
+            glContextLock.withLock {
                 if (!EGL14.eglMakeCurrent(
                         eglDisplay,
                         eglSurface,
@@ -780,7 +793,7 @@
                 }
 
                 try {
-                    runnable.run()
+                    commands()
                 } finally {
                     EGL14.eglMakeCurrent(
                         eglDisplay,
@@ -800,7 +813,7 @@
          */
         @UiThread
         @Throws(GlesException::class)
-        internal override fun uiThreadInitInternal() =
+        internal override suspend fun uiThreadInitInternal(uiThreadCoroutineScope: CoroutineScope) =
             TraceEvent("GlesRenderer.initUiThreadOpenGlContext").use {
                 eglUiThreadContext = EGL14.eglCreateContext(
                     eglDisplay,
@@ -822,7 +835,9 @@
                         width: Int,
                         height: Int
                     ) {
-                        createWindowSurface(width, height)
+                        uiThreadCoroutineScope.launch {
+                            createWindowSurface(width, height)
+                        }
                     }
 
                     @SuppressLint("SyntheticAccessor")
@@ -851,30 +866,39 @@
          * thread, before any subsequent calls to [render]. Note this function is called inside a
          * lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the
          * GL context.
+         *
+         * If you need to override this method in java, consider using
+         * [androidx.wear.watchface.ListenableGlesRenderer] instead.
          */
         @WorkerThread
-        public open fun onBackgroundThreadGlContextCreated() {
+        public open suspend fun onBackgroundThreadGlContextCreated() {
         }
 
         /**
-         * Called once when a new GL surface is created on the UiThread, before any subsequent calls
-         * to [render]. Note this function is called inside a lambda passed to
-         * [runUiThreadGlCommands] which has synchronized access to the GL context.
+         * Called when a new GL surface is created on the UiThread, before any subsequent calls
+         * to [render] or in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function
+         * is  called inside a lambda passed to [runUiThreadGlCommands] which has synchronized
+         * access to the GL context.
+         *
+         * If you need to override this method in java, consider using
+         * [androidx.wear.watchface.ListenableGlesRenderer] instead.
          *
          * @param width width of surface in pixels
          * @param height height of surface in pixels
          */
         @UiThread
-        public open fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int) {
+        public open suspend fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int) {
         }
 
         internal override fun renderInternal(
             zonedDateTime: ZonedDateTime
         ) {
-            runUiThreadGlCommands {
-                renderAndComposite(zonedDateTime)
-                if (!EGL14.eglSwapBuffers(eglDisplay, eglSurface)) {
-                    Log.w(TAG, "eglSwapBuffers failed")
+            runBlocking {
+                runUiThreadGlCommands {
+                    renderAndComposite(zonedDateTime)
+                    if (!EGL14.eglSwapBuffers(eglDisplay, eglSurface)) {
+                        Log.w(TAG, "eglSwapBuffers failed")
+                    }
                 }
             }
         }
@@ -887,25 +911,27 @@
             val height = screenBounds.height()
             val pixelBuf = ByteBuffer.allocateDirect(width * height * 4)
             val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
-            runUiThreadGlCommands {
-                val prevRenderParameters = this.renderParameters
-                this.renderParameters = renderParameters
-                renderAndComposite(zonedDateTime)
-                this.renderParameters = prevRenderParameters
-                GLES20.glFinish()
-                GLES20.glReadPixels(
-                    0,
-                    0,
-                    width,
-                    height,
-                    GLES20.GL_RGBA,
-                    GLES20.GL_UNSIGNED_BYTE,
-                    pixelBuf
-                )
-                // The image is flipped when using read pixels because the first pixel in the OpenGL
-                // buffer is in bottom left.
-                verticalFlip(pixelBuf, width, height)
-                bitmap.copyPixelsFromBuffer(pixelBuf)
+            runBlocking {
+                runUiThreadGlCommands {
+                    val prevRenderParameters = this@GlesRenderer.renderParameters
+                    this@GlesRenderer.renderParameters = renderParameters
+                    renderAndComposite(zonedDateTime)
+                    this@GlesRenderer.renderParameters = prevRenderParameters
+                    GLES20.glFinish()
+                    GLES20.glReadPixels(
+                        0,
+                        0,
+                        width,
+                        height,
+                        GLES20.GL_RGBA,
+                        GLES20.GL_UNSIGNED_BYTE,
+                        pixelBuf
+                    )
+                    // The image is flipped when using read pixels because the first pixel in the OpenGL
+                    // buffer is in bottom left.
+                    verticalFlip(pixelBuf, width, height)
+                    bitmap.copyPixelsFromBuffer(pixelBuf)
+                }
             }
             return bitmap
         }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index 67bde2d..83d0e74 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -44,7 +44,6 @@
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.toApiComplicationData
 import androidx.wear.utility.TraceEvent
-import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
 import androidx.wear.watchface.control.data.ComplicationRenderParams
 import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
@@ -56,6 +55,12 @@
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.WatchFaceLayer
 import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
 import java.security.InvalidParameterException
 import java.time.Instant
 import java.time.ZoneId
@@ -546,8 +551,8 @@
     private var inOnSetStyle = false
     internal var initComplete = false
 
-    private val ambientObserver = Observer<Boolean> {
-        TraceEvent("WatchFaceImpl.ambientObserver").use {
+    private fun ambient() {
+        TraceEvent("WatchFaceImpl.ambient").use {
             // It's not safe to draw until initComplete because the ComplicationSlotManager init
             // may not have completed.
             if (initComplete) {
@@ -557,7 +562,7 @@
         }
     }
 
-    private val interruptionFilterObserver = Observer<Int> {
+    private fun interruptionFilter(it: Int) {
         // We are in mute mode in any of the following modes. The specific mode depends on the
         // device's implementation of "Do Not Disturb".
         val inMuteMode = it == NotificationManager.INTERRUPTION_FILTER_NONE ||
@@ -569,8 +574,8 @@
         }
     }
 
-    private val visibilityObserver = Observer<Boolean> { isVisible ->
-        TraceEvent("WatchFaceImpl.visibilityObserver").use {
+    private fun visibility(isVisible: Boolean) {
+        TraceEvent("WatchFaceImpl.visibility").use {
             if (isVisible) {
                 registerReceivers()
                 watchFaceHostApi.invalidate()
@@ -589,7 +594,7 @@
 
     // Only installed if Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
     @SuppressLint("NewApi")
-    private val batteryLowAndNotChargingObserver = Observer<Boolean> {
+    private fun batteryLowAndNotCharging(it: Boolean) {
         // To save power we request a lower hardware display frame rate when the battery is low
         // and not charging.
         if (renderer.surfaceHolder.surface.isValid) {
@@ -606,7 +611,6 @@
 
     init {
         renderer.watchFaceHostApi = watchFaceHostApi
-        renderer.uiThreadInitInternal()
 
         if (renderer.additionalContentDescriptionLabels.isNotEmpty()) {
             watchFaceHostApi.updateContentDescriptionLabels()
@@ -622,12 +626,39 @@
             WatchFace.registerEditorDelegate(componentName, WFEditorDelegate())
         }
 
-        watchState.isAmbient.addObserver(ambientObserver)
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !watchState.isHeadless) {
-            watchState.isBatteryLowAndNotCharging.addObserver(batteryLowAndNotChargingObserver)
+        val mainScope = CoroutineScope(Dispatchers.Main.immediate)
+
+        mainScope.launch {
+            watchState.isAmbient.collect {
+                ambient()
+            }
         }
-        watchState.interruptionFilter.addObserver(interruptionFilterObserver)
-        watchState.isVisible.addObserver(visibilityObserver)
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !watchState.isHeadless) {
+            mainScope.launch {
+                watchState.isBatteryLowAndNotCharging.collect {
+                    if (it != null) {
+                        batteryLowAndNotCharging(it)
+                    }
+                }
+            }
+        }
+
+        mainScope.launch {
+            watchState.interruptionFilter.collect {
+                if (it != null) {
+                    interruptionFilter(it)
+                }
+            }
+        }
+
+        mainScope.launch {
+            watchState.isVisible.collect {
+                if (it != null) {
+                    visibility(it)
+                }
+            }
+        }
     }
 
     internal fun invalidateIfNotAnimating() {
@@ -677,7 +708,7 @@
 
             slotIdToComplicationData?.let {
                 for ((id, complicationData) in it) {
-                    complicationSlotsManager[id]!!.renderer.loadData(complicationData, false)
+                    complicationSlotsManager.setComplicationDataUpdateSync(id, complicationData)
                 }
             }
             val screenShot = renderer.takeScreenshot(
@@ -685,8 +716,8 @@
                 renderParameters
             )
             if (slotIdToComplicationData != null) {
-                for ((id, data) in oldComplicationData) {
-                    complicationSlotsManager[id]!!.renderer.loadData(data, false)
+                for ((id, complicationData) in oldComplicationData) {
+                    complicationSlotsManager.setComplicationDataUpdateSync(id, complicationData)
                 }
             }
             return screenShot
@@ -708,8 +739,7 @@
             val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
             level * 100 / scale.toFloat()
         } ?: 100.0f
-        val isBatteryLowAndNotCharging =
-            watchState.isBatteryLowAndNotCharging as MutableObservableWatchData
+        val isBatteryLowAndNotCharging = watchState.isBatteryLowAndNotCharging as MutableStateFlow
         isBatteryLowAndNotCharging.value =
             (batteryPercent < INITIAL_LOW_BATTERY_THRESHOLD) && !isCharging
     }
@@ -726,12 +756,6 @@
     internal fun onDestroy() {
         pendingUpdateTime.cancel()
         renderer.onDestroy()
-        watchState.isAmbient.removeObserver(ambientObserver)
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !watchState.isHeadless) {
-            watchState.isBatteryLowAndNotCharging.removeObserver(batteryLowAndNotChargingObserver)
-        }
-        watchState.interruptionFilter.removeObserver(interruptionFilterObserver)
-        watchState.isVisible.removeObserver(visibilityObserver)
         if (!watchState.isHeadless) {
             WatchFace.unregisterEditorDelegate(componentName)
         }
@@ -791,7 +815,7 @@
         }
         // Watch faces may wish to run an animation while entering ambient mode and we let them
         // defer entering ambient mode.
-        if (watchState.isAmbient.value && !renderer.shouldAnimate()) {
+        if (watchState.isAmbient.value!! && !renderer.shouldAnimate()) {
             newDrawMode = DrawMode.AMBIENT
         } else if (muteMode) {
             newDrawMode = DrawMode.MUTE
@@ -944,13 +968,8 @@
 
         params.idAndComplicationDatumWireFormats?.let {
             for (idAndData in it) {
-                val complicationSlot = complicationSlotsManager[idAndData.id]
-                require(complicationSlot != null) {
-                    "ComplicationSlot ID ${idAndData.id} is unknown"
-                }
-                complicationSlot.renderer.loadData(
-                    idAndData.complicationData.toApiComplicationData(),
-                    false
+                complicationSlotsManager.setComplicationDataUpdateSync(
+                    idAndData.id, idAndData.complicationData.toApiComplicationData()
                 )
             }
         }
@@ -969,8 +988,8 @@
         }
 
         if (params.idAndComplicationDatumWireFormats != null) {
-            for ((id, data) in oldComplicationData) {
-                complicationSlotsManager[id]!!.renderer.loadData(data, false)
+            for ((id, complicationData) in oldComplicationData) {
+                complicationSlotsManager.setComplicationDataUpdateSync(id, complicationData)
             }
         }
 
@@ -1004,9 +1023,9 @@
             val screenshotComplicationData = params.complicationData
             if (screenshotComplicationData != null) {
                 prevData = it.renderer.getData()
-                it.renderer.loadData(
-                    screenshotComplicationData.toApiComplicationData(),
-                    false
+                complicationSlotsManager.setComplicationDataUpdateSync(
+                    params.complicationSlotId,
+                    screenshotComplicationData.toApiComplicationData()
                 )
             }
 
@@ -1020,7 +1039,10 @@
 
             // Restore previous ComplicationData & style if required.
             if (prevData != null) {
-                it.renderer.loadData(prevData, false)
+                complicationSlotsManager.setComplicationDataUpdateSync(
+                    params.complicationSlotId,
+                    prevData
+                )
             }
 
             if (newStyle != null) {
@@ -1052,3 +1074,13 @@
         writer.decreaseIndent()
     }
 }
+
+internal fun <Boolean> StateFlow<Boolean?>.getValueOr(default: Boolean): Boolean {
+    return if (hasValue()) {
+        value!!
+    } else {
+        default
+    }
+}
+
+internal fun <T> StateFlow<T>.hasValue(): Boolean = value != null
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index 151c791..a8f00a8 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -56,6 +56,7 @@
 import androidx.wear.utility.AsyncTraceEvent
 import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.control.HeadlessWatchFaceImpl
+import androidx.wear.watchface.control.IWatchfaceReadyListener
 import androidx.wear.watchface.control.InteractiveInstanceManager
 import androidx.wear.watchface.control.InteractiveWatchFaceImpl
 import androidx.wear.watchface.control.data.CrashInfoParcel
@@ -864,7 +865,7 @@
 
         @UiThread
         internal fun ambientTickUpdate(): Unit = TraceEvent("EngineWrapper.ambientTickUpdate").use {
-            if (mutableWatchState.isAmbient.value) {
+            if (mutableWatchState.isAmbient.value!!) {
                 ambientUpdateWakelock.acquire()
                 // It's unlikely an ambient tick would be sent to a watch face that hasn't loaded
                 // yet. The watch face will render at least once upon loading so we don't need to do
@@ -925,6 +926,14 @@
             deferredWatchFaceImpl.await().complicationSlotsManager.clearComplicationData()
         }
 
+        /** This can be called on any thread. */
+        internal fun addWatchfaceReadyListener(listener: IWatchfaceReadyListener) {
+            uiThreadCoroutineScope.launch {
+                deferredWatchFaceImpl.await()
+                listener.onWatchfaceReady()
+            }
+        }
+
         @UiThread
         internal fun setImmutableSystemState(deviceConfig: DeviceConfig) {
             // These properties never change so set them once only.
@@ -1481,6 +1490,9 @@
                     broadcastsReceiver
                 )
 
+                // Perform UI thread render init.
+                watchFaceImpl.renderer.uiThreadInitInternal(uiThreadCoroutineScope)
+
                 // Make sure no UI thread rendering (a consequence of completing
                 // deferredWatchFaceImpl) occurs before initStyleAndComplications has
                 // executed. NB usually we won't have to wait at all.
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
index b5b5aa8..19df98b 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
@@ -20,7 +20,8 @@
 import androidx.annotation.Px
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
-import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
 
 /**
  * Describes the current state of the wearable including some hardware details such as whether or
@@ -55,11 +56,11 @@
  * @param isHeadless Whether or not this is a headless watchface.
  */
 public class WatchState(
-    public val interruptionFilter: ObservableWatchData<Int>,
-    public val isAmbient: ObservableWatchData<Boolean>,
+    public val interruptionFilter: StateFlow<Int?>,
+    public val isAmbient: StateFlow<Boolean?>,
     /** @hide */
-    public val isBatteryLowAndNotCharging: ObservableWatchData<Boolean>,
-    public val isVisible: ObservableWatchData<Boolean>,
+    public val isBatteryLowAndNotCharging: StateFlow<Boolean?>,
+    public val isVisible: StateFlow<Boolean?>,
     @get:JvmName("hasLowBitAmbient")
     public val hasLowBitAmbient: Boolean,
     @get:JvmName("hasBurnInProtection")
@@ -90,13 +91,12 @@
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class MutableWatchState {
-    public var interruptionFilter: MutableObservableWatchData<Int> = MutableObservableWatchData(
+    public var interruptionFilter: MutableStateFlow<Int> = MutableStateFlow(
         NotificationManager.INTERRUPTION_FILTER_UNKNOWN
     )
-    public val isAmbient: MutableObservableWatchData<Boolean> = MutableObservableWatchData()
-    public val isBatteryLowAndNotCharging: MutableObservableWatchData<Boolean> =
-        MutableObservableWatchData()
-    public val isVisible: MutableObservableWatchData<Boolean> = MutableObservableWatchData()
+    public val isAmbient: MutableStateFlow<Boolean?> = MutableStateFlow(null)
+    public val isBatteryLowAndNotCharging: MutableStateFlow<Boolean?> = MutableStateFlow(null)
+    public val isVisible: MutableStateFlow<Boolean?> = MutableStateFlow(null)
     public var hasLowBitAmbient: Boolean = false
     public var hasBurnInProtection: Boolean = false
     public var analogPreviewReferenceTimeMillis: Long = 0
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
index 6e33c04..cfe74a60 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
@@ -38,7 +38,7 @@
             writer.increaseIndent()
             writer.println("impl.instanceId=${impl.instanceId}")
             writer.println("refcount=$refcount")
-            impl.engine.dump(writer)
+            impl.engine?.dump(writer)
             writer.decreaseIndent()
         }
     }
@@ -78,6 +78,7 @@
             synchronized(pendingWallpaperInteractiveWatchFaceInstanceLock) {
                 instances[instanceId]?.let {
                     if (--it.refcount == 0) {
+                        it.impl.onDestroy()
                         instances.remove(instanceId)
                     }
                 }
@@ -117,7 +118,7 @@
                     // need to ensure there isn't a skew between the style the watch face actually
                     // has and what the system thinks we should have. Note runBlocking is safe here
                     // because we never await.
-                    val engine = instance.impl.engine
+                    val engine = instance.impl.engine!!
                     runBlocking {
                         withContext(engine.uiThreadCoroutineScope.coroutineContext) {
                             if (engine.deferredWatchFaceImpl.isCompleted) {
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index cf57c1c..2395af1 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -34,7 +34,7 @@
 
 /** An interactive watch face instance with SysUI and WCS facing interfaces.*/
 internal class InteractiveWatchFaceImpl(
-    internal val engine: WatchFaceService.EngineWrapper,
+    internal var engine: WatchFaceService.EngineWrapper?,
     internal var instanceId: String
 ) : IInteractiveWatchFace.Stub() {
 
@@ -50,8 +50,8 @@
     ): R = TraceEvent(traceName).use {
         runBlocking {
             try {
-                val watchFaceImpl = engine.deferredWatchFaceImpl.await()
-                withContext(engine.uiThreadCoroutineScope.coroutineContext) {
+                val watchFaceImpl = engine!!.deferredWatchFaceImpl.await()
+                withContext(engine!!.uiThreadCoroutineScope.coroutineContext) {
                     task(watchFaceImpl)
                 }
             } catch (e: Exception) {
@@ -80,7 +80,7 @@
     override fun getContentDescriptionLabels() =
         awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "InteractiveWatchFaceImpl.getContentDescriptionLabels"
-        ) { engine.contentDescriptionLabels }
+        ) { engine!!.contentDescriptionLabels }
 
     @RequiresApi(Build.VERSION_CODES.O_MR1)
     override fun renderWatchFaceToBitmap(params: WatchFaceRenderParams) =
@@ -96,25 +96,25 @@
     override fun setWatchUiState(watchUiState: WatchUiState) =
         awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "InteractiveWatchFaceImpl.setWatchUiState"
-        ) { engine.setWatchUiState(watchUiState) }
+        ) { engine!!.setWatchUiState(watchUiState) }
 
     override fun getInstanceId(): String = instanceId
 
     override fun ambientTickUpdate() {
-        engine.uiThreadCoroutineScope.runBlockingWithTracing(
+        engine!!.uiThreadCoroutineScope.runBlockingWithTracing(
             "InteractiveWatchFaceImpl.ambientTickUpdate"
-        ) { engine.ambientTickUpdate() }
+        ) { engine!!.ambientTickUpdate() }
     }
 
     override fun release() = TraceEvent("InteractiveWatchFaceImpl.release").use {
         runBlocking {
             try {
-                engine.deferredWatchFaceImpl.await()
+                engine!!.deferredWatchFaceImpl.await()
             } catch (e: Exception) {
                 // deferredWatchFaceImpl may have completed with an exception. This will have
                 // already been reported so we can ignore it.
             }
-            withContext(engine.uiThreadCoroutineScope.coroutineContext) {
+            withContext(engine!!.uiThreadCoroutineScope.coroutineContext) {
                 InteractiveInstanceManager.releaseInstance(instanceId)
             }
         }
@@ -122,9 +122,9 @@
 
     override fun updateComplicationData(
         complicationDatumWireFormats: MutableList<IdAndComplicationDataWireFormat>
-    ) = engine.uiThreadCoroutineScope.runBlockingWithTracing(
+    ) = engine!!.uiThreadCoroutineScope.runBlockingWithTracing(
         "InteractiveWatchFaceImpl.updateComplicationData"
-    ) { engine.setComplicationDataList(complicationDatumWireFormats) }
+    ) { engine!!.setComplicationDataList(complicationDatumWireFormats) }
 
     override fun updateWatchfaceInstance(
         newInstanceId: String,
@@ -134,16 +134,16 @@
          * This is blocking to ensure ordering with respect to any subsequent [getInstanceId] and
          * [getPreviewReferenceTimeMillis] calls.
          */
-        engine.uiThreadCoroutineScope.runBlockingWithTracing(
+        engine!!.uiThreadCoroutineScope.runBlockingWithTracing(
             "InteractiveWatchFaceImpl.updateWatchfaceInstance"
         ) {
             if (instanceId != newInstanceId) {
                 // If the favorite ID has changed then the complications are probably invalid.
-                engine.clearComplicationData()
+                engine!!.clearComplicationData()
                 InteractiveInstanceManager.renameInstance(instanceId, newInstanceId)
                 instanceId = newInstanceId
             }
-            engine.setUserStyle(userStyle)
+            engine!!.setUserStyle(userStyle)
         }
     }
 
@@ -160,4 +160,12 @@
     override fun bringAttentionToComplication(id: Int) {
         // Unsupported.
     }
+
+    override fun addWatchfaceReadyListener(listener: IWatchfaceReadyListener) {
+        engine!!.addWatchfaceReadyListener(listener)
+    }
+
+    fun onDestroy() {
+        engine = null
+    }
 }
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt
deleted file mode 100644
index 8f796dd..0000000
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright 2020 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.wear.watchface
-
-import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.MockitoAnnotations
-import org.mockito.Mockito.any
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.robolectric.annotation.Config
-
-@Config(manifest = Config.NONE)
-@RunWith(WatchFaceTestRunner::class)
-public class ObservableWatchDataTest {
-    @Mock
-    private lateinit var observer: Observer<Int>
-
-    @Mock
-    private lateinit var observer2: Observer<Int>
-
-    @Mock
-    private lateinit var observer3: Observer<Int>
-
-    @Before
-    public fun setUp() {
-        MockitoAnnotations.initMocks(this)
-    }
-
-    @Test
-    public fun initialValue() {
-        val data = MutableObservableWatchData(10)
-        assertThat(data.value).isEqualTo(10)
-    }
-
-    @Test
-    public fun mutatedValue() {
-        val data = MutableObservableWatchData(10)
-        data.value = 20
-        assertThat(data.value).isEqualTo(20)
-    }
-
-    @Test
-    public fun addObserverNoData() {
-        val data = MutableObservableWatchData<Int>()
-        data.addObserver(observer)
-        verify(observer, never()).onChanged(any())
-    }
-
-    @Test
-    public fun addObserver() {
-        val data = MutableObservableWatchData(10)
-        data.addObserver(observer)
-        verify(observer).onChanged(10)
-    }
-
-    @Test
-    public fun addObserverAndAssign() {
-        val data = MutableObservableWatchData(10)
-        data.addObserver(observer)
-        verify(observer).onChanged(10)
-
-        data.value = 20
-        verify(observer).onChanged(20)
-    }
-
-    @Test
-    public fun addObserverNoDataThenAssign() {
-        val data = MutableObservableWatchData<Int>()
-        data.addObserver(observer)
-
-        data.value = 20
-        verify(observer).onChanged(20)
-    }
-
-    @Test
-    public fun addAndRemoveObserver() {
-        val data = MutableObservableWatchData(10)
-        data.addObserver(observer)
-        data.removeObserver(observer)
-        verify(observer).onChanged(10)
-
-        data.value = 20
-        verify(observer, never()).onChanged(20)
-    }
-
-    @Test
-    public fun removeObserverDuringCallback() {
-        val data = MutableObservableWatchData(10)
-        data.addObserver(observer)
-        data.addObserver(observer2)
-        data.addObserver(observer3)
-
-        verify(observer).onChanged(10)
-        verify(observer2).onChanged(10)
-        verify(observer3).onChanged(10)
-
-        // Remove observer2 when observer invoked
-        Mockito.doAnswer {
-            data.removeObserver(observer2)
-        }.`when`(observer).onChanged(20)
-
-        data.value = 20
-        verify(observer2, never()).onChanged(20)
-        verify(observer3).onChanged(20)
-    }
-
-    @Test
-    public fun addObserverInObserver() {
-        val data = MutableObservableWatchData(10)
-        var observersAdded = 0
-        var addedObserverObservations = 0
-
-        // Inhibit initial onChanged callback for clarity.
-        var addObserver = false
-        data.addObserver(
-            Observer<Int> {
-                if (addObserver) {
-                    val observer = Observer<Int> { addedObserverObservations++ }
-                    data.addObserver(observer)
-                    observersAdded++
-                }
-            }
-        )
-        addObserver = true
-
-        data.value = 20
-
-        assertThat(observersAdded).isEqualTo(1)
-        assertThat(addedObserverObservations).isEqualTo(1)
-    }
-}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index db2a279..3317757 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -64,7 +64,6 @@
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.style.CurrentUserStyleRepository
-import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
@@ -73,10 +72,17 @@
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.Option
+import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.mock
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.android.asCoroutineDispatcher
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
 import org.junit.After
+import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
@@ -2108,12 +2114,18 @@
         lateinit var leftComplicationData: ComplicationData
         lateinit var rightComplicationData: ComplicationData
 
-        leftComplication.complicationData.addObserver {
-            leftComplicationData = it.asWireComplicationData()
+        val scope = CoroutineScope(Dispatchers.Main.immediate)
+
+        scope.launch {
+            leftComplication.complicationData.collect {
+                leftComplicationData = it.asWireComplicationData()
+            }
         }
 
-        rightComplication.complicationData.addObserver {
-            rightComplicationData = it.asWireComplicationData()
+        scope.launch {
+            rightComplication.complicationData.collect {
+                rightComplicationData = it.asWireComplicationData()
+            }
         }
 
         interactiveWatchFaceInstance.updateComplicationData(
@@ -2269,7 +2281,7 @@
     }
 
     @Test
-    public fun watchStateObservableWatchDataMembersHaveValues() {
+    public fun watchStateStateFlowDataMembersHaveValues() {
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
             emptyList(),
@@ -2321,7 +2333,7 @@
                 putExtra(BatteryManager.EXTRA_SCALE, 100)
             }
         )
-        assertTrue(watchState.isBatteryLowAndNotCharging.value)
+        assertTrue(watchState.isBatteryLowAndNotCharging.value!!)
 
         watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(
             Intent().apply {
@@ -2330,7 +2342,7 @@
                 putExtra(BatteryManager.EXTRA_SCALE, 100)
             }
         )
-        assertFalse(watchState.isBatteryLowAndNotCharging.value)
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
 
         watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(
             Intent().apply {
@@ -2339,13 +2351,13 @@
                 putExtra(BatteryManager.EXTRA_SCALE, 100)
             }
         )
-        assertFalse(watchState.isBatteryLowAndNotCharging.value)
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
 
         watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(Intent())
-        assertFalse(watchState.isBatteryLowAndNotCharging.value)
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
 
         watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(null)
-        assertFalse(watchState.isBatteryLowAndNotCharging.value)
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
     }
 
     @Test
@@ -2602,16 +2614,28 @@
             )
         )
 
-        val observer = mock<Observer<Boolean>>()
+        var numOfCalls = 0
 
-        // This should be ignored.
+        CoroutineScope(handler.asCoroutineDispatcher().immediate).launch {
+            watchState.isVisible.collect {
+                numOfCalls++
+            }
+        }
+
+        // The collect call will be triggered immediately to report the current value, so make
+        // sure that numOfCalls has increased before proceeding next.
+        runPostedTasksFor(0)
+        assertEquals(1, numOfCalls)
+
+        // This should be ignored and not trigger collect.
         engineWrapper.onVisibilityChanged(true)
-        watchState.isVisible.addObserver(observer)
-        verify(observer, times(0)).onChanged(false)
+        runPostedTasksFor(0)
+        assertEquals(1, numOfCalls)
 
         // This should trigger the observer.
         engineWrapper.onVisibilityChanged(false)
-        verify(observer).onChanged(true)
+        runPostedTasksFor(0)
+        assertEquals(2, numOfCalls)
     }
 
     @Test
diff --git a/window/window-extensions/api/current.txt b/window/window-extensions/api/current.txt
index 7f8cb1a..95519f1 100644
--- a/window/window-extensions/api/current.txt
+++ b/window/window-extensions/api/current.txt
@@ -2,8 +2,8 @@
 package androidx.window.extensions {
 
   public class WindowLibraryInfo {
-    method public int getApiLevel();
     method public static androidx.window.extensions.WindowLibraryInfo getInstance(android.content.Context);
+    method public int getVendorApiLevel();
   }
 
 }
@@ -25,12 +25,17 @@
     field public static final int TYPE_HINGE = 2; // 0x2
   }
 
-  public class WindowLayoutComponent {
+  public interface WindowLayoutComponent {
     method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method public static androidx.window.extensions.layout.WindowLayoutComponent? getInstance(android.content.Context);
     method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
   }
 
+  public class WindowLayoutComponentProvider {
+    method public static androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent(android.content.Context);
+    method public static boolean isWindowLayoutComponentAvailable();
+  }
+
   public class WindowLayoutInfo {
     ctor public WindowLayoutInfo(java.util.List<androidx.window.extensions.layout.DisplayFeature!>);
     method public java.util.List<androidx.window.extensions.layout.DisplayFeature!> getDisplayFeatures();
diff --git a/window/window-extensions/api/public_plus_experimental_current.txt b/window/window-extensions/api/public_plus_experimental_current.txt
index 7f8cb1a..95519f1 100644
--- a/window/window-extensions/api/public_plus_experimental_current.txt
+++ b/window/window-extensions/api/public_plus_experimental_current.txt
@@ -2,8 +2,8 @@
 package androidx.window.extensions {
 
   public class WindowLibraryInfo {
-    method public int getApiLevel();
     method public static androidx.window.extensions.WindowLibraryInfo getInstance(android.content.Context);
+    method public int getVendorApiLevel();
   }
 
 }
@@ -25,12 +25,17 @@
     field public static final int TYPE_HINGE = 2; // 0x2
   }
 
-  public class WindowLayoutComponent {
+  public interface WindowLayoutComponent {
     method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method public static androidx.window.extensions.layout.WindowLayoutComponent? getInstance(android.content.Context);
     method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
   }
 
+  public class WindowLayoutComponentProvider {
+    method public static androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent(android.content.Context);
+    method public static boolean isWindowLayoutComponentAvailable();
+  }
+
   public class WindowLayoutInfo {
     ctor public WindowLayoutInfo(java.util.List<androidx.window.extensions.layout.DisplayFeature!>);
     method public java.util.List<androidx.window.extensions.layout.DisplayFeature!> getDisplayFeatures();
diff --git a/window/window-extensions/api/restricted_current.txt b/window/window-extensions/api/restricted_current.txt
index 7f8cb1a..95519f1 100644
--- a/window/window-extensions/api/restricted_current.txt
+++ b/window/window-extensions/api/restricted_current.txt
@@ -2,8 +2,8 @@
 package androidx.window.extensions {
 
   public class WindowLibraryInfo {
-    method public int getApiLevel();
     method public static androidx.window.extensions.WindowLibraryInfo getInstance(android.content.Context);
+    method public int getVendorApiLevel();
   }
 
 }
@@ -25,12 +25,17 @@
     field public static final int TYPE_HINGE = 2; // 0x2
   }
 
-  public class WindowLayoutComponent {
+  public interface WindowLayoutComponent {
     method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
     method public static androidx.window.extensions.layout.WindowLayoutComponent? getInstance(android.content.Context);
     method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
   }
 
+  public class WindowLayoutComponentProvider {
+    method public static androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent(android.content.Context);
+    method public static boolean isWindowLayoutComponentAvailable();
+  }
+
   public class WindowLayoutInfo {
     ctor public WindowLayoutInfo(java.util.List<androidx.window.extensions.layout.DisplayFeature!>);
     method public java.util.List<androidx.window.extensions.layout.DisplayFeature!> getDisplayFeatures();
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java b/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java
index 8f13143..0404625c 100644
--- a/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java
@@ -24,7 +24,7 @@
  * A class to return global information about the library. From this class you can get the
  * API level supported by the library.
  *
- * @see WindowLibraryInfo#getApiLevel() ()
+ * @see WindowLibraryInfo#getVendorApiLevel() ()
  */
 public class WindowLibraryInfo {
 
@@ -34,9 +34,12 @@
      * Returns the API level of the vendor library on the device. If the returned version is not
      * supported by the WindowManager library, then some functions may not be available or replaced
      * with stub implementations.
+     *
+     * The expected use case is for the WindowManager library to determine which APIs are
+     * available and wrap the API so that app developers do not need to deal with the complexity.
      * @return the API level supported by the library.
      */
-    public int getApiLevel() {
+    public int getVendorApiLevel() {
         return 1;
     }
 
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
index 23a2acc..dc71865 100644
--- a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
@@ -36,11 +36,9 @@
  * relevant logical areas.
  *
  * <p>This interface should be implemented by OEM and deployed to the target devices.
- *
+ * @see WindowLayoutComponentProvider
  */
-public class WindowLayoutComponent {
-
-    private WindowLayoutComponent() {}
+public interface WindowLayoutComponent {
 
     /**
      * Adds a listener interested in receiving updates to {@link WindowLayoutInfo}
@@ -48,18 +46,14 @@
      * @param consumer interested in receiving updates to {@link WindowLayoutInfo}
      */
     public void addWindowLayoutInfoListener(@NonNull Activity activity,
-            @NonNull Consumer<WindowLayoutInfo> consumer) {
-        throw new UnsupportedOperationException("Stub, replace with implementation.");
-    }
+            @NonNull Consumer<WindowLayoutInfo> consumer);
 
     /**
      * Removes a listener no longer interested in receiving updates.
      * @param consumer no longer interested in receiving updates to {@link WindowLayoutInfo}
      */
     public void removeWindowLayoutInfoListener(
-            @NonNull Consumer<WindowLayoutInfo> consumer) {
-        throw new UnsupportedOperationException("Stub, replace with implementation.");
-    }
+            @NonNull Consumer<WindowLayoutInfo> consumer);
 
     /**
      * Returns the OEM implementation of {@link WindowLayoutComponent} if it is supported on the
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponentProvider.java b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponentProvider.java
new file mode 100644
index 0000000..8e41db9
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponentProvider.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2021 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.window.extensions.layout;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.window.extensions.WindowLibraryInfo;
+
+/**
+ * A class to provide instances of {@link WindowLayoutComponent}. An OEM must implement
+ * {@link WindowLayoutComponentProvider#isWindowLayoutComponentAvailable()} and
+ * {@link WindowLayoutComponentProvider#getWindowLayoutComponent(Context)} for the core window
+ * library to support {@link DisplayFeature}s. Any implementation of
+ * {@link WindowLayoutComponent} must support the methods up to
+ * {@link WindowLibraryInfo#getApiLevel()}
+ */
+public class WindowLayoutComponentProvider {
+
+    private WindowLayoutComponentProvider() {}
+
+    /**
+     * Returns {@code true} if {@link WindowLayoutComponent} is present on the device,
+     * {@code false} otherwise.
+     */
+    public static boolean isWindowLayoutComponentAvailable() {
+        throw new UnsupportedOperationException("Stub, replace with implementation.");
+    }
+
+    /**
+     * Returns the OEM implementation of {@link WindowLayoutComponent} if it is supported on the
+     * device. The implementation must match the API level reported in
+     * {@link androidx.window.extensions.WindowLibraryInfo}. An
+     * {@link UnsupportedOperationException} will be thrown if the device does not support
+     * {@link WindowLayoutInfo}. Use
+     * {@link WindowLayoutComponentProvider#isWindowLayoutComponentAvailable()} to determine if
+     * {@link WindowLayoutComponent} is present.
+     * @return the OEM implementation of {@link WindowLayoutComponent}
+     */
+    @NonNull
+    public static WindowLayoutComponent getWindowLayoutComponent(@NonNull Context context) {
+        throw new UnsupportedOperationException("Stub, replace with implementation.");
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/layout/WindowInfoRepositoryImplTest.kt b/window/window/src/androidTest/java/androidx/window/layout/WindowInfoRepositoryImplTest.kt
index d73c471..b58eccf 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/WindowInfoRepositoryImplTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/WindowInfoRepositoryImplTest.kt
@@ -24,6 +24,7 @@
 import androidx.window.TestActivity
 import androidx.window.TestConfigChangeHandlingActivity
 import androidx.window.TestConsumer
+import androidx.window.layout.WindowMetricsCalculatorCompat.computeCurrentWindowMetrics
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
@@ -50,7 +51,7 @@
                 WindowMetricsCalculatorCompat,
                 FakeWindowBackend()
             )
-            val expected = WindowMetricsCalculatorCompat.computeCurrentWindowMetrics(testActivity)
+            val expected = computeCurrentWindowMetrics(testActivity)
             val consumer = TestConsumer<WindowMetrics>()
             testScope.launch {
                 repo.currentWindowMetrics.collect { consumer.accept(it) }
@@ -67,7 +68,7 @@
                 WindowMetricsCalculatorCompat,
                 FakeWindowBackend()
             )
-            val expected = WindowMetricsCalculatorCompat.computeCurrentWindowMetrics(testActivity)
+            val expected = computeCurrentWindowMetrics(testActivity)
             val consumer = TestConsumer<WindowMetrics>()
             testScope.launch {
                 repo.currentWindowMetrics.collect { consumer.accept(it) }
@@ -84,6 +85,7 @@
         testScope.runBlockingTest {
             val scenario = ActivityScenario.launch(TestConfigChangeHandlingActivity::class.java)
             val collector = TestConsumer<WindowMetrics>()
+            val expected = mutableListOf<WindowMetrics>()
             scenario.onActivity { activity ->
                 val repo = WindowInfoRepositoryImpl(
                     activity,
@@ -98,12 +100,15 @@
                 }
             }
             scenario.onActivity { activity ->
+                expected.add(computeCurrentWindowMetrics(activity))
                 activity.resetLayoutCounter()
                 activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                 activity.waitForLayout()
             }
-            scenario.onActivity {
+            scenario.onActivity { activity ->
+                expected.add(computeCurrentWindowMetrics(activity))
                 collector.assertValueCount(2)
+                collector.assertValues(*expected.toTypedArray())
             }
         }
 
diff --git a/window/window/src/main/java/androidx/window/layout/WindowInfoRepositoryImpl.kt b/window/window/src/main/java/androidx/window/layout/WindowInfoRepositoryImpl.kt
index b351b5e..3b596b3 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowInfoRepositoryImpl.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowInfoRepositoryImpl.kt
@@ -17,13 +17,13 @@
 package androidx.window.layout
 
 import android.app.Activity
-import android.content.ComponentCallbacks
 import android.content.Context
-import android.content.res.Configuration
+import android.view.View
 import androidx.core.util.Consumer
 import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flow
 
 /**
@@ -60,7 +60,7 @@
         get() {
             return configurationChanged {
                 windowMetricsCalculator.computeCurrentWindowMetrics(activity)
-            }
+            }.distinctUntilChanged()
         }
 
     private fun <T> configurationChanged(producer: () -> T): Flow<T> {
@@ -70,22 +70,19 @@
                 onBufferOverflow = DROP_OLDEST
             )
             val publish: () -> Unit = { channel.trySend(producer()) }
-            val configChangeObserver = object : ComponentCallbacks {
-                override fun onConfigurationChanged(newConfig: Configuration) {
-                    publish()
-                }
-
-                override fun onLowMemory() {
-                }
-            }
+            // TODO(b/199442549) switch back to ComponentCallbacks when possible
+            val configChangeObserver =
+                View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> publish() }
             publish()
-            activity.registerComponentCallbacks(configChangeObserver)
+            activity.window?.decorView
+                ?.addOnLayoutChangeListener(configChangeObserver)
             try {
                 for (item in channel) {
                     emit(item)
                 }
             } finally {
-                activity.unregisterComponentCallbacks(configChangeObserver)
+                activity.window?.decorView
+                    ?.removeOnLayoutChangeListener(configChangeObserver)
             }
         }
     }
diff --git a/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt b/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt
index 4007cc8..de6946a 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowMetrics.kt
@@ -45,6 +45,10 @@
     public val bounds: Rect
         get() = _bounds.toRect()
 
+    override fun toString(): String {
+        return "WindowMetrics { bounds: $bounds }"
+    }
+
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other == null || javaClass != other.javaClass) return false